JAL-3551 pull up Close Viewer dialog to base class
[jalview.git] / src / jalview / gui / PymolBindingModel.java
index af4afb0..fc957bb 100644 (file)
@@ -1,5 +1,10 @@
 package jalview.gui;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import jalview.api.AlignmentViewPanel;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
@@ -7,17 +12,20 @@ import jalview.ext.pymol.PymolCommands;
 import jalview.ext.pymol.PymolManager;
 import jalview.gui.StructureViewer.ViewerType;
 import jalview.structure.AtomSpec;
+import jalview.structure.StructureCommand;
 import jalview.structure.StructureCommandI;
 import jalview.structure.StructureSelectionManager;
 import jalview.structures.models.AAStructureBindingModel;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 public class PymolBindingModel extends AAStructureBindingModel
 {
+  /*
+   * format for labels shown on structures when mousing over sequence;
+   * see https://pymolwiki.org/index.php/Label#examples
+   * left not final so customisable e.g. with a Groovy script
+   */
+  private static String LABEL_FORMAT = "\"%s %s\" % (resn,resi)";
+
   private PymolManager pymolManager;
 
   private Thread pymolMonitor;
@@ -32,6 +40,8 @@ public class PymolBindingModel extends AAStructureBindingModel
    */
   Map<String, String> pymolObjects = new HashMap<>();
 
+  private String lastLabelSpec;
+
   /**
    * Constructor
    * 
@@ -59,6 +69,37 @@ public class PymolBindingModel extends AAStructureBindingModel
   @Override
   public void highlightAtoms(List<AtomSpec> atoms)
   {
+    /*
+     * https://pymolwiki.org/index.php/Label#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(),
+              atom.getPdbResNum()));
+    }
+    String labelSpec = sb.toString();
+    if (labelSpec.equals(lastLabelSpec))
+    {
+      return;
+    }
+    StructureCommandI command = new StructureCommand("label", labelSpec, LABEL_FORMAT);
+    executeCommand(command, false);
+
+    /*
+     * and remove the label(s) previously shown
+     */
+    if (lastLabelSpec != null)
+    {
+      command = new StructureCommand("label", lastLabelSpec, "");
+      executeCommand(command, false);
+    }
+
+    lastLabelSpec = labelSpec;
   }
 
   @Override
@@ -72,7 +113,7 @@ public class PymolBindingModel extends AAStructureBindingModel
   protected List<String> executeCommand(StructureCommandI command,
           boolean getReply)
   {
-    System.out.println(command.toString()); // debug
+    // System.out.println(command.toString()); // debug
     return pymolManager.sendCommand(command, getReply);
   }
 
@@ -88,30 +129,26 @@ public class PymolBindingModel extends AAStructureBindingModel
     return ViewerType.PYMOL;
   }
 
-  public boolean isPymolRunning()
+  @Override
+  public boolean isViewerRunning()
   {
     return pymolManager.isPymolLaunched();
   }
 
+  @Override
   public void closeViewer(boolean closePymol)
   {
-    getSsm().removeStructureViewerListener(this, this.getStructureFiles());
+    super.closeViewer(closePymol);
     if (closePymol)
     {
       pymolManager.exitPymol();
     }
-    // if (this.pymolListener != null)
-    // {
-    // pymolListener.shutdown();
-    // pymolListener = null;
-    // }
     pymolManager = null;
 
     if (pymolMonitor != null)
     {
       pymolMonitor.interrupt();
     }
-    releaseUIResources();
   }
 
   public boolean openSession(String pymolSessionFile)
@@ -173,4 +210,16 @@ public class PymolBindingModel extends AAStructureBindingModel
     return file;
   }
 
+  /**
+   * Returns the file extension to use for a saved viewer session file (.pse)
+   * 
+   * @return
+   * @see https://pymolwiki.org/index.php/Save
+   */
+  @Override
+  public String getSessionFileExtension()
+  {
+    return ".pse";
+  }
+
 }