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.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;
19 import java.awt.Component;
20 import java.awt.Container;
21 import java.awt.Dimension;
22 import java.awt.Event;
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;
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;
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;
46 public class AptxFrame implements TreeFrameI
48 private final MainFrame aptxFrame;
50 private TreeViewerBindingI viewBinding;
52 private TreePanelI aptxPanel;
54 private TreeControlsI aptxControls;
57 public AptxFrame(Phylogeny tree, Configuration aptxConfig,
60 this(Archaeopteryx.createApplication(tree,
67 public AptxFrame(MainFrame aptx)
71 aptxPanel = new AptxTreePanel(
72 aptxFrame.getMainPanel().getCurrentTreePanel());
73 aptxControls = new AptxControlPanel(
74 aptxFrame.getMainPanel().getControlPanel());
75 adaptAptxGui(aptxFrame);
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.
87 protected void adaptAptxGui(MainFrame aptxFrame)
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();
95 if (menu.getText().contains("File"))
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++)
102 Component menuItem = menu.getMenuComponent(x);
103 if (previousComp instanceof JMenuItem)
105 JMenuItem previousMenuItem = (JMenuItem) previousComp;
106 if (previousMenuItem.getText().startsWith("Read")
107 || previousMenuItem.getText()
109 || previousMenuItem.getText()
110 .startsWith("Close Tab"))
112 previousComp.setVisible(false);
114 if (menuItem instanceof JSeparator)
116 menuItem.setVisible(false);
121 if ((!epsAdded) && previousMenuItem.getText()
122 .startsWith("Export to"))
124 JMenuItem exportEps = new JMenuItem("Export to EPS file...");
125 menu.add(exportEps, x);
126 exportEps.addActionListener(new ActionListener()
130 public void actionPerformed(ActionEvent e)
132 epsTree_actionPerformed(e);
141 previousComp = menuItem;
144 else if (menu.getText().contains("Inference"))
146 menu.setVisible(false);
148 else if (menu.getText().contains("View"))
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");
158 refreshJalview.setFont(menu.getFont());
159 refreshJalview.addActionListener(new ActionListener() {
162 public void actionPerformed(ActionEvent e) {
163 TreeViewerBindingI bindingManager = TreeViewerUtils
164 .getActiveTreeViews().get(AptxFrame.this);
165 bindingManager.actionPerformed(e);
169 sortByTree.addActionListener(new ActionListener()
173 public void actionPerformed(ActionEvent e)
175 TreeViewerBindingI bindingManager = TreeViewerUtils
176 .getActiveTreeViews().get(AptxFrame.this);
177 bindingManager.sortByTree_actionPerformed();
183 hideCollapsed.addActionListener(new ActionListener()
187 public void actionPerformed(ActionEvent e)
189 TreeViewerBindingI bindingManager = TreeViewerUtils
190 .getActiveTreeViews().get(AptxFrame.this);
191 bindingManager.hideCollapsedSequences_actionPerformed();
197 menu.add(sortByTree);
198 menu.add(refreshJalview);
199 menu.add(hideCollapsed);
201 sortByTree.setFont(menu.getFont());
208 // aptxFrame.validate();
211 public void epsTree_actionPerformed(ActionEvent e)
213 boolean accurateText = true;
214 final long messageId = System.currentTimeMillis();
216 String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",
220 renderStyle = "Text";
223 AtomicBoolean textSelected = new AtomicBoolean(
224 !"Lineart".equals(renderStyle));
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")))
233 LineartOptions epsOption = new LineartOptions(TYPE.EPS.getName(),
235 epsOption.setResponseAction(1, new Runnable()
241 // setStatus(MessageManager.formatMessage(
242 // "status.cancelled_image_export_operation",
243 // TYPE.EPS.getName()), messageId);
246 epsOption.setResponseAction(0, new Runnable()
251 // TODO Auto-generated method stub
253 String renderStyle = epsOption.getValue();
255 if (renderStyle == null)
260 boolean accurateText = true;
261 if (renderStyle.equalsIgnoreCase("text"))
263 accurateText = false;
265 doExport(accurateText);
270 epsOption.showDialog();
274 doExport(accurateText);
278 protected void doExport(boolean accurateText)
280 int width = getTreePanel().getWidth();
281 int height = getTreePanel().getHeight();
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"));
292 int value = chooser.showSaveDialog(aptxFrame);
294 if (value != JalviewFileChooser.APPROVE_OPTION)
299 Cache.setProperty("LAST_DIRECTORY",
300 chooser.getSelectedFile().getParent());
302 FileOutputStream out = new FileOutputStream(
303 chooser.getSelectedFile());
304 EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width,
307 pg.setAccurateTextMode(accurateText);
309 getTreePanel().paintToFile(pg, width, height);
313 } catch (Exception ex)
315 ex.printStackTrace();
319 public TreePanelI getTreePanel()
325 public TreeI getTree()
327 return aptxPanel.getTree();
331 public void enableMultipleTrees()
333 aptxFrame.activateSaveAllIfNeeded();
338 public int getNumberOfTrees()
340 return aptxFrame.getMainPanel().getTabbedPane().getTabCount();
344 public TreeControlsI getTreeControls()
350 public AccessibleContext getAccessibleContext()
352 return aptxFrame.getAccessibleContext();
356 public JRootPane getRootPane()
358 return aptxFrame.getRootPane();
362 public void setContentPane(Container contentPane)
364 aptxFrame.setContentPane(contentPane);
369 public Container getContentPane()
371 return aptxFrame.getContentPane();
375 public void setLayeredPane(JLayeredPane layeredPane)
377 aptxFrame.setLayeredPane(layeredPane);
382 public JLayeredPane getLayeredPane()
384 return aptxFrame.getLayeredPane();
388 public void setGlassPane(Component glassPane)
390 aptxFrame.setGlassPane(glassPane);
395 public Component getGlassPane()
397 return aptxFrame.getGlassPane();
401 public boolean imageUpdate(Image img, int infoflags, int x, int y,
402 int width, int height)
404 return aptxFrame.imageUpdate(img, infoflags, x, y, width, height);
408 public Font getFont()
410 return aptxFrame.getFont();
414 public void remove(MenuComponent comp)
416 aptxFrame.remove(comp);
422 public boolean postEvent(Event evt)
424 return aptxFrame.postEvent(evt);
428 public void addFrameListener(InternalFrameListener listener)
430 aptxFrame.addInternalFrameListener(listener);
435 public void removeFrameListener(InternalFrameListener listener)
437 aptxFrame.removeInternalFrameListener(listener);
442 public InternalFrameListener[] getFrameListeners()
444 return aptxFrame.getInternalFrameListeners();
449 public void repaint()
456 public void setMinimumSize(Dimension dimension)
458 aptxFrame.setMinimumSize(dimension);
463 public boolean isShowing()
465 return aptxFrame.isShowing();
469 public Container getTopLevelAncestor()
471 return aptxFrame.getTopLevelAncestor();
475 public void addFrameToJalview(String title, boolean makeVisible,
476 int width, int height, boolean resizable, boolean ignoreMinSize)
478 Desktop.addInternalFrame(aptxFrame, title, makeVisible, width, height,
479 resizable, ignoreMinSize);
484 public TreeViewerBindingI getViewBinding()
490 public void setViewBinding(TreeViewerBindingI alignmentBinding)
492 viewBinding = alignmentBinding;
497 public void setMaximumSize(Dimension maximumSize)
499 aptxFrame.setMaximumSize(maximumSize);
504 public void setPreferredSize(Dimension preferredSize)
506 aptxFrame.setPreferredSize(preferredSize);