JAL-2852 EPS saving code ported from TreePanel to Aptx.
[jalview.git] / src / jalview / ext / archaeopteryx / AptxFrame.java
1 package jalview.ext.archaeopteryx;
2
3 import jalview.bin.Cache;
4 import jalview.ext.treeviewer.ExternalTreeControlsI;
5 import jalview.ext.treeviewer.ExternalTreeFrame;
6 import jalview.ext.treeviewer.ExternalTreeI;
7 import jalview.ext.treeviewer.ExternalTreePanel;
8 import jalview.gui.Desktop;
9 import jalview.gui.EPSOptions;
10 import jalview.io.JalviewFileChooser;
11 import jalview.io.JalviewFileView;
12 import jalview.util.ImageMaker;
13 import jalview.util.MessageManager;
14
15 import java.awt.Component;
16 import java.awt.Container;
17 import java.awt.Dimension;
18 import java.awt.Event;
19 import java.awt.Font;
20 import java.awt.Image;
21 import java.awt.MenuComponent;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.ActionListener;
24 import java.io.FileOutputStream;
25
26 import javax.accessibility.AccessibleContext;
27 import javax.swing.JLayeredPane;
28 import javax.swing.JMenu;
29 import javax.swing.JMenuBar;
30 import javax.swing.JMenuItem;
31 import javax.swing.JRootPane;
32 import javax.swing.JSeparator;
33 import javax.swing.event.InternalFrameListener;
34
35 import org.forester.archaeopteryx.MainFrame;
36 import org.jibble.epsgraphics.EpsGraphics2D;
37
38 public class AptxFrame implements ExternalTreeFrame
39 {
40   private final MainFrame aptxFrame;
41
42   private ExternalTreePanel aptxPanel;
43
44   private ExternalTreeControlsI aptxControls;
45
46   public AptxFrame(MainFrame aptx)
47   {
48     aptxFrame = aptx;
49     aptxPanel = new AptxTreePanel(
50             aptxFrame.getMainPanel().getCurrentTreePanel());
51     aptxControls = new AptxControlPanel(
52             aptxFrame.getMainPanel().getControlPanel());
53     adaptAptxGui(aptxFrame);
54
55   }
56   /**
57    * Hides certain redundant Archaeopteryx GUI elements such as the menu items
58    * for reading in trees and adds extra items related to Jalview such as the
59    * tree sorting item.
60    * 
61    * 
62    * @param aptxFrame
63    */
64   private void adaptAptxGui(MainFrame aptxFrame)
65   {
66     JMenuBar frameBar = aptxFrame.getJMenuBar();
67     boolean epsAdded = false;
68     for (int i = 0; i < frameBar.getMenuCount();i++) {
69       JMenu menu = frameBar.getMenu(i);
70       int menuCount = menu.getMenuComponentCount();
71
72       if (menu.getText().contains("File"))
73       {
74         // hide all "Read from ..." and "New" menu items and any Separators that
75         // come directly after them
76         Component previousComp = null;
77         for (int x = 0; x < menuCount; x++)
78         {
79           Component menuItem = menu.getMenuComponent(x);
80           if (previousComp instanceof JMenuItem)
81           {
82             JMenuItem previousMenuItem = (JMenuItem) previousComp;
83             if (previousMenuItem.getText().startsWith("Read")
84                     || previousMenuItem.getText()
85                             .startsWith("New")
86                     || previousMenuItem.getText()
87                             .startsWith("Close Tab"))
88             {
89               previousComp.setVisible(false);
90
91               if (menuItem instanceof JSeparator)
92               {
93                 menuItem.setVisible(false);
94               }
95
96             }
97
98             if ((!epsAdded) && previousMenuItem.getText()
99                     .startsWith("Export to"))
100             {
101               JMenuItem exportEps = new JMenuItem("Export to EPS file...");
102               menu.add(exportEps, x);
103               exportEps.addActionListener(new ActionListener()
104               {
105
106                 @Override
107                 public void actionPerformed(ActionEvent e)
108                 {
109                   epsTree_actionPerformed(e);
110
111                 }
112                 
113               });
114               epsAdded = true;
115
116             }
117           }
118           previousComp = menuItem;
119         }
120       }
121       else if (menu.getText().contains("Inference"))
122       {
123         menu.setVisible(false);
124       }
125       else if (menu.getText().contains("View"))
126       {
127         menu.addSeparator();
128         JMenuItem sortByTree = new JMenuItem("Sort alignment by tree");
129         JMenuItem refreshJalview = new JMenuItem(
130                 "Filter alignment to show only currently visible sequences");
131
132         refreshJalview.setFont(menu.getFont());
133
134         menu.add(sortByTree);
135         menu.add(refreshJalview);
136
137         sortByTree.setFont(menu.getFont());
138         refreshJalview.addActionListener(new ActionListener()
139         {
140
141           @Override
142           public void actionPerformed(ActionEvent e)
143           {
144             // TODO Auto-generated method stub
145
146           }
147
148         });
149
150
151       }
152
153     }
154     aptxFrame.validate();
155   }
156
157   public void epsTree_actionPerformed(ActionEvent e)
158   {
159     boolean accurateText = true;
160
161     String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",
162             "Prompt each time");
163
164     // If we need to prompt, and if the GUI is visible then
165     // Prompt for EPS rendering style
166     if (renderStyle.equalsIgnoreCase("Prompt each time")
167             && !(System.getProperty("java.awt.headless") != null && System
168                     .getProperty("java.awt.headless").equals("true")))
169     {
170       EPSOptions eps = new EPSOptions();
171       renderStyle = eps.getValue();
172
173       if (renderStyle == null || eps.cancelled)
174       {
175         return;
176       }
177
178     }
179
180     if (renderStyle.equalsIgnoreCase("text"))
181     {
182       accurateText = false;
183     }
184
185     int width = getTreePanel().getWidth();
186     int height = getTreePanel().getHeight();
187
188     try
189     {
190       JalviewFileChooser chooser = new JalviewFileChooser(
191               ImageMaker.EPS_EXTENSION, ImageMaker.EPS_EXTENSION);
192       chooser.setFileView(new JalviewFileView());
193       chooser.setDialogTitle(
194               MessageManager.getString("label.create_eps_from_tree"));
195       chooser.setToolTipText(MessageManager.getString("action.save"));
196
197       int value = chooser.showSaveDialog(aptxFrame);
198
199       if (value != JalviewFileChooser.APPROVE_OPTION)
200       {
201         return;
202       }
203
204       Cache.setProperty("LAST_DIRECTORY",
205               chooser.getSelectedFile().getParent());
206
207       FileOutputStream out = new FileOutputStream(
208               chooser.getSelectedFile());
209       EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width,
210               height);
211
212       pg.setAccurateTextMode(accurateText);
213
214       getTreePanel().paintToFile(pg, width, height);
215
216       pg.flush();
217       pg.close();
218     } catch (Exception ex)
219     {
220       ex.printStackTrace();
221     }
222   }
223   @Override
224   public ExternalTreePanel getTreePanel()
225   {
226     return aptxPanel;
227   }
228
229   @Override
230   public ExternalTreeI getTree()
231   {
232     return aptxPanel.getTree();
233   }
234
235   @Override
236   public void checkMultipleTrees()
237   {
238     aptxFrame.activateSaveAllIfNeeded();
239
240   }
241
242   @Override
243   public int getNumberOfTrees()
244   {
245     return aptxFrame.getMainPanel().getTabbedPane().getTabCount();
246   }
247
248   @Override
249   public ExternalTreeControlsI getTreeControls()
250   {
251     return aptxControls;
252   }
253
254   @Override
255   public AccessibleContext getAccessibleContext()
256   {
257     return aptxFrame.getAccessibleContext();
258   }
259
260   @Override
261   public JRootPane getRootPane()
262   {
263     return aptxFrame.getRootPane();
264   }
265
266   @Override
267   public void setContentPane(Container contentPane)
268   {
269     aptxFrame.setContentPane(contentPane);
270
271   }
272
273   @Override
274   public Container getContentPane()
275   {
276     return aptxFrame.getContentPane();
277   }
278
279   @Override
280   public void setLayeredPane(JLayeredPane layeredPane)
281   {
282     aptxFrame.setLayeredPane(layeredPane);
283
284   }
285
286   @Override
287   public JLayeredPane getLayeredPane()
288   {
289     return aptxFrame.getLayeredPane();
290   }
291
292   @Override
293   public void setGlassPane(Component glassPane)
294   {
295     aptxFrame.setGlassPane(glassPane);
296
297   }
298
299   @Override
300   public Component getGlassPane()
301   {
302     return aptxFrame.getGlassPane();
303   }
304
305   @Override
306   public boolean imageUpdate(Image img, int infoflags, int x, int y,
307           int width, int height)
308   {
309     return aptxFrame.imageUpdate(img, infoflags, x, y, width, height);
310   }
311
312   @Override
313   public Font getFont()
314   {
315     return aptxFrame.getFont();
316   }
317
318   @Override
319   public void remove(MenuComponent comp)
320   {
321     aptxFrame.remove(comp);
322
323   }
324
325   @Deprecated
326   @Override
327   public boolean postEvent(Event evt)
328   {
329     return aptxFrame.postEvent(evt);
330   }
331
332   @Override
333   public void addFrameListener(InternalFrameListener listener)
334   {
335     aptxFrame.addInternalFrameListener(listener);
336
337   }
338
339   @Override
340   public void removeFrameListener(InternalFrameListener listener)
341   {
342     aptxFrame.removeInternalFrameListener(listener);
343
344   }
345
346   @Override
347   public InternalFrameListener[] getFrameListeners()
348   {
349     return aptxFrame.getInternalFrameListeners();
350
351   }
352
353   @Override
354   public void repaint()
355   {
356     aptxFrame.repaint();
357
358   }
359
360   @Override
361   public void setMinimumSize(Dimension dimension)
362   {
363     aptxFrame.setMinimumSize(dimension);
364
365   }
366
367   @Override
368   public boolean isShowing()
369   {
370     return aptxFrame.isShowing();
371   }
372
373   @Override
374   public Container getTopLevelAncestor()
375   {
376     return aptxFrame.getTopLevelAncestor();
377   }
378
379   @Override
380   public void addFrameToJalview(String title, boolean makeVisible,
381           int width, int height, boolean resizable, boolean ignoreMinSize)
382   {
383     Desktop.addInternalFrame(aptxFrame, title, makeVisible, width, height,
384             resizable, ignoreMinSize);
385
386   }
387
388 }