refactored VamsasListener to allow the source of the event to be passed to handlers
[jalview.git] / src / jalview / appletgui / SeqPanel.java
index 6486647..e6ed8f2 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
  * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
  * 
  * This file is part of Jalview.
@@ -25,6 +25,7 @@ import java.awt.event.*;
 import jalview.commands.*;
 import jalview.datamodel.*;
 import jalview.schemes.*;
+import jalview.structure.SelectionSource;
 import jalview.structure.SequenceListener;
 import jalview.structure.StructureSelectionManager;
 
@@ -302,8 +303,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       sg.addSequence(sequence, false);
       av.setSelectionGroup(sg);
     }
-
     ap.paintAlignment(false);
+    av.sendSelection();
   }
 
   void insertGapAtCursor(boolean group)
@@ -464,14 +465,14 @@ public class SeqPanel extends Panel implements MouseMotionListener,
         av.setSelectionGroup(null);
       }
 
-      SequenceFeature[] features = findFeaturesAtRes(sequence, sequence
-              .findPosition(findRes(evt)));
+      SequenceFeature[] features = findFeaturesAtRes(sequence,
+              sequence.findPosition(findRes(evt)));
 
       if (features != null && features.length > 0)
       {
         SearchResults highlight = new SearchResults();
-        highlight.addResult(sequence, features[0].getBegin(), features[0]
-                .getEnd());
+        highlight.addResult(sequence, features[0].getBegin(),
+                features[0].getEnd());
         seqCanvas.highlightSearchResults(highlight);
       }
       if (features != null && features.length > 0)
@@ -580,8 +581,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
 
       y -= hgap;
 
-      seq = Math.min((y % cHeight) / av.getCharHeight(), av.alignment
-              .getHeight() - 1);
+      seq = Math.min((y % cHeight) / av.getCharHeight(),
+              av.alignment.getHeight() - 1);
       if (seq < 0)
       {
         seq = -1;
@@ -631,7 +632,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
   {
     String tmp = sequence.hashCode() + index + "";
     if (lastMessage == null || !lastMessage.equals(tmp))
-      ssm.mouseOverSequence(sequence, index, pos);
+      ssm.mouseOverSequence(sequence, index, pos, av);
 
     lastMessage = tmp;
   }
@@ -734,8 +735,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     }
 
     // use aa to see if the mouse pointer is on a
-    SequenceFeature[] allFeatures = findFeaturesAtRes(sequence, sequence
-            .findPosition(res));
+    SequenceFeature[] allFeatures = findFeaturesAtRes(sequence,
+            sequence.findPosition(res));
 
     int index = 0;
     while (index < allFeatures.length)
@@ -836,9 +837,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
           fontSize = 1;
         }
 
-        av
-                .setFont(new Font(av.font.getName(), av.font.getStyle(),
-                        fontSize));
+        av.setFont(new Font(av.font.getName(), av.font.getStyle(), fontSize));
         av.charWidth = oldWidth;
       }
       else
@@ -1348,8 +1347,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     // DETECT RIGHT MOUSE BUTTON IN AWT
     if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
     {
-      SequenceFeature[] allFeatures = findFeaturesAtRes(sequence, sequence
-              .findPosition(res));
+      SequenceFeature[] allFeatures = findFeaturesAtRes(sequence,
+              sequence.findPosition(res));
 
       Vector links = null;
       if (allFeatures != null)
@@ -1420,9 +1419,9 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     {
       if (stretchGroup.cs instanceof ClustalxColourScheme)
       {
-        ((ClustalxColourScheme) stretchGroup.cs).resetClustalX(stretchGroup
-                .getSequences(av.hiddenRepSequences), stretchGroup
-                .getWidth());
+        ((ClustalxColourScheme) stretchGroup.cs).resetClustalX(
+                stretchGroup.getSequences(av.hiddenRepSequences),
+                stretchGroup.getWidth());
       }
 
       if (stretchGroup.cs instanceof Blosum62ColourScheme
@@ -1435,14 +1434,14 @@ public class SeqPanel extends Panel implements MouseMotionListener,
 
       if (stretchGroup.cs.conservationApplied())
       {
-        SliderPanel.setConservationSlider(ap, stretchGroup.cs, stretchGroup
-                .getName());
+        SliderPanel.setConservationSlider(ap, stretchGroup.cs,
+                stretchGroup.getName());
         stretchGroup.recalcConservation();
       }
       else
       {
-        SliderPanel.setPIDSliderSource(ap, stretchGroup.cs, stretchGroup
-                .getName());
+        SliderPanel.setPIDSliderSource(ap, stretchGroup.cs,
+                stretchGroup.getName());
       }
     }
     changeEndRes = false;
@@ -1450,6 +1449,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     stretchGroup = null;
     PaintRefresher.Refresh(ap, av.getSequenceSetId());
     ap.paintAlignment(true);
+    av.sendSelection();
   }
 
   public void doMouseDraggedDefineMode(MouseEvent evt)
@@ -1683,5 +1683,95 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       }
     }
   }
