Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / gui / PymolBindingModel.java
index 264a49c..62dce24 100644 (file)
@@ -1,3 +1,23 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.gui;
 
 import java.util.ArrayList;
@@ -6,6 +26,7 @@ import java.util.List;
 import java.util.Map;
 
 import jalview.api.AlignmentViewPanel;
+import jalview.bin.Console;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.ext.pymol.PymolCommands;
@@ -29,8 +50,6 @@ public class PymolBindingModel extends AAStructureBindingModel
 
   private PymolManager pymolManager;
 
-  private Thread pymolMonitor;
-
   /*
    * full paths to structure files opened in PyMOL
    */
@@ -71,16 +90,14 @@ public class PymolBindingModel extends AAStructureBindingModel
   public void highlightAtoms(List<AtomSpec> atoms)
   {
     /*
-     * https://pymolwiki.org/index.php/Label#examples
+     * https://pymolwiki.org/index.php/indicate#examples
      */
     StringBuilder sb = new StringBuilder();
     for (AtomSpec atom : atoms)
     {
       // todo promote to StructureCommandsI.showLabel()
-      // todo handle CA|P correctly
       String modelId = getModelIdForFile(atom.getPdbFile());
-      sb.append(String.format(" %s//%s/%d/CA", modelId,
-              atom.getChain(),
+      sb.append(String.format(" %s//%s/%d/*", modelId, atom.getChain(),
               atom.getPdbResNum()));
     }
     String labelSpec = sb.toString();
@@ -88,18 +105,9 @@ public class PymolBindingModel extends AAStructureBindingModel
     {
       return;
     }
-    StructureCommandI command = new StructureCommand("label", labelSpec, LABEL_FORMAT);
+    StructureCommandI command = new StructureCommand("indicate", labelSpec);
     executeCommand(command, false);
 
-    /*
-     * and remove the label(s) previously shown
-     */
-    if (lastLabelSpec != null)
-    {
-      command = new StructureCommand("label", lastLabelSpec, "");
-      executeCommand(command, false);
-    }
-
     lastLabelSpec = labelSpec;
   }
 
@@ -113,7 +121,7 @@ public class PymolBindingModel extends AAStructureBindingModel
   protected List<String> executeCommand(StructureCommandI command,
           boolean getReply)
   {
-    // System.out.println(command.toString()); // debug
+    // jalview.bin.Console.outPrintln(command.toString()); // debug
     return pymolManager.sendCommand(command, getReply);
   }
 
@@ -132,23 +140,14 @@ public class PymolBindingModel extends AAStructureBindingModel
   @Override
   public boolean isViewerRunning()
   {
-    return pymolManager.isPymolLaunched();
+    return pymolManager != null && pymolManager.isPymolLaunched();
   }
 
   @Override
   public void closeViewer(boolean closePymol)
   {
     super.closeViewer(closePymol);
-    if (closePymol)
-    {
-      pymolManager.exitPymol();
-    }
     pymolManager = null;
-
-    if (pymolMonitor != null)
-    {
-      pymolMonitor.interrupt();
-    }
   }
 
   public boolean launchPymol()
@@ -158,16 +157,17 @@ public class PymolBindingModel extends AAStructureBindingModel
       return true;
     }
 
-    boolean launched = pymolManager.launchPymol();
-    if (launched)
+    Process pymol = pymolManager.launchPymol();
+    if (pymol != null)
     {
       // start listening for PyMOL selections - how??
+      startExternalViewerMonitor(pymol);
     }
     else
     {
-      System.err.println("Failed to launch PyMOL!");
+      Console.error("Failed to launch PyMOL!");
     }
-    return launched;
+    return pymol != null;
   }
 
   public void openFile(PDBEntry pe)
@@ -180,6 +180,22 @@ public class PymolBindingModel extends AAStructureBindingModel
      * a second parameter sets the pdbid as the loaded PyMOL object name
      */
     String pdbId = pe.getId();
+    try
+    {
+      String safePDBId = java.net.URLEncoder.encode(pdbId, "UTF-8");
+      pdbId = safePDBId.replace('%', '_');
+      pdbId = pdbId.replace("-", "__");
+      char fc = pdbId.charAt(0);
+      // put an 's' before any numerics
+      if (fc >= '0' && fc <= '9')
+      {
+        pdbId = 's' + pdbId;
+      }
+      // pdbId.replace('-', 0)
+    } catch (Exception x)
+    {
+      Console.error("Unxpected encoding exception for '" + pdbId + "'", x);
+    }
     cmd.addParameter(pdbId);
 
     executeCommand(cmd, false);