package jalview.ext.archaeopteryx; import jalview.bin.Cache; import jalview.ext.treeviewer.TreeControlsI; import jalview.ext.treeviewer.TreeFrameI; import jalview.ext.treeviewer.TreeI; import jalview.ext.treeviewer.TreePanelI; import jalview.ext.treeviewer.TreeViewerBindingI; import jalview.ext.treeviewer.TreeViewerUtils; import jalview.gui.Desktop; import jalview.gui.EPSOptions; import jalview.io.JalviewFileChooser; import jalview.io.JalviewFileView; import jalview.util.ImageMaker; import jalview.util.MessageManager; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Event; import java.awt.Font; import java.awt.Image; import java.awt.MenuComponent; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileOutputStream; import javax.accessibility.AccessibleContext; import javax.swing.JLayeredPane; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JRootPane; import javax.swing.JSeparator; import javax.swing.event.InternalFrameListener; import org.forester.archaeopteryx.Archaeopteryx; import org.forester.archaeopteryx.Configuration; import org.forester.archaeopteryx.MainFrame; import org.forester.phylogeny.Phylogeny; import org.jibble.epsgraphics.EpsGraphics2D; public class AptxFrame implements TreeFrameI { private final MainFrame aptxFrame; private TreeViewerBindingI viewBinding; private TreePanelI aptxPanel; private TreeControlsI aptxControls; public AptxFrame(Phylogeny tree, Configuration aptxConfig, String treeTitle) { this(Archaeopteryx.createApplication(tree, aptxConfig, treeTitle)); } public AptxFrame(MainFrame aptx) { aptxFrame = aptx; aptxPanel = new AptxTreePanel( aptxFrame.getMainPanel().getCurrentTreePanel()); aptxControls = new AptxControlPanel( aptxFrame.getMainPanel().getControlPanel()); adaptAptxGui(aptxFrame); } /** * Hides certain redundant Archaeopteryx GUI elements such as the menu items * for reading in trees and adds extra items related to Jalview such as the * tree sorting menu item. * * * @param aptxFrame */ protected void adaptAptxGui(MainFrame aptxFrame) { JMenuBar frameBar = aptxFrame.getJMenuBar(); boolean epsAdded = false; for (int i = 0; i < frameBar.getMenuCount();i++) { JMenu menu = frameBar.getMenu(i); int menuCount = menu.getMenuComponentCount(); if (menu.getText().contains("File")) { // hide all "Read from ..." and "New" menu items and any Separators that // come directly after them Component previousComp = null; for (int x = 0; x < menuCount; x++) { Component menuItem = menu.getMenuComponent(x); if (previousComp instanceof JMenuItem) { JMenuItem previousMenuItem = (JMenuItem) previousComp; if (previousMenuItem.getText().startsWith("Read") || previousMenuItem.getText() .startsWith("New") || previousMenuItem.getText() .startsWith("Close Tab")) { previousComp.setVisible(false); if (menuItem instanceof JSeparator) { menuItem.setVisible(false); } } if ((!epsAdded) && previousMenuItem.getText() .startsWith("Export to")) { JMenuItem exportEps = new JMenuItem("Export to EPS file..."); menu.add(exportEps, x); exportEps.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { epsTree_actionPerformed(e); } }); epsAdded = true; } } previousComp = menuItem; } } else if (menu.getText().contains("Inference")) { menu.setVisible(false); } else if (menu.getText().contains("View")) { menu.addSeparator(); JMenuItem sortByTree = new JMenuItem("Sort alignment by tree"); JMenuItem refreshJalview = new JMenuItem( "Filter alignment to show only currently visible sequences"); JMenuItem hideCollapsed = new JMenuItem( "Hide sequences of collapsed nodes"); refreshJalview.setFont(menu.getFont()); refreshJalview.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TreeViewerBindingI bindingManager = TreeViewerUtils .getActiveTreeViews().get(AptxFrame.this); bindingManager.actionPerformed(e); } }); sortByTree.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TreeViewerBindingI bindingManager = TreeViewerUtils .getActiveTreeViews().get(AptxFrame.this); bindingManager.sortByTree_actionPerformed(); } }); hideCollapsed.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TreeViewerBindingI bindingManager = TreeViewerUtils .getActiveTreeViews().get(AptxFrame.this); bindingManager.hideCollapsedSequences_actionPerformed(); } }); menu.add(sortByTree); menu.add(refreshJalview); menu.add(hideCollapsed); sortByTree.setFont(menu.getFont()); } } // aptxFrame.validate(); } public void epsTree_actionPerformed(ActionEvent e) { boolean accurateText = true; String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING", "Prompt each time"); // If we need to prompt, and if the GUI is visible then // Prompt for EPS rendering style if (renderStyle.equalsIgnoreCase("Prompt each time") && !(System.getProperty("java.awt.headless") != null && System .getProperty("java.awt.headless").equals("true"))) { EPSOptions eps = new EPSOptions(); renderStyle = eps.getValue(); if (renderStyle == null || eps.cancelled) { return; } } if (renderStyle.equalsIgnoreCase("text")) { accurateText = false; } int width = getTreePanel().getWidth(); int height = getTreePanel().getHeight(); try { JalviewFileChooser chooser = new JalviewFileChooser( ImageMaker.EPS_EXTENSION, ImageMaker.EPS_EXTENSION); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle( MessageManager.getString("label.create_eps_from_tree")); chooser.setToolTipText(MessageManager.getString("action.save")); int value = chooser.showSaveDialog(aptxFrame); if (value != JalviewFileChooser.APPROVE_OPTION) { return; } Cache.setProperty("LAST_DIRECTORY", chooser.getSelectedFile().getParent()); FileOutputStream out = new FileOutputStream( chooser.getSelectedFile()); EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width, height); pg.setAccurateTextMode(accurateText); getTreePanel().paintToFile(pg, width, height); pg.flush(); pg.close(); } catch (Exception ex) { ex.printStackTrace(); } } @Override public TreePanelI getTreePanel() { return aptxPanel; } @Override public TreeI getTree() { return aptxPanel.getTree(); } @Override public void enableMultipleTrees() { aptxFrame.activateSaveAllIfNeeded(); } @Override public int getNumberOfTrees() { return aptxFrame.getMainPanel().getTabbedPane().getTabCount(); } @Override public TreeControlsI getTreeControls() { return aptxControls; } @Override public AccessibleContext getAccessibleContext() { return aptxFrame.getAccessibleContext(); } @Override public JRootPane getRootPane() { return aptxFrame.getRootPane(); } @Override public void setContentPane(Container contentPane) { aptxFrame.setContentPane(contentPane); } @Override public Container getContentPane() { return aptxFrame.getContentPane(); } @Override public void setLayeredPane(JLayeredPane layeredPane) { aptxFrame.setLayeredPane(layeredPane); } @Override public JLayeredPane getLayeredPane() { return aptxFrame.getLayeredPane(); } @Override public void setGlassPane(Component glassPane) { aptxFrame.setGlassPane(glassPane); } @Override public Component getGlassPane() { return aptxFrame.getGlassPane(); } @Override public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { return aptxFrame.imageUpdate(img, infoflags, x, y, width, height); } @Override public Font getFont() { return aptxFrame.getFont(); } @Override public void remove(MenuComponent comp) { aptxFrame.remove(comp); } @Deprecated @Override public boolean postEvent(Event evt) { return aptxFrame.postEvent(evt); } @Override public void addFrameListener(InternalFrameListener listener) { aptxFrame.addInternalFrameListener(listener); } @Override public void removeFrameListener(InternalFrameListener listener) { aptxFrame.removeInternalFrameListener(listener); } @Override public InternalFrameListener[] getFrameListeners() { return aptxFrame.getInternalFrameListeners(); } @Override public void repaint() { aptxFrame.repaint(); } @Override public void setMinimumSize(Dimension dimension) { aptxFrame.setMinimumSize(dimension); } @Override public boolean isShowing() { return aptxFrame.isShowing(); } @Override public Container getTopLevelAncestor() { return aptxFrame.getTopLevelAncestor(); } @Override public void addFrameToJalview(String title, boolean makeVisible, int width, int height, boolean resizable, boolean ignoreMinSize) { Desktop.addInternalFrame(aptxFrame, title, makeVisible, width, height, resizable, ignoreMinSize); } @Override public TreeViewerBindingI getViewBinding() { return viewBinding; } @Override public void setViewBinding(TreeViewerBindingI alignmentBinding) { viewBinding = alignmentBinding; } @Override public void setMaximumSize(Dimension maximumSize) { aptxFrame.setMaximumSize(maximumSize); } @Override public void setPreferredSize(Dimension preferredSize) { aptxFrame.setPreferredSize(preferredSize); } }