X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Farchaeopteryx%2FAptxFrame.java;h=fca6e49dc19658274e1af4b1f11c18747838fcf1;hb=4a3def9f59cefe629c9a33d87483283aee085928;hp=f0c535b3bc2a661748ba27df0746ed6a45d61a5e;hpb=ecbdf5e10c13f242f3918d3c7b898973f04b28db;p=jalview.git diff --git a/src/jalview/ext/archaeopteryx/AptxFrame.java b/src/jalview/ext/archaeopteryx/AptxFrame.java index f0c535b..fca6e49 100644 --- a/src/jalview/ext/archaeopteryx/AptxFrame.java +++ b/src/jalview/ext/archaeopteryx/AptxFrame.java @@ -1,27 +1,510 @@ package jalview.ext.archaeopteryx; -import jalview.ext.treeviewer.ExternalTreePanelI; -import jalview.ext.treeviewer.ExternalTreeViewerI; +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.LineartOptions; +import jalview.io.JalviewFileChooser; +import jalview.io.JalviewFileView; +import jalview.util.ImageMaker; +import jalview.util.MessageManager; +import jalview.util.Platform; +import jalview.util.ImageMaker.TYPE; +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 java.util.concurrent.atomic.AtomicBoolean; + +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 Aptx implements ExternalTreeViewerI +public class AptxFrame implements TreeFrameI { - private final MainFrame aptxApp; + 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; - public Aptx(MainFrame aptx) + } + } + 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) { - aptxApp = aptx; + boolean accurateText = true; + final long messageId = System.currentTimeMillis(); + + String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING", + "Prompt each time"); + if (Platform.isJS()) + { + renderStyle = "Text"; + } + + AtomicBoolean textSelected = new AtomicBoolean( + !"Lineart".equals(renderStyle)); + // If we need to prompt, and if the GUI is visible then + // Prompt for EPS rendering style + if (renderStyle.equalsIgnoreCase("Prompt each time") + && !Platform.isHeadless()) + // && !(System.getProperty("java.awt.headless") != null && System + // .getProperty("java.awt.headless").equals("true"))) + { + LineartOptions epsOption = new LineartOptions(TYPE.EPS.getName(), + textSelected); + epsOption.setResponseAction(1, new Runnable() + { + @Override + public void run() + { + // report canceled + // setStatus(MessageManager.formatMessage( + // "status.cancelled_image_export_operation", + // TYPE.EPS.getName()), messageId); + } + }); + epsOption.setResponseAction(0, new Runnable() + { + @Override + public void run() + { + // TODO Auto-generated method stub + String renderStyle = epsOption.getValue(); + if (renderStyle == null) + { + return; + } + + boolean accurateText = true; + if (renderStyle.equalsIgnoreCase("text")) + { + accurateText = false; + } + doExport(accurateText); + + } + + }); + epsOption.showDialog(); + } + else + { + doExport(accurateText); + } } + protected void doExport(boolean accurateText) + { + 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 ExternalTreePanelI getTreePanel() + public TreePanelI getTreePanel() { - ExternalTreePanelI aptxPanel = new AptxTreePanel( - aptxApp.getMainPanel().getCurrentTreePanel()); 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); + + } + +} \ No newline at end of file