View Javadoc
1 package jface.fodevelop; 2 3 import java.awt.Component; 4 import java.awt.Container; 5 import java.awt.FileDialog; 6 import java.awt.Font; 7 import java.awt.GridBagConstraints; 8 import java.awt.GridBagLayout; 9 import java.awt.Insets; 10 import java.awt.print.Printable; 11 import java.awt.print.PrinterException; 12 import java.awt.print.PrinterJob; 13 import java.io.BufferedInputStream; 14 import java.io.ByteArrayInputStream; 15 import java.io.ByteArrayOutputStream; 16 import java.io.FileInputStream; 17 import java.io.FileNotFoundException; 18 import java.io.InputStream; 19 import java.io.UnsupportedEncodingException; 20 21 import javax.swing.JButton; 22 import javax.swing.JFrame; 23 import javax.swing.JLabel; 24 import javax.swing.JScrollPane; 25 import javax.swing.JTabbedPane; 26 import javax.swing.JTextArea; 27 import javax.swing.text.JTextComponent; 28 import javax.xml.transform.Result; 29 import javax.xml.transform.Source; 30 import javax.xml.transform.Transformer; 31 import javax.xml.transform.TransformerFactory; 32 import javax.xml.transform.stream.StreamResult; 33 import javax.xml.transform.stream.StreamSource; 34 35 import jface.util.Strings; 36 import jface.util.dom4j.ObjectBuilder; 37 import jface.util.io.FileObserver; 38 import jface.util.swing.PreviewPanel; 39 import jface.vega.ApplicationManager; 40 41 import org.apache.avalon.framework.logger.ConsoleLogger; 42 import org.apache.commons.logging.Log; 43 import org.apache.commons.logging.LogFactory; 44 import org.apache.fop.apps.Driver; 45 import org.apache.fop.render.awt.AWTRenderer; 46 import org.dom4j.Document; 47 import org.dom4j.DocumentHelper; 48 import org.dom4j.io.OutputFormat; 49 import org.dom4j.io.XMLWriter; 50 import org.xml.sax.InputSource; 51 52 /*** 53 * @author <a href="mailto:powerpete@users.sf.net">Moritz Petersen</a> 54 * @version $Id: PreviewFrame.java,v 1.1 2003/07/13 17:26:11 powerpete Exp $ 55 */ 56 public class PreviewFrame extends JFrame 57 { 58 private static final Log LOG = LogFactory.getLog(PreviewFrame.class); 59 private static final Font OUTPUT_FONT = 60 new Font("Monospaced", Font.PLAIN, 11); 61 private static final Font SYSTEM_FONT = new Font("System", Font.PLAIN, 10); 62 63 public static PreviewFrame newInstance() 64 { 65 try 66 { 67 return (PreviewFrame) ObjectBuilder.build( 68 ApplicationManager 69 .getInstance() 70 .getConfiguration() 71 .getRootElement() 72 .element( 73 "preview-frame")); 74 } 75 catch (Exception e) 76 { 77 LOG.fatal("Unable to create new instance.", e); 78 } 79 return null; 80 } 81 82 private JTextComponent foView = new XmlArea(); 83 private JButton openXmlFileButton = new JButton(); 84 private JButton openXslFileButton = new JButton(); 85 private PreviewPanel preview = new PreviewPanel(); 86 private PreviewData previewData = new PreviewData(); 87 private Printable printable; 88 private PrinterJob printerJob = PrinterJob.getPrinterJob(); 89 private JTabbedPane tabs = new JTabbedPane(); 90 private JLabel xmlFileLabel = new JLabel(); 91 private JLabel xslFileLabel = new JLabel(); 92 93 private AWTRenderer renderer; 94 95 /*** 96 * @todo drag and drop for file import 97 * @todo better reuse of driver and renderer 98 * @todo pdf export (including reuse of components). 99 */ 100 public PreviewFrame() 101 { 102 super(ApplicationManager.getInstance().getApplicationName()); 103 104 // driver.setLogger(new ConsoleLogger(ConsoleLogger.LEVEL_WARN)); 105 // driver.setRenderer(renderer); 106 107 previewData.setPageFormat(printerJob.defaultPage()); 108 109 openXmlFileButton.setFont(SYSTEM_FONT); 110 openXmlFileButton.setAction(new OpenXmlAction()); 111 openXslFileButton.setFont(SYSTEM_FONT); 112 openXslFileButton.setAction(new OpenXslAction()); 113 xmlFileLabel.setFont(SYSTEM_FONT); 114 xslFileLabel.setFont(SYSTEM_FONT); 115 foView.setEditable(false); 116 foView.setFont(OUTPUT_FONT); 117 tabs.add( 118 "XSL FO", 119 new JScrollPane( 120 foView, 121 JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 122 JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS)); 123 tabs.add("Vorschau", preview); 124 //tabs.setSelectedIndex(1); 125 126 GridBagLayout layout = new GridBagLayout(); 127 GridBagConstraints cButton = new GridBagConstraints(); 128 GridBagConstraints cLabel = new GridBagConstraints(); 129 GridBagConstraints cPreview = new GridBagConstraints(); 130 131 cButton.weightx = 0.0; 132 cButton.ipadx = 2; 133 cButton.ipady = 2; 134 cButton.insets = new Insets(2, 20, 2, 2); 135 cLabel.gridwidth = GridBagConstraints.REMAINDER; 136 cLabel.fill = GridBagConstraints.HORIZONTAL; 137 cLabel.anchor = GridBagConstraints.WEST; 138 cLabel.weightx = 1.0; 139 cLabel.ipadx = 2; 140 cLabel.ipady = 2; 141 cLabel.insets = new Insets(2, 20, 2, 2); 142 cPreview.gridwidth = GridBagConstraints.REMAINDER; 143 cPreview.fill = GridBagConstraints.BOTH; 144 cPreview.weightx = 1.0; 145 cPreview.weighty = 1.0; 146 147 Container contentPane = getContentPane(); 148 contentPane.setLayout(layout); 149 150 add(layout, cButton, contentPane, openXmlFileButton); 151 add(layout, cLabel, contentPane, xmlFileLabel); 152 add(layout, cButton, contentPane, openXslFileButton); 153 add(layout, cLabel, contentPane, xslFileLabel); 154 add(layout, cPreview, contentPane, tabs); 155 156 pack(); 157 setSize(600, 500); 158 refresh(); 159 } 160 161 private void add( 162 GridBagLayout layout, 163 GridBagConstraints constraints, 164 Container container, 165 Component component) 166 { 167 layout.setConstraints(component, constraints); 168 container.add(component); 169 } 170 171 public PreviewData getPreviewData() 172 { 173 return previewData; 174 } 175 176 public void refresh() 177 { 178 String xmlFilename = previewData.getXmlFilename(); 179 String xslFilename = previewData.getXslFilename(); 180 181 xmlFileLabel.setText(shrink(xmlFilename)); 182 xslFileLabel.setText(shrink(xslFilename)); 183 184 if (Strings.isEmpty(xslFilename, true) 185 || Strings.isEmpty(xmlFilename, true)) 186 { 187 return; 188 } 189 190 preview.setPageFormat(previewData.getPageFormat()); 191 //preview.setPageable(printable); 192 193 try 194 { 195 Source xsl = createSource(xslFilename); 196 Transformer transformer = 197 TransformerFactory.newInstance().newTransformer(xsl); 198 Source xml = createSource(xmlFilename); 199 ByteArrayOutputStream fopBuffer = new ByteArrayOutputStream(); 200 Result fop = new StreamResult(fopBuffer); 201 transformer.transform(xml, fop); 202 String generatedFo = new String(fopBuffer.toByteArray()); 203 foView.setText(generatedFo); 204 previewData.setGeneratedFo(generatedFo); 205 InputSource fopSource = 206 new InputSource( 207 new ByteArrayInputStream(fopBuffer.toByteArray())); 208 renderer = new AWTRenderer(null); 209 Driver driver = new Driver(); 210 driver.setLogger(new ConsoleLogger(ConsoleLogger.LEVEL_WARN)); 211 driver.setRenderer(renderer); 212 driver.setInputSource(fopSource); 213 driver.run(); 214 // Printable scaledRenderer = new ScalingPrintable(renderer); 215 preview.setPageable(renderer); 216 217 preview.repaint(); 218 } 219 catch (Exception e) 220 { 221 LOG.fatal("Error rendering preview.", e); 222 } 223 } 224 225 /*** 226 * @param string 227 * @return 228 */ 229 private Source createSource(String filename) throws FileNotFoundException 230 { 231 InputStream in = new FileInputStream(filename); 232 in = new BufferedInputStream(in); 233 return new StreamSource(in); 234 } 235 236 /*** 237 * @param string 238 * @return 239 */ 240 private String shrink(String str) 241 { 242 return Strings.shrink(str, 50, "..."); 243 } 244 245 public void setFoViewText(String text) 246 { 247 tabs.setTitleAt(0, text); 248 } 249 250 public void setOpenXmlFileButtonText(String text) 251 { 252 openXmlFileButton.setText(text); 253 } 254 255 public void setOpenXslFileButtonText(String text) 256 { 257 LOG.debug("xsl text = " + text); 258 openXslFileButton.setText(text); 259 } 260 261 public void setPreviewText(String text) 262 { 263 tabs.setTitleAt(1, text); 264 } 265 266 public void showPageSetupDialog() 267 { 268 previewData.setPageFormat( 269 printerJob.pageDialog(previewData.getPageFormat())); 270 } 271 272 public void showPrintDialog() throws PrinterException 273 { 274 if (printerJob.printDialog()) 275 { 276 printerJob.setPageable(renderer); 277 printerJob.print(); 278 } 279 } 280 281 protected String showFileDialog(String file, int mode) 282 { 283 FileDialog dialog = new FileDialog(this); 284 dialog.setMode(mode); 285 dialog.setFile(file); 286 dialog.show(); 287 String newFile = dialog.getFile(); 288 if (newFile == null) 289 { 290 return null; 291 } 292 if (mode == FileDialog.LOAD) 293 { 294 FileObserver observer = FileObserver.getInstance(); 295 observer.removeFileChangeListener(file); 296 } 297 return dialog.getDirectory() + newFile; 298 } 299 300 private class XmlArea extends JTextArea 301 { 302 private OutputFormat format; 303 304 private ByteArrayOutputStream out; 305 306 private XMLWriter writer; 307 308 private XmlArea() 309 { 310 format = OutputFormat.createPrettyPrint(); 311 format.setIndent(true); 312 format.setIndent(" "); 313 out = new ByteArrayOutputStream(); 314 try 315 { 316 writer = new XMLWriter(out, format); 317 } 318 catch (UnsupportedEncodingException e) 319 { 320 LOG.fatal("Error creating xml writer.", e); 321 } 322 } 323 324 public void setText(String text) 325 { 326 try 327 { 328 Document doc = DocumentHelper.parseText(text); 329 out.reset(); 330 writer.write(doc); 331 super.setText(out.toString()); 332 } 333 catch (Exception e) 334 { 335 LOG.warn("Unable to pretty print xml. " + e.getMessage()); 336 super.setText(text); 337 } 338 } 339 } 340 }

This page was automatically generated by Maven