JAL-2422 pull-up refactoring of structure commands (continued)
[jalview.git] / src / jalview / ext / jmol / JalviewJmolBinding.java
index e19bb29..9b8fb91 100644 (file)
@@ -20,9 +20,7 @@
  */
 package jalview.ext.jmol;
 
-import jalview.api.AlignmentViewPanel;
 import jalview.api.FeatureRenderer;
-import jalview.api.SequenceRenderer;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.PDBEntry;
@@ -30,15 +28,11 @@ import jalview.datamodel.SequenceI;
 import jalview.gui.IProgressIndicator;
 import jalview.io.DataSourceType;
 import jalview.io.StructureFile;
-import jalview.schemes.ColourSchemeI;
-import jalview.schemes.ResidueProperties;
 import jalview.structure.AtomSpec;
-import jalview.structure.StructureMappingcommandSet;
 import jalview.structure.StructureSelectionManager;
 import jalview.structures.models.AAStructureBindingModel;
 import jalview.util.MessageManager;
 
-import java.awt.Color;
 import java.awt.Container;
 import java.awt.event.ComponentEvent;
 import java.awt.event.ComponentListener;
@@ -46,7 +40,6 @@ import java.io.File;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.BitSet;
-import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
@@ -58,7 +51,6 @@ import org.jmol.api.JmolSelectionListener;
 import org.jmol.api.JmolStatusListener;
 import org.jmol.api.JmolViewer;
 import org.jmol.c.CBK;
-import org.jmol.script.T;
 import org.jmol.viewer.Viewer;
 
 public abstract class JalviewJmolBinding extends AAStructureBindingModel
@@ -77,10 +69,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
 
   Vector<String> atomsPicked = new Vector<>();
 
-  private List<String> chainNames;
-
-  Hashtable<String, String> chainFile;
-
   /*
    * the default or current model displayed if the model cannot be identified
    * from the selection message
@@ -102,6 +90,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
           DataSourceType protocol)
   {
     super(ssm, pdbentry, sequenceIs, protocol);
+    setStructureCommands(new JmolCommands());
     /*
      * viewer = JmolViewer.allocateViewer(renderPanel, new SmarterJmolAdapter(),
      * "jalviewJmol", ap.av.applet .getDocumentBase(),
@@ -119,6 +108,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     jmolViewer = theViewer;
     jmolViewer.setJmolStatusListener(this);
     jmolViewer.addSelectionListener(this);
+    setStructureCommands(new JmolCommands());
   }
 
   /**
@@ -132,36 +122,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     return getViewerTitle("Jmol", true);
   }
 
-  /**
-   * prepare the view for a given set of models/chains. chainList contains
-   * strings of the form 'pdbfilename:Chaincode'
-   * 
-   * @param chainList
-   *          list of chains to make visible
-   */
-  public void centerViewer(Vector<String> chainList)
-  {
-    StringBuilder cmd = new StringBuilder(128);
-    int mlength, p;
-    for (String lbl : chainList)
-    {
-      mlength = 0;
-      do
-      {
-        p = mlength;
-        mlength = lbl.indexOf(":", p);
-      } while (p < mlength && mlength < (lbl.length() - 2));
-      // TODO: lookup each pdb id and recover proper model number for it.
-      cmd.append(":" + lbl.substring(mlength + 1) + " /"
-              + (1 + getModelNum(chainFile.get(lbl))) + " or ");
-    }
-    if (cmd.length() > 0)
-    {
-      cmd.setLength(cmd.length() - 4);
-    }
-    evalStateCommand("select *;restrict " + cmd + ";cartoon;center " + cmd);
-  }
-
   public void closeViewer()
   {
     // remove listeners for all structures in viewer
@@ -172,24 +132,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     releaseUIResources();
   }
 
