JAL-2838 JAL-2872 added sorting from the Aptx frame (still misbehaving
[jalview.git] / src / jalview / ext / archaeopteryx / AptxFrame.java
index b00b24d..79798d3 100644 (file)
@@ -1,10 +1,17 @@
 package jalview.ext.archaeopteryx;
 
-import jalview.ext.treeviewer.ExternalTreeControlsI;
-import jalview.ext.treeviewer.ExternalTreeFrame;
-import jalview.ext.treeviewer.ExternalTreeI;
-import jalview.ext.treeviewer.ExternalTreePanel;
+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.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;
@@ -13,6 +20,9 @@ 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;
@@ -23,18 +33,34 @@ 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 ExternalTreeFrame
+public class AptxFrame implements TreeFrameI
 {
   private final MainFrame aptxFrame;
 
-  private ExternalTreePanel aptxPanel;
+  private TreePanelI aptxPanel;
+
+  private TreeControlsI aptxControls;
+
+
+  public AptxFrame(Phylogeny tree, Configuration aptxConfig,
+          String treeTitle)
+  {
+    this(Archaeopteryx.createApplication(tree,
+            aptxConfig,
+            treeTitle));
+
+  }
 
-  private ExternalTreeControlsI aptxControls;
 
   public AptxFrame(MainFrame aptx)
   {
+
     aptxFrame = aptx;
     aptxPanel = new AptxTreePanel(
             aptxFrame.getMainPanel().getCurrentTreePanel());
@@ -43,70 +69,186 @@ public class AptxFrame implements ExternalTreeFrame
     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 item.
+   * tree sorting menu item.
    * 
    * 
    * @param aptxFrame
    */
-  private void adaptAptxGui(MainFrame aptxFrame)
+  protected void adaptAptxGui(MainFrame aptxFrame)
   {
     JMenuBar frameBar = aptxFrame.getJMenuBar();
-
-    for (int i = 0; i < frameBar.getMenuCount(); i++)
-    {
+    boolean epsAdded = false;
+    for (int i = 0; i < frameBar.getMenuCount();i++) {
       JMenu menu = frameBar.getMenu(i);
+      int menuCount = menu.getMenuComponentCount();
 
-      if (menu.getText().startsWith("File"))
+      if (menu.getText().contains("File"))
       {
         // hide all "Read from ..." and "New" menu items and any Separators that
         // come directly after them
-        Component previousMenuItem = null;
-        for (Component menuItem : menu.getMenuComponents())
+        Component previousComp = null;
+        for (int x = 0; x < menuCount; x++)
         {
-          if (previousMenuItem instanceof JMenuItem)
+          Component menuItem = menu.getMenuComponent(x);
+          if (previousComp instanceof JMenuItem)
           {
-            if (((JMenuItem) previousMenuItem).getText().startsWith("Read")
-                    || ((JMenuItem) previousMenuItem).getText()
-                            .startsWith("New"))
+            JMenuItem previousMenuItem = (JMenuItem) previousComp;
+            if (previousMenuItem.getText().startsWith("Read")
+                    || previousMenuItem.getText()
+                            .startsWith("New")
+                    || previousMenuItem.getText()
+                            .startsWith("Close Tab"))
             {
-              previousMenuItem.setVisible(false);
+              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;
+
             }
           }
-          previousMenuItem = menuItem;
+          previousComp = menuItem;
         }
       }
-      else if (menu.getText().startsWith("Inference"))
+      else if (menu.getText().contains("Inference"))
       {
         menu.setVisible(false);
       }
-      else if (menu.getText().startsWith("View"))
+      else if (menu.getText().contains("View"))
       {
         menu.addSeparator();
-        JMenuItem sortMenuItem = new JMenuItem("Sort alignment by tree");
-        sortMenuItem.setVisible(false);
-        menu.add(sortMenuItem);
+        JMenuItem sortByTree = new JMenuItem("Sort alignment by tree");
+        JMenuItem refreshJalview = new JMenuItem(
+                "Filter alignment to show only currently visible sequences");
+
+        refreshJalview.setFont(menu.getFont());
+        refreshJalview.addActionListener(
+                TreeViewerUtils.getActiveTreeViews().get(this));
+        sortByTree.addActionListener(new ActionListener()
+        {
+
+          @Override
+          public void actionPerformed(ActionEvent e)
+          {
+            TreeViewerUtils.getActiveTreeViews().get(AptxFrame.this)
+                    .sortByTree_actionPerformed();
+
+          }
+
+        });
+
+        menu.add(sortByTree);
+        menu.add(refreshJalview);
+
+        sortByTree.setFont(menu.getFont());
+
+
+
       }
 
     }
-    aptxFrame.validate();
+    // 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 ExternalTreePanel getTreePanel()
+  public TreePanelI getTreePanel()
   {
     return aptxPanel;
   }
 
   @Override
-  public ExternalTreeI getTree()
+  public TreeI getTree()
   {
     return aptxPanel.getTree();
   }
@@ -125,7 +267,7 @@ public class AptxFrame implements ExternalTreeFrame
   }
 
   @Override
-  public ExternalTreeControlsI getTreeControls()
+  public TreeControlsI getTreeControls()
   {
     return aptxControls;
   }