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