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