JAL-1953 moved now-generic methods outside of Aptx package
[jalview.git] / src / jalview / ext / archaeopteryx / JalviewBinding.java
index 810a711..54b9225 100644 (file)
@@ -9,11 +9,13 @@ import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
-import jalview.ext.treeviewer.ExternalTreeFrame;
-import jalview.ext.treeviewer.ExternalTreeI;
-import jalview.ext.treeviewer.ExternalTreeNodeI;
-import jalview.ext.treeviewer.ExternalTreePanel;
-import jalview.ext.treeviewer.ExternalTreeViewerBindingI;
+import jalview.ext.treeviewer.TreeFrameI;
+import jalview.ext.treeviewer.TreeI;
+import jalview.ext.treeviewer.TreeNodeI;
+import jalview.ext.treeviewer.TreePanelI;
+import jalview.ext.treeviewer.TreeViewerBindingI;
+import jalview.ext.treeviewer.TreeViewerUtils;
+import jalview.ext.treeviewer.LoadedTreeSequenceAssociation;
 import jalview.gui.AlignViewport;
 import jalview.gui.AlignmentPanel;
 import jalview.gui.Desktop;
@@ -29,6 +31,7 @@ import jalview.util.MessageManager;
 import jalview.viewmodel.AlignmentViewport;
 
 import java.awt.Color;
+import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
 import java.awt.event.InputEvent;
 import java.awt.event.MouseEvent;
@@ -51,11 +54,11 @@ import javax.swing.event.InternalFrameEvent;
  *
  */
 public final class JalviewBinding