-  @Override
-  public void colourByChain()
-  {
-    colourBySequence = false;
-    // TODO: colour by chain should colour each chain distinctly across all
-    // visible models
-    // TODO: http://issues.jalview.org/browse/JAL-628
-    evalStateCommand("select *;color chain");
-  }
-
-  @Override
-  public void colourByCharge()
-  {
-    colourBySequence = false;
-    evalStateCommand("select *;color white;select ASP,GLU;color red;"
-            + "select LYS,ARG;color blue;select CYS;color yellow");
-  }
-
   /**
    * superpose the structures associated with sequences in the alignment
    * according to their corresponding positions.
@@ -442,13 +384,13 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
       {
         // TODO is performing selectioncom redundant here? is done later on
         // System.out.println("Select regions:\n" + selectioncom.toString());
-        evalStateCommand("select *; cartoons off; backbone; select ("
-                + selectioncom.toString() + "); cartoons; ");
+        executeCommand("select *; cartoons off; backbone; select ("
+                + selectioncom.toString() + "); cartoons; ", false);
         // selcom.append("; ribbons; ");
         String cmdString = command.toString();
         // System.out.println("Superimpose command(s):\n" + cmdString);
 
-        evalStateCommand(cmdString);
+        executeCommand(cmdString, false);
       }
     }
     if (selectioncom.length() > 0)
@@ -458,8 +400,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
         selectioncom.setLength(selectioncom.length() - 1);
       }
       // System.out.println("Select regions:\n" + selectioncom.toString());
-      evalStateCommand("select *; cartoons off; backbone; select ("
-              + selectioncom.toString() + "); cartoons; ");
+      executeCommand("select *; cartoons off; backbone; select ("
+              + selectioncom.toString() + "); cartoons; ", false);
       // evalStateCommand("select *; backbone; select "+selcom.toString()+";
       // cartoons; center "+selcom.toString());
     }
@@ -467,8 +409,13 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     return null;
   }
 
-  public void evalStateCommand(String command)
+  @Override
+  public List<String> executeCommand(String command, boolean getReply)
   {
+    if (command == null)
+    {
+      return null;
+    }
     jmolHistory(false);
     if (lastCommand == null || !lastCommand.equals(command))
     {
@@ -476,60 +423,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     }
     jmolHistory(true);
     lastCommand = command;
-  }
-
-  Thread colourby = null;
-  /**
-   * Sends a set of colour commands to the structure viewer
-   * 
-   * @param colourBySequenceCommands
-   */
-  @Override
-  protected void colourBySequence(
-          final StructureMappingcommandSet[] colourBySequenceCommands)
-  {
-    if (colourby != null)
-    {
-      colourby.interrupt();
-      colourby = null;
-    }
-    colourby = new Thread(new Runnable()
-    {
-      @Override
-      public void run()
-      {
-        for (StructureMappingcommandSet cpdbbyseq : colourBySequenceCommands)
-        {
-          for (String cbyseq : cpdbbyseq.commands)
-          {
-            executeWhenReady(cbyseq);
-          }
-        }
-      }
-    });
-    colourby.start();
-  }
-
-  /**
-   * @param files
-   * @param sr
-   * @param viewPanel
-   * @return
-   */
-  @Override
-  protected StructureMappingcommandSet[] getColourBySequenceCommands(
-          String[] files, SequenceRenderer sr, AlignmentViewPanel viewPanel)
-  {
-    return JmolCommands.getColourBySequenceCommand(getSsm(), files,
-            getSequence(), sr, viewPanel);
-  }
-
-  /**
-   * @param command
-   */
-  protected void executeWhenReady(String command)
-  {
-    evalStateCommand(command);
+    return null;
   }
 
   public void createImage(String file, String type, int quality)
@@ -570,19 +464,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     return null;
   }
 
-  public Color getColour(int atomIndex, int pdbResNum, String chain,
-          String pdbfile)
-  {
-    if (getModelNum(pdbfile) < 0)
-    {
-      return null;
-    }
-    // TODO: verify atomIndex is selecting correct model.
-    // return new Color(viewer.getAtomArgb(atomIndex)); Jmol 12.2.4
-    int colour = jmolViewer.ms.at[atomIndex].atomPropertyInt(T.color);
-    return new Color(colour);
-  }
-
   /**
    * instruct the Jalview binding to update the pdbentries vector if necessary
    * prior to matching the jmol view's contents to the list of structure files
@@ -590,23 +471,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
    */
   public abstract void refreshPdbEntries();
 
