JAL-2826 added action performed for hiding collapsed sequences
[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   private TreeViewerBindingI viewBinding;
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
149         JMenuItem sortByTree = new JMenuItem("Sort alignment by tree");
150         JMenuItem refreshJalview = new JMenuItem(
151                 "Filter alignment to show only currently visible sequences");
152         JMenuItem hideCollapsed = new JMenuItem(
153                 "Hide sequences of collapsed nodes");
154
155         refreshJalview.setFont(menu.getFont());
156         refreshJalview.addActionListener(new ActionListener() {
157           
158           @Override
159           public void actionPerformed(ActionEvent e) {
160             TreeViewerBindingI bindingManager = TreeViewerUtils
161                     .getActiveTreeViews().get(AptxFrame.this);
162             bindingManager.actionPerformed(e);
163           }
164         });
165                 
166         sortByTree.addActionListener(new ActionListener()
167         {
168
169           @Override
170           public void actionPerformed(ActionEvent e)
171           {
172             TreeViewerBindingI bindingManager = TreeViewerUtils
173                     .getActiveTreeViews().get(AptxFrame.this);
174             bindingManager.sortByTree_actionPerformed();
175
176           }
177
178         });
179
180         hideCollapsed.addActionListener(new ActionListener()
181         {
182
183           @Override
184           public void actionPerformed(ActionEvent e)
185           {
186             TreeViewerBindingI bindingManager = TreeViewerUtils
187                     .getActiveTreeViews().get(AptxFrame.this);
188             bindingManager.hideCollapsedSequences_actionPerformed();
189             
190           }
191
192         });
193
194         menu.add(sortByTree);
195         menu.add(refreshJalview);
196         menu.add(hideCollapsed);
197
198         sortByTree.setFont(menu.getFont());
199
200
201
202       }
203
204     }
205     // aptxFrame.validate();
206   }
207
208   public void epsTree_actionPerformed(ActionEvent e)
209   {
210     boolean accurateText = true;
211
212     String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",
213             "Prompt each time");
214
215     // If we need to prompt, and if the GUI is visible then
216     // Prompt for EPS rendering style
217     if (renderStyle.equalsIgnoreCase("Prompt each time")
218             && !(System.getProperty("java.awt.headless") != null && System
219                     .getProperty("java.awt.headless").equals("true")))
220     {
221       EPSOptions eps = new EPSOptions();
222       renderStyle = eps.getValue();
223
224       if (renderStyle == null || eps.cancelled)
225       {
226         return;
227       }
228
229     }
230
231     if (renderStyle.equalsIgnoreCase("text"))
232     {
233       accurateText = false;
234     }
235
236     int width = getTreePanel().getWidth();
237     int height = getTreePanel().getHeight();
238
239     try
240     {
241       JalviewFileChooser chooser = new JalviewFileChooser(
242               ImageMaker.EPS_EXTENSION, ImageMaker.EPS_EXTENSION);
243       chooser.setFileView(new JalviewFileView());
244       chooser.setDialogTitle(
245               MessageManager.getString("label.create_eps_from_tree"));
246       chooser.setToolTipText(MessageManager.getString("action.save"));
247
248       int value = chooser.showSaveDialog(aptxFrame);
249
250       if (value != JalviewFileChooser.APPROVE_OPTION)
251       {
252         return;
253       }
254
255       Cache.setProperty("LAST_DIRECTORY",
256               chooser.getSelectedFile().getParent());
257
258       FileOutputStream out = new FileOutputStream(
259               chooser.getSelectedFile());
260       EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width,
261               height);
262
263       pg.setAccurateTextMode(accurateText);
264
265       getTreePanel().paintToFile(pg, width, height);
266
267       pg.flush();
268       pg.close();
269     } catch (Exception ex)
270     {
271       ex.printStackTrace();
272     }
273   }
274   @Override
275   public TreePanelI getTreePanel()
276   {
277     return aptxPanel;
278   }
279
280   @Override
281   public TreeI getTree()
282   {
283     return aptxPanel.getTree();
284   }
285
286   @Override
287   public void enableMultipleTrees()
288   {
289     aptxFrame.activateSaveAllIfNeeded();
290
291   }
292
293   @Override
294   public int getNumberOfTrees()
295   {
296     return aptxFrame.getMainPanel().getTabbedPane().getTabCount();
297   }
298
299   @Override
300   public TreeControlsI getTreeControls()
301   {
302     return aptxControls;
303   }
304
305   @Override
306   public AccessibleContext getAccessibleContext()
307   {
308     return aptxFrame.getAccessibleContext();
309   }
310
311   @Override
312   public JRootPane getRootPane()
313   {
314     return aptxFrame.getRootPane();
315   }
316
317   @Override
318   public void setContentPane(Container contentPane)
319   {
320     aptxFrame.setContentPane(contentPane);
321
322   }
323
324   @Override
325   public Container getContentPane()
326   {
327     return aptxFrame.getContentPane();
328   }
329
330   @Override
331   public void setLayeredPane(JLayeredPane layeredPane)
332   {
333     aptxFrame.setLayeredPane(layeredPane);
334
335   }
336
337   @Override
338   public JLayeredPane getLayeredPane()
339   {
340     return aptxFrame.getLayeredPane();
341   }
342
343   @Override
344   public void setGlassPane(Component glassPane)
345   {
346     aptxFrame.setGlassPane(glassPane);
347
348   }
349
350   @Override
351   public Component getGlassPane()
352   {
353     return aptxFrame.getGlassPane();
354   }
355
356   @Override
357   public boolean imageUpdate(Image img, int infoflags, int x, int y,
358           int width, int height)
359   {
360     return aptxFrame.imageUpdate(img, infoflags, x, y, width, height);
361   }
362
363   @Override
364   public Font getFont()
365   {
366     return aptxFrame.getFont();
367   }
368
369   @Override
370   public void remove(MenuComponent comp)
371   {
372     aptxFrame.remove(comp);
373
374   }
375
376   @Deprecated
377   @Override
378   public boolean postEvent(Event evt)
379   {
380     return aptxFrame.postEvent(evt);
381   }
382
383   @Override
384   public void addFrameListener(InternalFrameListener listener)
385   {
386     aptxFrame.addInternalFrameListener(listener);
387
388   }
389
390   @Override
391   public void removeFrameListener(InternalFrameListener listener)
392   {
393     aptxFrame.removeInternalFrameListener(listener);
394
395   }
396
397   @Override
398   public InternalFrameListener[] getFrameListeners()
399   {
400     return aptxFrame.getInternalFrameListeners();
401
402   }
403
404   @Override
405   public void repaint()
406   {
407     aptxFrame.repaint();
408
409   }
410
411   @Override
412   public void setMinimumSize(Dimension dimension)
413   {
414     aptxFrame.setMinimumSize(dimension);
415
416   }
417
418   @Override
419   public boolean isShowing()
420   {
421     return aptxFrame.isShowing();
422   }
423
424   @Override
425   public Container getTopLevelAncestor()
426   {
427     return aptxFrame.getTopLevelAncestor();
428   }
429
430   @Override
431   public void addFrameToJalview(String title, boolean makeVisible,
432           int width, int height, boolean resizable, boolean ignoreMinSize)
433   {
434     Desktop.addInternalFrame(aptxFrame, title, makeVisible, width, height,
435             resizable, ignoreMinSize);
436
437   }
438
439   @Override
440   public TreeViewerBindingI getViewBinding()
441   {
442     return viewBinding;
443   }
444
445   @Override
446   public void setViewBinding(TreeViewerBindingI alignmentBinding)
447   {
448     viewBinding = alignmentBinding;
449   }
450
451
452   @Override
453   public void setMaximumSize(Dimension maximumSize)
454   {
455     aptxFrame.setMaximumSize(maximumSize);
456
457   }
458
459   @Override
460   public void setPreferredSize(Dimension preferredSize)
461   {
462     aptxFrame.setPreferredSize(preferredSize);
463
464   }
465
466 }