JAL-4134 repaint the tree or alignment view(s) when column selections change
[jalview.git] / src / jalview / gui / TreeCanvas.java
index b331e60..2bdfc27 100755 (executable)
@@ -143,9 +143,43 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
     scrollPane = scroller;
     addMouseListener(this);
     addMouseMotionListener(this);
+    
     ToolTipManager.sharedInstance().registerComponent(this);
   }
 
+  public void clearSelectedLeaves()
+  {
+    Vector<BinaryNode> leaves = tp.getTree()
+            .findLeaves(tp.getTree().getTopNode());
+    if (tp.isColumnWise())
+    {
+      markColumnsFor(getAssociatedPanels(), leaves, Color.white, true);
+    }
+    else
+    {
+      for (AlignmentPanel ap : getAssociatedPanels())
+      {
+        SequenceGroup selected = ap.av.getSelectionGroup();
+        if (selected != null)
+        {
+          {
+            for (int i = 0; i < leaves.size(); i++)
+            {
+              SequenceI seq = (SequenceI) leaves.elementAt(i).element();
+              if (selected.contains(seq))
+              {
+                selected.addOrRemove(seq, false);
+              }
+            }
+            selected.recalcConservation();
+          }
+        }
+        ap.av.sendSelection();
+      }
+    }
+    PaintRefresher.Refresh(tp, av.getSequenceSetId());
+    repaint();
+  }
   /**
    * DOCUMENT ME!
    * 
@@ -830,7 +864,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       Vector<BinaryNode> leaves = tree.findLeaves(highlightNode);
       if (tp.isColumnWise())
       {
-        markColumnsFor(getAssociatedPanels(), leaves, Color.red);
+        markColumnsFor(getAssociatedPanels(), leaves, Color.red,false);
       }
       else
       {
@@ -1108,23 +1142,39 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       return false;
     }
     ColumnSelection cs = av.getColumnSelection();
-
     HiddenColumns hc = av.getAlignment().getHiddenColumns();
-    int offp = (rseq != null) ? rseq.findIndex(rseq.getStart() + colm)
-            : colm;
+    AlignmentAnnotation aa = tp.getAssocAnnotation();
+    int offp=-1;
+    if (aa != null)
+    {
+      ContactMatrixI cm = av.getContactMatrix(aa);
+      if (cm instanceof MappableContactMatrixI)
+      {
+        MappableContactMatrixI mcm = (MappableContactMatrixI) cm;
+        int pos[]=mcm.getMappedPositionsFor(rseq, colm+1);
+        if (pos!=null)
+        {
+          offp=rseq.findIndex(pos[0]);
+        }
+      }
+    }
+    if (offp<=0)
+    {
+      return false;
+    }
 
+    offp-=2;
     if (!av.hasHiddenColumns())
     {
-      return cs.contains(offp - 1);
+      return cs.contains(offp);
     }
-    if (hc.isVisible(offp - 1))
+    if (hc.isVisible(offp))
     {
-      return cs.contains(offp - 1);
+      return cs.contains(offp);
       // return cs.contains(hc.absoluteToVisibleColumn(offp));
     }
     return false;
   }
-
   private BitSet createColumnGroupFor(Vector<BinaryNode> l, Color col)
   {
     BitSet gp = new BitSet();
@@ -1153,16 +1203,25 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
   }
 
   private void markColumnsFor(AlignmentPanel[] aps, Vector<BinaryNode> l,
-          Color col)
+          Color col, boolean clearSelected)
   {
     SequenceI rseq = tp.assocAnnotation.sequenceRef;
-
     if (av == null || av.getAlignment() == null)
     {
       // alignment is closed
       return;
     }
 
+    // TODO - sort indices for faster lookup
+    ColumnSelection cs = av.getColumnSelection();
+    HiddenColumns hc = av.getAlignment().getHiddenColumns();
+    ContactMatrixI cm = av.getContactMatrix(tp.assocAnnotation);
+    MappableContactMatrixI mcm = null;
+    int offp;
+    if (cm instanceof MappableContactMatrixI)
+    {
+      mcm = (MappableContactMatrixI) cm;
+    }
     for (BinaryNode bn : l)
     {
       int colm = -1;
@@ -1174,16 +1233,8 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       {
         continue;
       }
-      // TODO - sort indices for faster lookup
-
-      ColumnSelection cs = av.getColumnSelection();
-      HiddenColumns hc = av.getAlignment().getHiddenColumns();
-      ContactMatrixI cm = av.getContactMatrix(tp.assocAnnotation);
-      MappableContactMatrixI mcm = null;
-      int offp;
-      if (cm instanceof MappableContactMatrixI)
+      if (mcm!=null)
       {
-        mcm = (MappableContactMatrixI) cm;
         int[] seqpos = mcm.getMappedPositionsFor(
                 tp.assocAnnotation.sequenceRef, colm);
         if (seqpos == null)
@@ -1192,25 +1243,26 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
           continue;
         }
         // TODO: handle ranges...
-        offp = seqpos[0];
+        offp = seqpos[0]-1;
       }
       else
       {
         offp = (rseq != null) ? rseq.findIndex(rseq.getStart() + colm)
                 : colm;
       }
-      if (!av.hasHiddenColumns() || hc.isVisible(offp - 1))
+      if (!av.hasHiddenColumns() || hc.isVisible(offp))
       {
-        if (cs.contains(offp - 1))
+        if (clearSelected || cs.contains(offp))
         {
-          cs.removeElement(offp - 1);
+          cs.removeElement(offp);
         }
         else
         {
-          cs.addElement(offp - 1);
+          cs.addElement(offp);
         }
       }
     }
+    PaintRefresher.Refresh(tp, av.getSequenceSetId());
   }
 
   public void createSeqGroupFor(AlignmentPanel[] aps, Vector<BinaryNode> l,