Merge branch 'develop' into feature/JAL-3390hideUnmappedStructure
[jalview.git] / src / jalview / ext / jmol / JmolCommands.java
index 25f6aec..1083dfa 100644 (file)
@@ -51,6 +51,8 @@ import jalview.util.Platform;
  */
 public class JmolCommands extends StructureCommandsBase
 {
+  private static final String COMMA = ",";
+
   private static final StructureCommand SHOW_BACKBONE = new StructureCommand(
           "select *; cartoons off; backbone");
 
@@ -75,17 +77,6 @@ public class JmolCommands extends StructureCommandsBase
   private static final String SLASH = "/";
 
   /**
-   * {@inheritDoc}
-   * 
-   * @return
-   */
-  @Override
-  public int getModelStartNo()
-  {
-    return 1;
-  }
-
-  /**
    * Returns a string representation of the given colour suitable for inclusion
    * in Jmol commands
    * 
@@ -131,31 +122,6 @@ public class JmolCommands extends StructureCommandsBase
     return FOCUS_VIEW;
   }
 
-  @Override
-  public List<StructureCommandI> showChains(List<String> toShow)
-  {
-    StringBuilder atomSpec = new StringBuilder(128);
-    boolean first = true;
-    for (String chain : toShow)
-    {
-      String[] tokens = chain.split(":");
-      if (tokens.length == 2)
-      {
-        if (!first)
-        {
-          atomSpec.append(" or ");
-        }
-        first = false;
-        atomSpec.append(":").append(tokens[1]).append(" /").append(tokens[0]);
-      }
-    }
-
-    String spec = atomSpec.toString();
-    String command = "select *;restrict " + spec + ";cartoon;center "
-            + spec;
-    return Arrays.asList(new StructureCommand(command));
-  }
-
   /**
    * Returns a command to superpose atoms in {@code atomSpec} to those in
    * {@code refAtoms}, restricted to alpha carbons only (Phosphorous for rna).
@@ -243,9 +209,13 @@ public class JmolCommands extends StructureCommandsBase
    * Generates a Jmol atomspec string like
    * 
    * <pre>
-   * 2-5:A/1.1,8:A/1.1,5-10:B/2.1
+   * (61-64,70)&:A/1.1,(12-25,41-44)&:B/1.1,12:A/2.1
+   * for model 1, chain A, residues 61-64 and 70, chain B residues 12-25 and 41-44, model 2 chain A residue 12
    * </pre>
    * 
+   * Note the brackets to group multiple residue ranges for the same chain
+   * (without bracketing, ranges would apply to all chains)
+   * 
    * Parameter {@code alphaOnly} is not used here - this restriction is made by
    * a separate clause in the {@code compare} (superposition) command.
    */
@@ -254,29 +224,42 @@ public class JmolCommands extends StructureCommandsBase
   {
     StringBuilder sb = new StringBuilder(128);
 
-    boolean first = true;
+    boolean firstChain = true;
     for (String modelNo : model.getModels())
     {
       for (String chain : model.getChains(modelNo))
       {
-        for (int[] range : model.getRanges(modelNo, chain))
+        if (!firstChain)
         {
-          if (!first)
-          {
-            sb.append(PIPE);
-          }
-          first = false;
-          if (range[0] == range[1])
+          sb.append(COMMA);
+        }
+        firstChain = false;
+        List<int[]> rangeList = model.getRanges(modelNo, chain);
+        if (rangeList.size() > 1)
+        {
+          sb.append("(");
+        }
+        boolean firstRange = true;
+        for (int[] range : rangeList)
+        {
+          if (!firstRange)
           {
-            sb.append(range[0]);
+            sb.append(COMMA);
           }
-          else
+          firstRange = false;
+          firstChain = false;
+          sb.append(range[0]);
+          if (range[0] != range[1])
           {
-            sb.append(range[0]).append(HYPHEN).append(range[1]);
+            sb.append(HYPHEN).append(range[1]);
           }
-          sb.append(COLON).append(chain.trim()).append(SLASH);
-          sb.append(String.valueOf(modelNo)).append(".1");
         }
+        if (rangeList.size() > 1)
+        {
+          sb.append(")&");
+        }
+        sb.append(COLON).append(chain.trim()).append(SLASH);
+        sb.append(String.valueOf(modelNo)).append(".1");
       }
     }
 
@@ -477,6 +460,29 @@ public class JmolCommands extends StructureCommandsBase
   }
 
   @Override
+  public StructureCommandI showStructures(AtomSpecModel restrictTo)
+  {
+    if (restrictTo == null)
+    {
+      return new StructureCommand("display *; cartoon only");
+    }
+    String atomSpec = getAtomSpec(restrictTo, false);
+    String cmd = "display " + atomSpec + "; select displayed; cartoon only";
+    return new StructureCommand(cmd);
+  }
+
+  @Override
+  public StructureCommandI hideChain(String modelId, String chainId)
+  {
+    return new StructureCommand("hide add :" + chainId + "/" + modelId);
+  }
+
+  @Override
+  public StructureCommandI hideAll()
+  {
+    return new StructureCommand("hide *");
+  }
+
   public StructureCommandI closeViewer()
   {
     return null; // not an external viewer