1 package jalview.ext.archaeopteryx;
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;
16 import java.awt.Component;
17 import java.awt.Container;
18 import java.awt.Dimension;
19 import java.awt.Event;
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;
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;
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;
42 public class AptxFrame implements TreeFrameI
44 private final MainFrame aptxFrame;
46 private TreePanelI aptxPanel;
48 private TreeControlsI aptxControls;
51 public AptxFrame(Phylogeny tree, Configuration aptxConfig,
54 this(Archaeopteryx.createApplication(tree,
61 public AptxFrame(MainFrame aptx)
65 aptxPanel = new AptxTreePanel(
66 aptxFrame.getMainPanel().getCurrentTreePanel());
67 aptxControls = new AptxControlPanel(
68 aptxFrame.getMainPanel().getControlPanel());
69 adaptAptxGui(aptxFrame);
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.
81 protected void adaptAptxGui(MainFrame aptxFrame)
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();
89 if (menu.getText().contains("File"))
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++)
96 Component menuItem = menu.getMenuComponent(x);
97 if (previousComp instanceof JMenuItem)
99 JMenuItem previousMenuItem = (JMenuItem) previousComp;
100 if (previousMenuItem.getText().startsWith("Read")
101 || previousMenuItem.getText()
103 || previousMenuItem.getText()
104 .startsWith("Close Tab"))
106 previousComp.setVisible(false);
108 if (menuItem instanceof JSeparator)
110 menuItem.setVisible(false);
115 if ((!epsAdded) && previousMenuItem.getText()
116 .startsWith("Export to"))
118 JMenuItem exportEps = new JMenuItem("Export to EPS file...");
119 menu.add(exportEps, x);
120 exportEps.addActionListener(new ActionListener()
124 public void actionPerformed(ActionEvent e)
126 epsTree_actionPerformed(e);
135 previousComp = menuItem;
138 else if (menu.getText().contains("Inference"))
140 menu.setVisible(false);
142 else if (menu.getText().contains("View"))
145 JMenuItem sortByTree = new JMenuItem("Sort alignment by tree");
146 JMenuItem refreshJalview = new JMenuItem(
147 "Filter alignment to show only currently visible sequences");
149 refreshJalview.setFont(menu.getFont());
150 refreshJalview.addActionListener(
151 TreeViewerUtils.getActiveTreeViews().get(this));
152 sortByTree.addActionListener(new ActionListener()
156 public void actionPerformed(ActionEvent e)
158 TreeViewerUtils.getActiveTreeViews().get(AptxFrame.this)
159 .sortByTree_actionPerformed();
165 menu.add(sortByTree);
166 menu.add(refreshJalview);
168 sortByTree.setFont(menu.getFont());
175 // aptxFrame.validate();
178 public void epsTree_actionPerformed(ActionEvent e)
180 boolean accurateText = true;
182 String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",
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")))
191 EPSOptions eps = new EPSOptions();
192 renderStyle = eps.getValue();
194 if (renderStyle == null || eps.cancelled)
201 if (renderStyle.equalsIgnoreCase("text"))
203 accurateText = false;
206 int width = getTreePanel().getWidth();
207 int height = getTreePanel().getHeight();
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"));
218 int value = chooser.showSaveDialog(aptxFrame);
220 if (value != JalviewFileChooser.APPROVE_OPTION)
225 Cache.setProperty("LAST_DIRECTORY",
226 chooser.getSelectedFile().getParent());
228 FileOutputStream out = new FileOutputStream(
229 chooser.getSelectedFile());
230 EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width,
233 pg.setAccurateTextMode(accurateText);
235 getTreePanel().paintToFile(pg, width, height);
239 } catch (Exception ex)
241 ex.printStackTrace();
245 public TreePanelI getTreePanel()
251 public TreeI getTree()
253 return aptxPanel.getTree();
257 public void checkMultipleTrees()
259 aptxFrame.activateSaveAllIfNeeded();
264 public int getNumberOfTrees()
266 return aptxFrame.getMainPanel().getTabbedPane().getTabCount();
270 public TreeControlsI getTreeControls()
276 public AccessibleContext getAccessibleContext()
278 return aptxFrame.getAccessibleContext();
282 public JRootPane getRootPane()
284 return aptxFrame.getRootPane();
288 public void setContentPane(Container contentPane)
290 aptxFrame.setContentPane(contentPane);
295 public Container getContentPane()
297 return aptxFrame.getContentPane();
301 public void setLayeredPane(JLayeredPane layeredPane)
303 aptxFrame.setLayeredPane(layeredPane);
308 public JLayeredPane getLayeredPane()
310 return aptxFrame.getLayeredPane();
314 public void setGlassPane(Component glassPane)
316 aptxFrame.setGlassPane(glassPane);
321 public Component getGlassPane()
323 return aptxFrame.getGlassPane();
327 public boolean imageUpdate(Image img, int infoflags, int x, int y,
328 int width, int height)
330 return aptxFrame.imageUpdate(img, infoflags, x, y, width, height);
334 public Font getFont()
336 return aptxFrame.getFont();
340 public void remove(MenuComponent comp)
342 aptxFrame.remove(comp);
348 public boolean postEvent(Event evt)
350 return aptxFrame.postEvent(evt);
354 public void addFrameListener(InternalFrameListener listener)
356 aptxFrame.addInternalFrameListener(listener);
361 public void removeFrameListener(InternalFrameListener listener)
363 aptxFrame.removeInternalFrameListener(listener);
368 public InternalFrameListener[] getFrameListeners()
370 return aptxFrame.getInternalFrameListeners();
375 public void repaint()
382 public void setMinimumSize(Dimension dimension)
384 aptxFrame.setMinimumSize(dimension);
389 public boolean isShowing()
391 return aptxFrame.isShowing();
395 public Container getTopLevelAncestor()
397 return aptxFrame.getTopLevelAncestor();
401 public void addFrameToJalview(String title, boolean makeVisible,
402 int width, int height, boolean resizable, boolean ignoreMinSize)
404 Desktop.addInternalFrame(aptxFrame, title, makeVisible, width, height,
405 resizable, ignoreMinSize);