2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import jalview.bin.Jalview;
24 import jalview.gui.EPSOptions;
25 import jalview.gui.IProgressIndicator;
26 import jalview.gui.SVGOptions;
27 import jalview.io.JalviewFileChooser;
29 import java.awt.Component;
30 import java.awt.Graphics;
31 import java.awt.Graphics2D;
32 import java.awt.RenderingHints;
33 import java.awt.image.BufferedImage;
34 import java.awt.print.PageFormat;
35 import java.awt.print.Paper;
37 import java.io.FileOutputStream;
39 import javax.imageio.ImageIO;
41 import org.jfree.graphics2d.svg.SVGGraphics2D;
42 import org.jfree.graphics2d.svg.SVGHints;
43 import org.jibble.epsgraphics.EpsGraphics2D;
45 import gnu.jpdf.PDFJob;
47 public class ImageMaker
49 public static final String SVG_DESCRIPTION = "Scalable Vector Graphics";
51 public static final String SVG_EXTENSION = "svg";
53 public static final String EPS_DESCRIPTION = "Encapsulated Postscript";
55 public static final String EPS_EXTENSION = "eps";
57 public static final String PNG_EXTENSION = "png";
59 public static final String PNG_DESCRIPTION = "Portable network graphics";
61 public static final String PDF_EXTENSION = "pdf";
63 public static final String PDF_DESCRIPTION = "Portable Document Format";
65 public static final String HTML_EXTENSION = "html";
67 public static final String HTML_DESCRIPTION = "Hypertext Markup Language";
82 private IProgressIndicator pIndicator;
84 private long pSessionId;
86 private boolean headless;
88 private PDFJob pdfjob;
92 EPS("EPS", MessageManager.getString("label.eps_file"), getEPSChooser()),
93 PNG("PNG", MessageManager.getString("label.png_image"),
95 SVG("SVG", "SVG", getSVGChooser()),
96 PDF("PDF","PDF",getPDFChooser());
98 private JalviewFileChooser chooser;
102 private String label;
104 TYPE(String name, String label, JalviewFileChooser chooser)
108 this.chooser = chooser;
111 public String getName()
116 public JalviewFileChooser getChooser()
121 public String getLabel()
128 public ImageMaker(Component parent, TYPE type, String title, int width,
129 int height, File file, String fileTitle,
130 IProgressIndicator pIndicator, long pSessionId, boolean headless)
132 this.pIndicator = pIndicator;
134 this.pSessionId = pSessionId;
135 this.headless = headless;
138 setProgressMessage(MessageManager.formatMessage(
139 "status.waiting_for_user_to_select_output_file", type.name));
140 JalviewFileChooser chooser;
141 chooser = type.getChooser();
142 chooser.setFileView(new jalview.io.JalviewFileView());
143 chooser.setDialogTitle(title);
144 chooser.setToolTipText(MessageManager.getString("action.save"));
145 int value = chooser.showSaveDialog(parent);
147 if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
149 jalview.bin.Cache.setProperty("LAST_DIRECTORY",
150 chooser.getSelectedFile().getParent());
151 file = chooser.getSelectedFile();
155 setProgressMessage(MessageManager.formatMessage(
156 "status.cancelled_image_export_operation", type.name));
164 out = new FileOutputStream(file);
165 setProgressMessage(null);
166 setProgressMessage(MessageManager.formatMessage(
167 "status.exporting_alignment_as_x_file", type.getName()));
168 if (type == TYPE.SVG)
170 setupSVG(width, height, fileTitle);
172 else if (type == TYPE.EPS)
174 setupEPS(width, height, fileTitle);
176 else if (type == TYPE.PNG)
178 setupPNG(width, height);
180 else if (type == TYPE.PDF)
182 setupPDF(width, height, fileTitle);
185 } catch (Exception ex)
187 System.out.println("Error creating " + type.getName() + " file.");
189 setProgressMessage(MessageManager
190 .formatMessage("info.error_creating_file", type.getName()));
195 public Graphics getGraphics()
200 public void writeImage()
211 String svgData = ((SVGGraphics2D) getGraphics()).getSVGDocument();
212 out.write(svgData.getBytes());
217 ImageIO.write(bi, PNG_EXTENSION, out);
226 } catch (Exception ex)
228 ex.printStackTrace();
232 void setupEPS(int width, int height, String title)
234 boolean accurateText = true;
236 String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",
239 // If we need to prompt, and if the GUI is visible then
240 // Prompt for EPS rendering style
241 if (renderStyle.equalsIgnoreCase("Prompt each time")
242 && !(System.getProperty("java.awt.headless") != null && System
243 .getProperty("java.awt.headless").equals("true")))
245 EPSOptions eps = new EPSOptions();
246 renderStyle = eps.getValue();
248 if (renderStyle == null || eps.cancelled)
250 setProgressMessage(MessageManager.formatMessage(
251 "status.cancelled_image_export_operation", "EPS"));
256 if (renderStyle.equalsIgnoreCase("text"))
258 accurateText = false;
263 pg = new EpsGraphics2D(title, out, 0, 0, width, height);
265 ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
266 RenderingHints.VALUE_ANTIALIAS_ON);
268 pg.setAccurateTextMode(accurateText);
271 setProgressMessage(MessageManager
272 .formatMessage("status.export_complete", type.getName()));
273 } catch (Exception ex)
278 void setupPDF(int width, int height, String title)
280 boolean accurateText = true;
282 // String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",
283 // "Prompt each time");
285 // // If we need to prompt, and if the GUI is visible then
286 // // Prompt for EPS rendering style
287 // if (renderStyle.equalsIgnoreCase("Prompt each time")
288 // && !(System.getProperty("java.awt.headless") != null && System
289 // .getProperty("java.awt.headless").equals("true")))
291 // EPSOptions eps = new EPSOptions();
292 // renderStyle = eps.getValue();
294 // if (renderStyle == null || eps.cancelled)
296 // setProgressMessage(MessageManager.formatMessage(
297 // "status.cancelled_image_export_operation", "EPS"));
302 // if (renderStyle.equalsIgnoreCase("text"))
304 // accurateText = false;
309 pdfjob = new PDFJob(out, title);
311 Paper paper = new Paper();
312 paper.setSize(width, height);
313 PageFormat pf = new PageFormat();
315 graphics = pdfjob.getGraphics(pf);
316 setProgressMessage(MessageManager
317 .formatMessage("status.export_complete", type.getName()));
318 } catch (Exception ex)
322 void setupPNG(int width, int height)
324 bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
325 graphics = bi.getGraphics();
326 Graphics2D ig2 = (Graphics2D) graphics;
327 ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
328 RenderingHints.VALUE_ANTIALIAS_ON);
329 setProgressMessage(MessageManager
330 .formatMessage("status.export_complete", type.getName()));
334 void setupSVG(int width, int height, String title)
337 g2 = new SVGGraphics2D(width, height);
340 String renderStyle = jalview.bin.Cache.getDefault("SVG_RENDERING",
343 // If we need to prompt, and if the GUI is visible then
344 // Prompt for EPS rendering style
345 if (renderStyle.equalsIgnoreCase("Prompt each time")
346 && !(System.getProperty("java.awt.headless") != null && System
347 .getProperty("java.awt.headless").equals("true")))
349 SVGOptions svgOption = new SVGOptions();
350 renderStyle = svgOption.getValue();
352 if (renderStyle == null || svgOption.cancelled)
354 setProgressMessage(MessageManager.formatMessage(
355 "status.cancelled_image_export_operation", "SVG"));
360 if (renderStyle.equalsIgnoreCase("Lineart"))
362 ig2.setRenderingHint(SVGHints.KEY_DRAW_STRING_TYPE,
363 SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR);
366 setProgressMessage(MessageManager
367 .formatMessage("status.export_complete", type.getName()));
371 static JalviewFileChooser getPNGChooser()
373 if (Jalview.isHeadlessMode())
377 return new JalviewFileChooser(PNG_EXTENSION, PNG_DESCRIPTION);
380 static JalviewFileChooser getPDFChooser()
382 if (Jalview.isHeadlessMode())
386 return new JalviewFileChooser(PDF_EXTENSION, PDF_DESCRIPTION);
389 static JalviewFileChooser getEPSChooser()
391 if (Jalview.isHeadlessMode())
395 return new JalviewFileChooser(EPS_EXTENSION, EPS_DESCRIPTION);
398 private void setProgressMessage(String message)
400 if (pIndicator != null && !headless)
402 pIndicator.setProgressBar(message, pSessionId);
406 static JalviewFileChooser getSVGChooser()
408 if (Jalview.isHeadlessMode())
412 return new JalviewFileChooser(SVG_EXTENSION, SVG_DESCRIPTION);