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