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