-        implements ExternalTreeViewerBindingI
+        implements TreeViewerBindingI
 {
-  private final ExternalTreeFrame aptxFrame;
+  private final TreeFrameI aptxFrame;
 
-  private ExternalTreePanel treeView;
+  private TreePanelI treeView;
 
   private AlignmentViewport parentAvport;
 
@@ -63,9 +66,9 @@ public final class JalviewBinding
 
   private AlignmentPanel[] associatedPanels;
 
-  private Map<SequenceI, ExternalTreeNodeI> sequencesBoundToNodes;
+  private Map<SequenceI, TreeNodeI> sequencesBoundToNodes;
 
-  private Map<ExternalTreeNodeI, SequenceI> nodesBoundToSequences;
+  private Map<TreeNodeI, SequenceI> nodesBoundToSequences;
 
   private float rootX;
 
@@ -90,10 +93,10 @@ public final class JalviewBinding
    *          map with tree nodes and matching sequences used to calculate the
    *          tree as key, value pair respectively.
    */
-  public JalviewBinding(final ExternalTreeFrame archaeopteryx,
+  public JalviewBinding(final TreeFrameI archaeopteryx,
           final AlignmentViewport jalviewAlignmentViewport,
-          final Map<SequenceI, ExternalTreeNodeI> alignMappedToNodes,
-          final Map<ExternalTreeNodeI, SequenceI> nodesMappedToAlign)
+          final Map<SequenceI, TreeNodeI> alignMappedToNodes,
+          final Map<TreeNodeI, SequenceI> nodesMappedToAlign)
   {
 
     if (archaeopteryx.getNumberOfTrees() > 1)
@@ -127,7 +130,7 @@ public final class JalviewBinding
       @Override
       public void internalFrameClosed(InternalFrameEvent e)
       {
-        AptxInit.getAllAptxFrames().remove(aptxFrame);
+        TreeViewerUtils.getActiveTreeViews().remove(aptxFrame);
         ssm.removeSelectionListener(JalviewBinding.this);
       }
 
@@ -169,7 +172,52 @@ public final class JalviewBinding
   @Override
   public void actionPerformed(ActionEvent e)
   {
-    // aptxFrame.actionPerformed(e);
+    // reset hidden sequences first
+    parentAvport.showAllHiddenSeqs();
+
+    if (treeView.showingSubTree())
+    {
+    LoadedTreeSequenceAssociation bindAptxNodes = new LoadedTreeSequenceAssociation(
+            parentAvport.getAlignment().getSequencesArray(),
+              treeView.getTree());
+    bindAptxNodes.associateLeavesToSequences();
+    sequencesBoundToNodes = bindAptxNodes.getAlignmentWithNodes();
+    nodesBoundToSequences = bindAptxNodes.getNodesWithAlignment();
+    TreeViewerUtils.associateNodesWithJalviewSequences(aptxFrame, parentAvport,
+            sequencesBoundToNodes, nodesBoundToSequences);
+
+
+    for (SequenceI seq : parentAvport.getAlignment().getSequencesArray())
+    {
+      if (!sequencesBoundToNodes.containsKey(seq))
+      {
+        parentAvport.hideSequence(new SequenceI[] { seq });
+      }
+      }
+    }
+
+    else
+    {
+
+      Rectangle visibleView = treeView.getVisibleArea();
+
+      for (TreeNodeI node : treeView.getTree().getRoot()
+              .getAllDescendants())
+      {
+        if (!(node.getXcoord() > visibleView.getMinX()
+                && node.getXcoord() < visibleView.getMaxX()
+                && node.getYcoord() > visibleView.getMinY()
+                && node.getYcoord() < visibleView.getMaxY()))
+        {
+          parentAvport
+                  .hideSequence(new SequenceI[]
+                  { nodesBoundToSequences.get(node) });
+        }
+      }
+
+    }
+
+
 
   }
 
@@ -184,7 +232,7 @@ public final class JalviewBinding
        */
       public void run()
       {
-        final ExternalTreeNodeI node = treeView.findNode(e.getX(),
+        final TreeNodeI node = treeView.findNode(e.getX(),
                 e.getY());
         if (node != null)
         {
@@ -249,7 +297,7 @@ public final class JalviewBinding
 
       for (SequenceI selectedSequence : seqsel.getSequences())
       {
-        ExternalTreeNodeI matchingNode = sequencesBoundToNodes
+        TreeNodeI matchingNode = sequencesBoundToNodes
                 .get(selectedSequence);
         if (matchingNode != null)
         {
@@ -280,13 +328,13 @@ public final class JalviewBinding
    */
   public void partitionTree(final int x)
   {
-    ExternalTreeI tree = treeView.getTree();
+    TreeI tree = treeView.getTree();
 
     if (!tree.isEmpty())
     {
       // should be calculated on each partition as the tree can theoretically
       // change in the meantime
-      ExternalTreeNodeI furthestNode = tree.getFurthestNode();
+      TreeNodeI furthestNode = tree.getFurthestNode();
       furthestNodeX = furthestNode.getXcoord();
       rootX = tree.getRoot().getXcoord();
 
@@ -294,7 +342,7 @@ public final class JalviewBinding
       if (furthestNodeX != rootX && !(x > furthestNodeX))
       {
         float threshold = (x - rootX) / (furthestNodeX - rootX);
-        List<ExternalTreeNodeI> foundNodes = getNodesAboveThreshold(
+        List<TreeNodeI> foundNodes = getNodesAboveThreshold(
                 threshold,
                 tree.getRoot());
 
@@ -304,11 +352,11 @@ public final class JalviewBinding
 
   }
 
-  public List<ExternalTreeNodeI> getNodesAboveThreshold(double threshold,
-          ExternalTreeNodeI node)
+  public List<TreeNodeI> getNodesAboveThreshold(double threshold,
+          TreeNodeI node)
   {
 
-    List<ExternalTreeNodeI> nodesAboveThreshold = new ArrayList<>();
+    List<TreeNodeI> nodesAboveThreshold = new ArrayList<>();
 
     parentAvport.setSelectionGroup(null);
     parentAvport.getAlignment().deleteAllGroups();
@@ -336,12 +384,12 @@ public final class JalviewBinding
    * @param node
    * @return
    */
-  private List<ExternalTreeNodeI> colourNodesAboveThreshold(
-          List<ExternalTreeNodeI> nodeList, double threshold,
-          ExternalTreeNodeI node)
+  private List<TreeNodeI> colourNodesAboveThreshold(
+          List<TreeNodeI> nodeList, double threshold,
+          TreeNodeI node)
   {
 
-    for (ExternalTreeNodeI childNode : node.getDirectChildren())
+    for (TreeNodeI childNode : node.getDirectChildren())
     {
       childNode.setBranchColor(Color.black);
       float nodeCutoff = (childNode.getXcoord() - rootX)
@@ -363,10 +411,10 @@ public final class JalviewBinding
           parentAvport.setSequenceColour(seq, randomColour);
         }
 
-        List<ExternalTreeNodeI> descendantNodes = childNode
+        List<TreeNodeI> descendantNodes = childNode
                 .getAllDescendants();
         // .forEach instead?
-        for (ExternalTreeNodeI descNode : descendantNodes)
+        for (TreeNodeI descNode : descendantNodes)
         {
           seq = nodesBoundToSequences.get(descNode);
           if (seq != null)
@@ -485,7 +533,7 @@ public final class JalviewBinding
    * does)
    */
   @Override
-  public void showNodeSelectionOnAlign(final ExternalTreeNodeI node)
+  public void showNodeSelectionOnAlign(final TreeNodeI node)
   {
 
       if (node.isInternal())
@@ -506,7 +554,7 @@ public final class JalviewBinding
 
 
   @Override
-  public void showMatchingSequence(final ExternalTreeNodeI nodeToMatch)
+  public void showMatchingSequence(final TreeNodeI nodeToMatch)
   {
     SequenceI matchingSequence = nodesBoundToSequences.get(nodeToMatch);
     if (matchingSequence != null)
@@ -520,14 +568,14 @@ public final class JalviewBinding
   }
 
   @Override
-  public void showMatchingChildSequences(final ExternalTreeNodeI parentNode)
+  public void showMatchingChildSequences(final TreeNodeI parentNode)
   {
     // redundancy here, Forester already iterates through tree to get all
     // descendants
-    List<ExternalTreeNodeI> childNodes = parentNode.getAllDescendants();
+    List<TreeNodeI> childNodes = parentNode.getAllDescendants();
 
 
-    for (ExternalTreeNodeI childNode : childNodes)
+    for (TreeNodeI childNode : childNodes)
     {
       // childNode.getBranchData().setBranchColor(new BranchColor(Color.BLUE));