JAL-2422 fixed stopProgressBar (broken in pull up refactoring)
[jalview.git] / src / ext / edu / ucsf / rbvi / strucviz2 / ChimeraManager.java
index a322f0b..78103af 100644 (file)
@@ -334,7 +334,11 @@ public class ChimeraManager
 
   public void stopListening()
   {
-    sendChimeraCommand("listen stop models ; listen stop selection ", false);
+    // TODO send this command when viewer connection is closed in Jalview
+    String command = isChimeraX
+            ? "info notify stop models jalview; info notify stop selection jalview"
+            : "listen stop models ; listen stop selection ";
+    sendChimeraCommand(command, false);
   }
 
   /**
@@ -344,9 +348,23 @@ public class ChimeraManager
    */
   public void startListening(String uri)
   {
-    sendChimeraCommand("listen start models url " + uri
-            + ";listen start select prefix SelectionChanged url " + uri,
-            false);
+    /*
+     * listen for model changes
+     */
+    String command = isChimeraX
+            ? ("info notify start models prefix ModelChanged jalview url "
+                    + uri)
+            : ("listen start models url " + uri);
+    sendChimeraCommand(command, false);
+
+    /*
+     * listen for selection changes
+     */
+    command = isChimeraX
+            ? ("info notify start selection jalview prefix SelectionChanged url "
+                    + uri)
+            : ("listen start select prefix SelectionChanged url " + uri);
+    sendChimeraCommand(command, false);
   }
 
   /**
@@ -420,19 +438,34 @@ public class ChimeraManager
   public List<String> getSelectedResidueSpecs()
   {
     List<String> selectedResidues = new ArrayList<>();
-    List<String> chimeraReply = sendChimeraCommand(
-            "list selection level residue", true);
+
+    /*
+     * skip for now if ChimeraX - request times out
+     */
+    if (isChimeraX)
+    {
+      // return selectedResidues;
+    }
+
+    // in fact 'listinfo' (undocumented) works in ChimeraX
+    String command = (isChimeraX
+            ? "wait 1; view" /*"info selection level residue" */
+            : "list selection level residue");
+    List<String> chimeraReply = sendChimeraCommand(command, true);
     if (chimeraReply != null)
     {
       /*
-       * expect 0, 1 or more lines of the format
+       * expect 0, 1 or more lines of the format either
+       * Chimera:
        * residue id #0:43.A type GLY
-       * where we are only interested in the atomspec #0.43.A
+       * ChimeraX:
+       * residue id /A:89 name THR index 88
+       * We are only interested in the atomspec (third token of the reply)
        */
       for (String inputLine : chimeraReply)
       {
         String[] inputLineParts = inputLine.split("\\s+");
-        if (inputLineParts.length == 5)
+        if (inputLineParts.length >= 5)
         {
           selectedResidues.add(inputLineParts[2]);
         }
@@ -473,19 +506,24 @@ public class ChimeraManager
   public List<ChimeraModel> getModelList()
   {
     List<ChimeraModel> modelList = new ArrayList<>();
-    modelList.add(new ChimeraModel("4zhp", ModelType.PDB_MODEL, 1, 0));
-    return modelList; // ChimeraX doesn't have 'list models' command
-    // List<String> list = sendChimeraCommand("list models type molecule",
-    // true);
-    // if (list != null)
-    // {
-    // for (String modelLine : list)
-    // {
-    // ChimeraModel chimeraModel = new ChimeraModel(modelLine);
-    // modelList.add(chimeraModel);
-    // }
-    // }
-    // return modelList;
+    String command = "list models type "
+            + (isChimeraX ? "AtomicStructure" : "molecule");
+    List<String> list = sendChimeraCommand(command, true);
+    if (list != null)
+    {
+      for (String modelLine : list)
+      {
+        try
+        {
+          ChimeraModel chimeraModel = new ChimeraModel(modelLine);
+          modelList.add(chimeraModel);
+        } catch (NullPointerException e)
+        {
+          // hack for now
+        }
+      }
+    }
+    return modelList;
   }
 
   /**
@@ -722,7 +760,8 @@ public class ChimeraManager
   public List<String> getAttrList()
   {
     List<String> attributes = new ArrayList<>();
-    final List<String> reply = sendChimeraCommand("list resattr", true);
+    String command = (isChimeraX ? "info " : "list") + "resattr";
+    final List<String> reply = sendChimeraCommand(command, true);
     if (reply != null)
     {
       for (String inputLine : reply)
@@ -843,24 +882,23 @@ public class ChimeraManager
   {
     String restUrl = "http://127.0.0.1:" + this.chimeraRestPort + "/run";
     List<NameValuePair> commands = new ArrayList<>(1);
-    String encoded = command.replace(" ", "+").replace("#", "%23")
-            .replace("|", "%7C").replace(";", "%3B");
-    commands.add(new BasicNameValuePair("command", encoded));
+    String method = isChimeraX() ? "GET" : "POST";
+    if ("GET".equals(method))
+    {
+      command = command.replace(" ", "+").replace("#", "%23")
+              .replace("|", "%7C").replace(";", "%3B");
+    }
+    commands.add(new BasicNameValuePair("command", command));
 
     List<String> reply = new ArrayList<>();
     BufferedReader response = null;
     try
     {
-      if (isChimeraX())
-      {
-        response = HttpClientUtils.doHttpGet(restUrl, commands,
-                CONNECTION_TIMEOUT_MS, REST_REPLY_TIMEOUT_MS);
-      }
-      else
-      {
-        response = HttpClientUtils.doHttpUrlPost(restUrl, commands,
-                CONNECTION_TIMEOUT_MS, REST_REPLY_TIMEOUT_MS);
-      }
+      response = "GET".equals(method)
+              ? HttpClientUtils.doHttpGet(restUrl, commands,
+                      CONNECTION_TIMEOUT_MS, REST_REPLY_TIMEOUT_MS)
+              : HttpClientUtils.doHttpUrlPost(restUrl, commands,
+                      CONNECTION_TIMEOUT_MS, REST_REPLY_TIMEOUT_MS);
       String line = "";
       while ((line = response.readLine()) != null)
       {
@@ -937,4 +975,9 @@ public class ChimeraManager
   {
     return isChimeraX;
   }
+
+  public void setChimeraX(boolean b)
+  {
+    isChimeraX = b;
+  }
 }