JAL-3390 Chimera showStructures() respects visible/chain selections
[jalview.git] / src / jalview / ext / rbvi / chimera / JalviewChimeraBinding.java
index 6fa06d2..1731a05 100644 (file)
@@ -32,7 +32,6 @@ import jalview.datamodel.SearchResultMatchI;
 import jalview.datamodel.SearchResultsI;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
-import jalview.datamodel.VisibleContigsIterator;
 import jalview.httpserver.AbstractRequestHandler;
 import jalview.io.DataSourceType;
 import jalview.schemes.ColourSchemeI;
@@ -54,6 +53,7 @@ import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.Collections;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -251,43 +251,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
   }
 
   /**
-   * Tells Chimera to display only the specified chains
-   * 
-   * @param toshow
-   */
-  public void showChains(List<String> toshow)
-  {
-    /*
-     * Construct a chimera command like
-     * 
-     * ~display #*;~ribbon #*;ribbon :.A,:.B
-     */
-    StringBuilder cmd = new StringBuilder(64);
-    boolean first = true;
-    for (String chain : toshow)
-    {
-      int modelNumber = getModelNoForChain(chain);
-      String showChainCmd = modelNumber == -1 ? ""
-              : modelNumber + ":." + chain.split(":")[1];
-      if (!first)
-      {
-        cmd.append(",");
-      }
-      cmd.append(showChainCmd);
-      first = false;
-    }
-
-    /*
-     * could append ";focus" to this command to resize the display to fill the
-     * window, but it looks more helpful not to (easier to relate chains to the
-     * whole)
-     */
-    final String command = "~display #*; ~ribbon #*; ribbon :"
-            + cmd.toString();
-    sendChimeraCommand(command, false);
-  }
-
-  /**
    * Close down the Jalview viewer and listener, and (optionally) the associated
    * Chimera window.
    */
@@ -1324,20 +1287,20 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
   }
 
   @Override
-  public void showStructures(AlignViewportI av)
+  public void showStructures(AlignViewportI av, boolean refocus)
   {
     StringBuilder cmd = new StringBuilder(128);
     cmd.append("~display; ~ribbon;");
-    if (isShowAlignmentOnly())
+    String atomSpec = getMappedResidues(av);
+    cmd.append("ribbon ").append(atomSpec);
+    if (!isShowAlignmentOnly())
     {
-      String atomSpec = getMappedResidues(av);
-      cmd.append("ribbon ").append(atomSpec);
+      cmd.append("chain @CA|P; ribbon");
     }
-    else
+    if (refocus)
     {
-      cmd.append("chain @CA|P; ribbon");
+      cmd.append("; focus");
     }
-    cmd.append("; focus");
     sendChimeraCommand(cmd.toString(), false);
   }
 
@@ -1382,10 +1345,21 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel
                   && alignment.findIndex(theSequence) > -1)
           {
             String chainCd = mapping.getChain();
-
-            // TODO only process sequence ranges within visible columns
-            VisibleContigsIterator visible = alignment.getHiddenColumns()
+            if (!isShowChain(mapping.getPdbId(), chainCd))
+            {
+              continue;
+            }
+            Iterator<int[]> visible;
+            if (isShowAlignmentOnly())
+            {
+              visible = alignment.getHiddenColumns()
                     .getVisContigsIterator(0, width, true);
+            }
+            else
+            {
+              visible = Collections.singletonList(new int[] { 0, width })
+                      .iterator();
+            }
             while (visible.hasNext())
             {
               int[] visibleRegion = visible.next();