JAL-2874 added filtering when a subtree is selected
[jalview.git] / src / jalview / ext / archaeopteryx / AptxInit.java
index da9e348..9d248d0 100644 (file)
@@ -9,6 +9,7 @@ import jalview.gui.JvOptionPane;
 import jalview.util.MessageManager;
 import jalview.viewmodel.AlignmentViewport;
 
+import java.awt.Component;
 import java.awt.Dimension;
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -18,6 +19,11 @@ import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JSeparator;
+
 import org.forester.archaeopteryx.AptxUtil;
 import org.forester.archaeopteryx.Archaeopteryx;
 import org.forester.archaeopteryx.Configuration;
@@ -46,9 +52,9 @@ import org.forester.util.ForesterUtil;
  */
 public final class AptxInit
 {
-
   private final static Configuration APTX_CONFIG = new Configuration(
-          "_aptx_jalview_configuration_file", false, false, false);
+          "_aptx_jalview_configuration_file",
+            false, false, false);
 
   private final static boolean VALIDATE_PHYLOXML_XSD = APTX_CONFIG
           .isValidatePhyloXmlAgainstSchema();
@@ -470,9 +476,27 @@ public final class AptxInit
           final Phylogeny aptxTree,
           final AlignmentViewport jalviewAlignport, String treeTitle)
   {
+    if (APTX_CONFIG == null || APTX_CONFIG.isCouldReadConfigFile() == false)
+    {
+      int keepGoing = JvOptionPane.showConfirmDialog(Desktop.desktop,
+              MessageManager.getString("label.aptx_config_not_found"),
+              MessageManager.formatMessage("label.couldnt_locate",
+                      new String[]
+                      { "_aptx_jalview_configuration_file" }),
+              JvOptionPane.YES_NO_CANCEL_OPTION);
+
+      if (keepGoing == JvOptionPane.CANCEL_OPTION
+              || keepGoing == JvOptionPane.CLOSED_OPTION
+              || keepGoing == JvOptionPane.NO_OPTION)
+      {
+        return null;
+      }
+
+    }
     MainFrame aptxApp = Archaeopteryx.createApplication(aptxTree,
             APTX_CONFIG, treeTitle);
 
+
     LoadedTreeSequenceAssociation bindAptxNodes = new LoadedTreeSequenceAssociation(
             jalviewAlignport.getAlignment().getSequencesArray(), aptxTree);
     bindAptxNodes.associateLeavesToSequences();
@@ -482,6 +506,7 @@ public final class AptxInit
             bindAptxNodes.getNodesWithAlignment());
     bindTreeViewFrameToJalview(aptxApp);
 
+    adaptAptxGui(aptxApp);
     return aptxApp;
   }
 
@@ -523,6 +548,73 @@ public final class AptxInit
 
   }
 
+  /**
+   * 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.
+   * 
+   * 
+   * @param aptxFrame
+   */
+  private static void adaptAptxGui(MainFrame aptxFrame)
+  {
+    JMenuBar frameBar = aptxFrame.getJMenuBar();
+
+    for (int i = 0; i < frameBar.getMenuCount();i++) {
+      JMenu menu = frameBar.getMenu(i);
+
+      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()) {
+          if (previousMenuItem instanceof JMenuItem)
+          {
+            if (((JMenuItem) previousMenuItem).getText().startsWith("Read")
+                    || ((JMenuItem) previousMenuItem).getText()
+                            .startsWith("New"))
+            {
+              previousMenuItem.setVisible(false);
+
+              if (menuItem instanceof JSeparator)
+              {
+                menuItem.setVisible(false);
+              }
+            }
+          }
+          previousMenuItem = 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");
+
+        refreshJalview.setFont(menu.getFont());
+
+        menu.add(sortByTree);
+        menu.add(refreshJalview);
+
+        sortByTree.setFont(menu.getFont());
+        sortByTree.setVisible(false); // don't show unless it's actually
+        // possible
+
+        refreshJalview.addActionListener(activeAptx.get(aptxFrame));
+
+
+      }
+
+    }
+    aptxFrame.validate();
+  }
+
   public static Map<MainFrame, JalviewBinding> getAllAptxFrames()
   {
     return activeAptx;