--- /dev/null
+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.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 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;
+ 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 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);
+
+ }
+
+}
\ No newline at end of file