02427f2cb4a08f783d54b4e18ef6cb9e97784a74
[jalview.git] / src / jalview / util / ImageMaker.java
1 package jalview.util;\r
2 \r
3 import java.awt.event.ActionEvent;\r
4 import java.awt.RenderingHints;\r
5 import javax.imageio.ImageIO;\r
6 import org.jibble.epsgraphics.EpsGraphics2D;\r
7 import jalview.gui.EPSOptions;\r
8 import java.awt.Graphics2D;\r
9 import java.io.*;\r
10 import java.awt.image.BufferedImage;\r
11 import java.awt.Graphics;\r
12 import jalview.io.*;\r
13 import java.awt.*;\r
14 \r
15 \r
16 public class ImageMaker\r
17 {\r
18   public static final int EPS = 0;\r
19   public static final int PNG = 1;\r
20   int type = -1;\r
21 \r
22   EpsGraphics2D pg;\r
23   Graphics graphics;\r
24   FileOutputStream out;\r
25   BufferedImage bi;\r
26 \r
27   public ImageMaker(Component parent, int type, String title,\r
28                            int width, int height, File file, String EPStitle)\r
29   {\r
30     this.type = type;\r
31 \r
32     if (file == null)\r
33     {\r
34       JalviewFileChooser chooser;\r
35       chooser = type == EPS ? getEPSChooser() : getPNGChooser();\r
36 \r
37       chooser.setFileView(new jalview.io.JalviewFileView());\r
38       chooser.setDialogTitle(title);\r
39       chooser.setToolTipText("Save");\r
40 \r
41       int value = chooser.showSaveDialog(parent);\r
42 \r
43       if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
44       {\r
45         jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
46                                       chooser.getSelectedFile().getParent());\r
47 \r
48         file = chooser.getSelectedFile();\r
49       }\r
50     }\r
51 \r
52     try\r
53     {\r
54       out = new FileOutputStream(file);\r
55 \r
56       if (type == EPS)\r
57         setupEPS(width, height, EPStitle);\r
58       else\r
59         setupPNG(width, height);\r
60     }\r
61     catch (Exception ex)\r
62     {\r
63       System.out.println("Error creating " + (type == EPS ? "EPS" : "PNG") +\r
64                          " file.");\r
65     }\r
66   }\r
67 \r
68   public Graphics getGraphics()\r
69   {\r
70     return graphics;\r
71   }\r
72 \r
73 \r
74   void setupPNG(int width, int height)\r
75   {\r
76         bi = new BufferedImage(width, height,\r
77                 BufferedImage.TYPE_INT_RGB);\r
78         graphics  = bi.getGraphics();\r
79         Graphics2D ig2 = (Graphics2D) graphics;\r
80         ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
81                                  RenderingHints.VALUE_ANTIALIAS_ON);\r
82   }\r
83 \r
84   public void writeImage()\r
85   {\r
86     try{\r
87       switch(type)\r
88       {\r
89         case EPS:\r
90           pg.flush();\r
91           pg.close();\r
92           break;\r
93         case PNG:\r
94           ImageIO.write(bi, "png", out);\r
95           out.close();\r
96           break;\r
97       }\r
98     }\r
99     catch (Exception ex)\r
100     {\r
101         ex.printStackTrace();\r
102     }\r
103   }\r
104 \r
105   void setupEPS(int width, int height, String title)\r
106   {\r
107     boolean accurateText = true;\r
108 \r
109     String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",\r
110         "Prompt each time");\r
111 \r
112     // If we need to prompt, and if the GUI is visible then\r
113     // Prompt for EPS rendering style\r
114     if (renderStyle.equalsIgnoreCase("Prompt each time")\r
115         && !\r
116         (System.getProperty("java.awt.headless") != null\r
117          && System.getProperty("java.awt.headless").equals("true")))\r
118     {\r
119       EPSOptions eps = new EPSOptions();\r
120       renderStyle = eps.getValue();\r
121 \r
122       if (renderStyle == null || eps.cancelled)\r
123         return;\r
124     }\r
125 \r
126     if (renderStyle.equalsIgnoreCase("text"))\r
127     {\r
128       accurateText = false;\r
129     }\r
130 \r
131     try   {\r
132       pg = new EpsGraphics2D(title, out, 0, 0, width,\r
133                                            height);\r
134       Graphics2D ig2 = (Graphics2D) pg;\r
135       ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
136                            RenderingHints.VALUE_ANTIALIAS_ON);\r
137 \r
138       pg.setAccurateTextMode(accurateText);\r
139 \r
140       graphics = pg;\r
141     }\r
142     catch (Exception ex) {  }\r
143   }\r
144 \r
145 \r
146   JalviewFileChooser getPNGChooser()\r
147   {\r
148     return new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
149         "LAST_DIRECTORY"), new String[]\r
150                                              {"png"},\r
151                                              new String[]\r
152                                              {"Portable network graphics"},\r
153                                              "Portable network graphics");\r
154   }\r
155 \r
156   JalviewFileChooser getEPSChooser()\r
157   {\r
158     return new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
159         "LAST_DIRECTORY"), new String[]\r
160                                              {"eps"},\r
161                                              new String[]\r
162                                              {"Encapsulated Postscript"},\r
163                                              "Encapsulated Postscript");\r
164   }\r
165 }\r