javadoc
[jalview.git] / src / jalview / structure / StructureSelectionManager.java
index 0fb8428..0e4ec2f 100644 (file)
@@ -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.
@@ -73,6 +73,10 @@ public class StructureSelectionManager
 
   Vector listeners = new Vector();
 
+  /**
+   * register a listener for alignment sequence mouseover events
+   * @param svl
+   */
   public void addStructureViewerListener(Object svl)
   {
     if (!listeners.contains(svl))
@@ -209,7 +213,9 @@ public class StructureSelectionManager
 
       maxChain.transferRESNUMFeatures(sequence[s], null);
 
-      int[][] mapping = new int[sequence[s].getEnd() + 2][2];
+      // allocate enough slots to store the mapping from positions in
+      // sequence[s] to the associated chain
+      int[][] mapping = new int[maxChain.sequence.getEnd() + 2][2];
       int resNum = -10000;
       int index = 0;
 
@@ -300,6 +306,8 @@ public class StructureSelectionManager
   {
     boolean hasSequenceListeners = handlingVamsasMo || seqmappings != null;
     SearchResults results = null;
+    SequenceI lastseq = null;
+    int lastipos = -1, indexpos;
     for (int i = 0; i < listeners.size(); i++)
     {
       if (listeners.elementAt(i) instanceof SequenceListener)
@@ -308,7 +316,6 @@ public class StructureSelectionManager
         {
           results = new SearchResults();
         }
-        int indexpos;
         if (mappings != null)
         {
           for (int j = 0; j < mappings.length; j++)
@@ -317,19 +324,25 @@ public class StructureSelectionManager
                     && mappings[j].pdbchain.equals(chain))
             {
               indexpos = mappings[j].getSeqPos(pdbResNum);
-              results.addResult(mappings[j].sequence, indexpos, indexpos);
-              // construct highlighted sequence list
-              if (seqmappings != null)
+              if (lastipos != indexpos && lastseq != mappings[j].sequence)
               {
+                results.addResult(mappings[j].sequence, indexpos, indexpos);
+                lastipos = indexpos;
+                lastseq = mappings[j].sequence;
+                // construct highlighted sequence list
+                if (seqmappings != null)
+                {
 
-                Enumeration e = seqmappings.elements();
-                while (e.hasMoreElements())
+                  Enumeration e = seqmappings.elements();
+                  while (e.hasMoreElements())
 
-                {
-                  ((AlignedCodonFrame) e.nextElement()).markMappedRegion(
-                          mappings[j].sequence, indexpos, results);
+                  {
+                    ((AlignedCodonFrame) e.nextElement()).markMappedRegion(
+                            mappings[j].sequence, indexpos, results);
+                  }
                 }
               }
+
             }
           }
         }
@@ -359,7 +372,8 @@ public class StructureSelectionManager
    *          the sequence position (if -1, seq.findPosition is called to
    *          resolve the residue number)
    */
-  public void mouseOverSequence(SequenceI seq, int indexpos, int index)
+  public void mouseOverSequence(SequenceI seq, int indexpos, int index,
+          VamsasSource source)
   {
     boolean hasSequenceListeners = handlingVamsasMo || seqmappings != null;
     SearchResults results = null;
@@ -442,8 +456,8 @@ public class StructureSelectionManager
           // index);
           // pass the mouse over and absolute position onto the
           // VamsasListener(s)
-          ((VamsasListener) listeners.elementAt(i))
-                  .mouseOver(seq, indexpos);
+          ((VamsasListener) listeners.elementAt(i)).mouseOver(seq,
+                  indexpos, source);
         }
       }
     }
@@ -464,14 +478,15 @@ public class StructureSelectionManager
    * @param position
    *          in an alignment sequence
    */
-  public void mouseOverVamsasSequence(SequenceI sequenceI, int position)
+  public void mouseOverVamsasSequence(SequenceI sequenceI, int position,
+          VamsasSource source)
   {
     handlingVamsasMo = true;
     long msg = sequenceI.hashCode() * (1 + position);
     if (lastmsg != msg)
     {
       lastmsg = msg;
-      mouseOverSequence(sequenceI, position, -1);
+      mouseOverSequence(sequenceI, position, -1, source);
     }
     handlingVamsasMo = false;
   }