Merge branch 'develop' of https://source.jalview.org/git/jalview.git into develop
[jalview.git] / src / jalview / structure / StructureSelectionManager.java
index ed5ee2d..156fc35 100644 (file)
  */
 package jalview.structure;
 
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+import MCview.Atom;
+import MCview.PDBChain;
+
 import jalview.analysis.AlignSeq;
 import jalview.api.StructureSelectionManagerProvider;
 import jalview.commands.CommandI;
@@ -36,20 +51,6 @@ import jalview.io.AppletFormatAdapter;
 import jalview.util.MappingUtils;
 import jalview.util.MessageManager;
 
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.IdentityHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Vector;
-
-import MCview.Atom;
-import MCview.PDBChain;
-
 public class StructureSelectionManager
 {
   static IdentityHashMap<StructureSelectionManagerProvider, StructureSelectionManager> instances;
@@ -581,53 +582,75 @@ public class StructureSelectionManager
     }
   }
 
+  /**
+   * Propagate mouseover of a single position in a structure
+   * 
+   * @param pdbResNum
+   * @param chain
+   * @param pdbfile
+   */
   public void mouseOverStructure(int pdbResNum, String chain, String pdbfile)
   {
+    AtomSpec atomSpec = new AtomSpec(pdbfile, chain, pdbResNum, 0);
+    List<AtomSpec> atoms = Collections.singletonList(atomSpec);
+    mouseOverStructure(atoms);
+  }
+
+  /**
+   * Propagate mouseover or selection of multiple positions in a structure
+   * 
+   * @param atoms
+   */
+  public void mouseOverStructure(List<AtomSpec> atoms)
+  {
     if (listeners == null)
     {
       // old or prematurely sent event
       return;
     }
-    SearchResults results = null;
-    SequenceI lastseq = null;
-    int lastipos = -1, indexpos;
+    boolean hasSequenceListener = false;
     for (int i = 0; i < listeners.size(); i++)
     {
       if (listeners.elementAt(i) instanceof SequenceListener)
       {
-        if (results == null)
-        {
-          results = new SearchResults();
-        }
-        for (StructureMapping sm : mappings)
+        hasSequenceListener = true;
+      }
+    }
+    if (!hasSequenceListener)
+    {
+      return;
+    }
+
+    SearchResults results = new SearchResults();
+    for (AtomSpec atom : atoms)
+    {
+      SequenceI lastseq = null;
+      int lastipos = -1;
+      for (StructureMapping sm : mappings)
+      {
+        if (sm.pdbfile.equals(atom.getPdbFile())
+                && sm.pdbchain.equals(atom.getChain()))
         {
-          if (sm.pdbfile.equals(pdbfile) && sm.pdbchain.equals(chain))
+          int indexpos = sm.getSeqPos(atom.getPdbResNum());
+          if (lastipos != indexpos && lastseq != sm.sequence)
           {
-            indexpos = sm.getSeqPos(pdbResNum);
-            if (lastipos != indexpos && lastseq != sm.sequence)
+            results.addResult(sm.sequence, indexpos, indexpos);
+            lastipos = indexpos;
+            lastseq = sm.sequence;
+            // construct highlighted sequence list
+            for (AlignedCodonFrame acf : seqmappings)
             {
-              results.addResult(sm.sequence, indexpos, indexpos);
-              lastipos = indexpos;
-              lastseq = sm.sequence;
-              // construct highlighted sequence list
-              for (AlignedCodonFrame acf : seqmappings)
-              {
-                acf.markMappedRegion(sm.sequence, indexpos, results);
-              }
+              acf.markMappedRegion(sm.sequence, indexpos, results);
             }
           }
         }
       }
     }
-    if (results != null)
+    for (Object li : listeners)
     {
-      for (int i = 0; i < listeners.size(); i++)
+      if (li instanceof SequenceListener)
       {
-        Object li = listeners.elementAt(i);
-        if (li instanceof SequenceListener)
-        {
-          ((SequenceListener) li).highlightSequence(results);
-        }
+        ((SequenceListener) li).highlightSequence(results);
       }
     }
   }