header updated
[jalview.git] / src / jalview / util / ImageMaker.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.util;\r
20 \r
21 import java.awt.event.ActionEvent;\r
22 import java.awt.RenderingHints;\r
23 import javax.imageio.ImageIO;\r
24 import org.jibble.epsgraphics.EpsGraphics2D;\r
25 import jalview.gui.EPSOptions;\r
26 import java.awt.Graphics2D;\r
27 import java.io.*;\r
28 import java.awt.image.BufferedImage;\r
29 import java.awt.Graphics;\r
30 import jalview.io.*;\r
31 import java.awt.*;\r
32 \r
33 \r
34 public class ImageMaker\r
35 {\r
36   public static final int EPS = 0;\r
37   public static final int PNG = 1;\r
38   int type = -1;\r
39 \r
40   EpsGraphics2D pg;\r
41   Graphics graphics;\r
42   FileOutputStream out;\r
43   BufferedImage bi;\r
44 \r
45   public ImageMaker(Component parent, int type, String title,\r
46                            int width, int height, File file, String EPStitle)\r
47   {\r
48     this.type = type;\r
49 \r
50     if (file == null)\r
51     {\r
52       JalviewFileChooser chooser;\r
53       chooser = type == EPS ? getEPSChooser() : getPNGChooser();\r
54 \r
55       chooser.setFileView(new jalview.io.JalviewFileView());\r
56       chooser.setDialogTitle(title);\r
57       chooser.setToolTipText("Save");\r
58 \r
59       int value = chooser.showSaveDialog(parent);\r
60 \r
61       if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
62       {\r
63         jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
64                                       chooser.getSelectedFile().getParent());\r
65 \r
66         file = chooser.getSelectedFile();\r
67       }\r
68     }\r
69 \r
70     if(file!=null)\r
71     {\r
72       try\r
73       {\r
74         out = new FileOutputStream(file);\r
75 \r
76         if (type == EPS)\r
77           setupEPS(width, height, EPStitle);\r
78         else\r
79           setupPNG(width, height);\r
80       }\r
81       catch (Exception ex)\r
82       {\r
83         System.out.println("Error creating " + (type == EPS ? "EPS" : "PNG") +\r
84                            " file.");\r
85       }\r
86     }\r
87   }\r
88 \r
89   public Graphics getGraphics()\r
90   {\r
91     return graphics;\r
92   }\r
93 \r
94 \r
95   void setupPNG(int width, int height)\r
96   {\r
97         bi = new BufferedImage(width, height,\r
98                 BufferedImage.TYPE_INT_RGB);\r
99         graphics  = bi.getGraphics();\r
100         Graphics2D ig2 = (Graphics2D) graphics;\r
101         ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
102                                  RenderingHints.VALUE_ANTIALIAS_ON);\r
103   }\r
104 \r
105   public void writeImage()\r
106   {\r
107     try{\r
108       switch(type)\r
109       {\r
110         case EPS:\r
111           pg.flush();\r
112           pg.close();\r
113           break;\r
114         case PNG:\r
115           ImageIO.write(bi, "png", out);\r
116           out.close();\r
117           break;\r
118       }\r
119     }\r
120     catch (Exception ex)\r
121     {\r
122         ex.printStackTrace();\r
123     }\r
124   }\r
125 \r
126   void setupEPS(int width, int height, String title)\r
127   {\r
128     boolean accurateText = true;\r
129 \r
130     String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",\r
131         "Prompt each time");\r
132 \r
133     // If we need to prompt, and if the GUI is visible then\r
134     // Prompt for EPS rendering style\r
135     if (renderStyle.equalsIgnoreCase("Prompt each time")\r
136         && !\r
137         (System.getProperty("java.awt.headless") != null\r
138          && System.getProperty("java.awt.headless").equals("true")))\r
139     {\r
140       EPSOptions eps = new EPSOptions();\r
141       renderStyle = eps.getValue();\r
142 \r
143       if (renderStyle == null || eps.cancelled)\r
144         return;\r
145     }\r
146 \r
147     if (renderStyle.equalsIgnoreCase("text"))\r
148     {\r
149       accurateText = false;\r
150     }\r
151 \r
152     try   {\r
153       pg = new EpsGraphics2D(title, out, 0, 0, width,\r
154                                            height);\r
155       Graphics2D ig2 = (Graphics2D) pg;\r
156       ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
157                            RenderingHints.VALUE_ANTIALIAS_ON);\r
158 \r
159       pg.setAccurateTextMode(accurateText);\r
160 \r
161       graphics = pg;\r
162     }\r
163     catch (Exception ex) {  }\r
164   }\r
165 \r
166 \r
167   JalviewFileChooser getPNGChooser()\r
168   {\r
169     return new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
170         "LAST_DIRECTORY"), new String[]\r
171                                              {"png"},\r
172                                              new String[]\r
173                                              {"Portable network graphics"},\r
174                                              "Portable network graphics");\r
175   }\r
176 \r
177   JalviewFileChooser getEPSChooser()\r
178   {\r
179     return new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
180         "LAST_DIRECTORY"), new String[]\r
181                                              {"eps"},\r
182                                              new String[]\r
183                                              {"Encapsulated Postscript"},\r
184                                              "Encapsulated Postscript");\r
185   }\r
186 }\r