JAL-2010 simple prototype of 'Highlight Selection' onto Chimera view
[jalview.git] / src / jalview / ext / rbvi / chimera / JalviewChimeraBinding.java
index eee8bca..af87e44 100644 (file)
@@ -108,7 +108,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
    */
   String[] modelFileNames = null;
 
-  String lastMousedOverAtomSpec;
+  String lastHighlightCommand;
 
   private List<String> lastReply;
 
@@ -818,8 +818,8 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
    * Construct and send a command to highlight zero, one or more atoms.
    * 
    * <pre>
-   * Done by generating a command like (to 'highlight' position 44)
-   *   show #0:44.C
+   * Done by generating a command like (to 'highlight' positions 44 and 46)
+   *   show #0:44,46.C
    * </pre>
    */
   @Override
@@ -829,8 +829,9 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
     {
       return;
     }
-    StringBuilder atomSpecs = new StringBuilder();
+    StringBuilder cmd = new StringBuilder(128);
     boolean first = true;
+    boolean found = false;
 
     for (AtomSpec atom : atoms)
     {
@@ -840,35 +841,42 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
       List<ChimeraModel> cms = chimeraMaps.get(pdbfile);
       if (cms != null && !cms.isEmpty())
       {
-        atomSpecs.append(first ? "" : ",");
+        if (first)
+        {
+          cmd.append("show #").append(cms.get(0).getModelNumber())
+                  .append(":");
+        }
+        else
+        {
+          cmd.append(",");
+        }
         first = false;
-        atomSpecs.append(cms.get(0).getModelNumber());
-        atomSpecs.append(":" + pdbResNum);
+        cmd.append(cms.get(0).getModelNumber()).append(":");
+        cmd.append(pdbResNum);
         if (!chain.equals(" "))
         {
-          atomSpecs.append("." + chain);
+          cmd.append(".").append(chain);
         }
+        found = true;
       }
     }
-    String atomSpec = atomSpecs.toString();
+    String command = cmd.toString();
 
     /*
      * Avoid repeated commands for the same residue
      */
-    if (atomSpec.equals(lastMousedOverAtomSpec))
+    if (command.equals(lastHighlightCommand))
     {
       return;
     }
 
-    StringBuilder command = new StringBuilder(32);
     viewerCommandHistory(false);
-    if (atomSpec.length() > 0)
+    if (found)
     {
-      command.append("show #").append(atomSpec);
       viewer.sendChimeraCommand(command.toString(), false);
     }
     viewerCommandHistory(true);
-    this.lastMousedOverAtomSpec = atomSpec;
+    this.lastHighlightCommand = command;
   }
 
   /**
@@ -1115,4 +1123,30 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
   {
     sendChimeraCommand("focus", false);
   }
+
+  /**
+   * Send a 'show' command for all atoms in the currently selected columns
+   * 
+   * @param vp
+   */
+  public void highlightSelection(AlignmentViewPanel vp)
+  {
+    List<Integer> cols = vp.getAlignViewport().getColumnSelection()
+            .getSelected();
+    AlignmentI alignment = vp.getAlignment();
+    StructureSelectionManager sm = getSsm();
+    for (SequenceI seq : alignment.getSequences())
+    {
+      /*
+       * convert selected columns into sequence positions
+       */
+      int[] positions = new int[cols.size()];
+      int i = 0;
+      for (Integer col : cols)
+      {
+        positions[i++] = seq.findPosition(col);
+      }
+      sm.highlightStructure(this, seq, positions);
+    }
+  }
 }