JAL-1953 2.11.2 with Archeopteryx!
[jalview.git] / src / jalview / ext / archaeopteryx / AptxFrame.java
diff --git a/src/jalview/ext/archaeopteryx/AptxFrame.java b/src/jalview/ext/archaeopteryx/AptxFrame.java
new file mode 100644 (file)
index 0000000..fca6e49
--- /dev/null
@@ -0,0 +1,510 @@
+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