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