+  /**
+   * modify current selection according to a received message.
+   */
+  public void selection(SequenceGroup seqsel, ColumnSelection colsel,
+          SelectionSource source)
+  {
+    // TODO: fix this hack - source of messages is align viewport, but SeqPanel
+    // handles selection messages...
+    // TODO: extend config options to allow user to control if selections may be
+    // shared between viewports.
+    if (av!=null && (av == source
+            || !av.followSelection
+            || (source instanceof AlignViewport && ((AlignViewport) source)
+                    .getSequenceSetId().equals(av.getSequenceSetId()))))
+    {
+      return;
+    }
+    // do we want to thread this ? (contention with seqsel and colsel locks, I
+    // suspect)
+    // rules are: colsel is copied if there is a real intersection between
+    // sequence selection
+    boolean repaint = false, copycolsel = true;
+    if (av.selectionGroup == null || !av.isSelectionGroupChanged())
+    {
+      SequenceGroup sgroup = null;
+      if (seqsel != null)
+      {
+        if (av.alignment == null)
+        {
+          System.out.println("Selection message: alignviewport av SeqSetId="
+                  + av.getSequenceSetId() + " ViewId=" + av.getViewId()
+                  + " 's alignment is NULL! returning immediatly.");
+          return;
+        }
+        sgroup = seqsel.intersect(av.alignment,
+                (av.hasHiddenRows) ? av.hiddenRepSequences : null);
+        if ((sgroup == null || sgroup.getSize() == 0)
+                && (colsel == null || colsel.size() == 0))
+        {
+          // don't copy columns if the region didn't intersect.
+          copycolsel = false;
+        }
+      }
+      if (sgroup != null && sgroup.getSize() > 0)
+      {
+        av.setSelectionGroup(sgroup);
+      }
+      else
+      {
+        av.setSelectionGroup(null);
+      }
+      repaint = av.isSelectionGroupChanged();
+    }
+    if (copycolsel && (av.colSel == null || !av.isColSelChanged()))
+    {
+      // the current selection is unset or from a previous message
+      // so import the new colsel.
+      if (colsel == null || colsel.size() == 0)
+      {
+        if (av.colSel != null)
+        {
+          av.colSel.clear();
+        }
+      }
+      else
+      {
+        // TODO: shift colSel according to the intersecting sequences
+        if (av.colSel == null)
+        {
+          av.colSel = new ColumnSelection(colsel);
+        }
+        else
+        {
+          av.colSel.setElementsFrom(colsel);
+        }
+      }
+      repaint |= av.isColSelChanged();
+    }
+    if (copycolsel && av.hasHiddenColumns
+            && (av.colSel == null || av.colSel.getHiddenColumns() == null))
+    {
+      System.err.println("Bad things");
+    }
+    if (repaint)
+    {
+      // probably finessing with multiple redraws here
+      PaintRefresher.Refresh(this, av.getSequenceSetId());
+      // ap.paintAlignment(false);
+    }
+  }
 
 }