-  private int getModelNum(String modelFileName)
-  {
-    String[] mfn = getStructureFiles();
-    if (mfn == null)
-    {
-      return -1;
-    }
-    for (int i = 0; i < mfn.length; i++)
-    {
-      if (mfn[i].equalsIgnoreCase(modelFileName))
-      {
-        return i;
-      }
-    }
-    return -1;
-  }
-
   /**
    * map between index of model filename returned from getPdbFile and the first
    * index of models from this file in the viewer. Note - this is not trimmed -
@@ -854,7 +718,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
       sb.append(";set hoverLabel \"").append(toks.nextToken()).append(" ")
               .append(toks.nextToken());
       sb.append("|").append(label).append("\"");
-      evalStateCommand(sb.toString());
+      executeCommand(sb.toString(), false);
     }
   }
 
@@ -1036,8 +900,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     fileLoadingError = null;
     String[] oldmodels = modelFileNames;
     modelFileNames = null;
-    chainNames = new ArrayList<>();
-    chainFile = new Hashtable<>();
     boolean notifyLoaded = false;
     String[] modelfilenames = getStructureFiles();
     // first check if we've lost any structures
@@ -1146,10 +1008,10 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
           // add an entry for every chain in the model
           for (int i = 0; i < pdb.getChains().size(); i++)
           {
-            String chid = new String(
-                    pdb.getId() + ":" + pdb.getChains().elementAt(i).id);
-            chainFile.put(chid, fileName);
-            chainNames.add(chid);
+            String chid = pdb.getId() + ":"
+                    + pdb.getChains().elementAt(i).id;
+            addChainFile(chid, fileName);
+            getChainNames().add(chid);
           }
           notifyLoaded = true;
         }
@@ -1198,12 +1060,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     setLoadingFromArchive(false);
   }
 
-  @Override
-  public List<String> getChainNames()
-  {
-    return chainNames;
-  }
-
   protected IProgressIndicator getIProgressIndicator()
   {
     return null;
@@ -1248,35 +1104,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
 
   }
 
-  @Override
-  public void setJalviewColourScheme(ColourSchemeI cs)
-  {
-    colourBySequence = false;
-
-    if (cs == null)
-    {
-      return;
-    }
-
-    jmolHistory(false);
-    StringBuilder command = new StringBuilder(128);
-    command.append("select *;color white;");
-    List<String> residueSet = ResidueProperties.getResidues(isNucleotide(),
-            false);
-    for (String resName : residueSet)
-    {
-      char res = resName.length() == 3
-              ? ResidueProperties.getSingleCharacterCode(resName)
-              : resName.charAt(0);
-      Color col = cs.findColour(res, 0, null, null, 0f);
-      command.append("select " + resName + ";color[" + col.getRed() + ","
-              + col.getGreen() + "," + col.getBlue() + "];");
-    }
-
-    evalStateCommand(command.toString());
-    jmolHistory(true);
-  }
-
   public void showHelp()
   {
     showUrl("http://jmol.sourceforge.net/docs/JmolUserGuide/", "jmolHelp");
@@ -1367,15 +1194,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
   protected org.jmol.api.JmolAppConsoleInterface console = null;
 
   @Override
-  public void setBackgroundColour(java.awt.Color col)
-  {
-    jmolHistory(false);
-    jmolViewer.evalStringQuiet("background [" + col.getRed() + ","
-            + col.getGreen() + "," + col.getBlue() + "];");
-    jmolHistory(true);
-  }
-
-  @Override
   public int[] resizeInnerPanel(String data)
   {
     // Jalview doesn't honour resize panel requests
@@ -1435,4 +1253,22 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
   {
     showConsole(false);
   }
+
+  @Override
+  protected int getModelNoForFile(String pdbFile)
+  {
+    if (modelFileNames == null)
+    {
+      return -1;
+    }
+    for (int i = 0; i < modelFileNames.length; i++)
+    {
+      if (modelFileNames[i].equalsIgnoreCase(pdbFile))
+      {
+        return i;
+      }
+    }
+    return -1;
+
+  }
 }