JAL-1807 merge from JAL-1759jmolUpdate
[jalview.git] / src / jalview / ext / jmol / JalviewJmolBinding.java
index cdd137b..c7496df 100644 (file)
  */
 package jalview.ext.jmol;
 
+import jalview.api.AlignmentViewPanel;
+import jalview.api.FeatureRenderer;
+import jalview.api.SequenceRenderer;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SequenceI;
+import jalview.io.AppletFormatAdapter;
+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 java.awt.Color;
 import java.awt.Container;
 import java.awt.event.ComponentEvent;
@@ -32,28 +47,17 @@ import java.util.List;
 import java.util.Map;
 import java.util.Vector;
 
+import javajs.awt.Dimension;
+
 import org.jmol.adapter.smarter.SmarterJmolAdapter;
 import org.jmol.api.JmolAppConsoleInterface;
 import org.jmol.api.JmolSelectionListener;
 import org.jmol.api.JmolStatusListener;
 import org.jmol.api.JmolViewer;
-import org.jmol.constant.EnumCallback;
-import org.jmol.popup.JmolPopup;
-
-import jalview.api.AlignmentViewPanel;
-import jalview.api.FeatureRenderer;
-import jalview.api.SequenceRenderer;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.ColumnSelection;
-import jalview.datamodel.PDBEntry;
-import jalview.datamodel.SequenceI;
-import jalview.io.AppletFormatAdapter;
-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 org.jmol.c.CBK;
+import org.jmol.script.T;
+import org.jmol.viewer.JC;
+import org.jmol.viewer.Viewer;
 
 public abstract class JalviewJmolBinding extends AAStructureBindingModel
         implements JmolStatusListener, JmolSelectionListener,
@@ -72,13 +76,11 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
    */
   private boolean associateNewStructs = false;
 
-  Vector atomsPicked = new Vector();
-
-  public Vector chainNames;
+  Vector<String> atomsPicked = new Vector<String>();
 
-  Hashtable chainFile;
+  public Vector<String> chainNames;
 
-  StringBuffer eval = new StringBuffer();
+  Hashtable<String, String> chainFile;
 
   public String fileLoadingError;
 
@@ -88,7 +90,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
    */
   int frameNo = 0;
 
-  protected JmolPopup jmolpopup;
+  // protected JmolGenericPopup jmolpopup; // not used - remove?
 
   String lastCommand;
 
@@ -103,7 +105,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
 
   StringBuffer resetLastRes = new StringBuffer();
 
-  public JmolViewer viewer;
+  public Viewer viewer;
 
   public JalviewJmolBinding(StructureSelectionManager ssm,
           PDBEntry[] pdbentry, SequenceI[][] sequenceIs, String[][] chains,
@@ -120,7 +122,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
   }
 
   public JalviewJmolBinding(StructureSelectionManager ssm,
-          SequenceI[][] seqs, JmolViewer theViewer)
+          SequenceI[][] seqs, Viewer theViewer)
   {
     super(ssm, seqs);
 
@@ -137,7 +139,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
    */
   public String getViewerTitle()
   {
-    return getViewerTitle("JMol", true);
+    return getViewerTitle("Jmol", true);
   }
 
   /**
@@ -147,15 +149,13 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
    * @param chainList
    *          list of chains to make visible
    */
-  public void centerViewer(Vector chainList)
+  public void centerViewer(Vector<String> chainList)
   {
-    StringBuffer cmd = new StringBuffer();
-    String lbl;
+    StringBuilder cmd = new StringBuilder(128);
     int mlength, p;
-    for (int i = 0, iSize = chainList.size(); i < iSize; i++)
+    for (String lbl : chainList)
     {
       mlength = 0;
-      lbl = (String) chainList.elementAt(i);
       do
       {
         p = mlength;
@@ -163,7 +163,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
       } 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((String) chainFile.get(lbl))) + " or ");
+              + (1 + getModelNum(chainFile.get(lbl))) + " or ");
     }
     if (cmd.length() > 0)
     {
@@ -174,7 +174,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
 
   public void closeViewer()
   {
-    viewer.setModeMouse(org.jmol.viewer.JmolConstants.MOUSE_NONE);
+    viewer.acm.setModeMouse(JC.MOUSE_NONE);
     // remove listeners for all structures in viewer
     getSsm().removeStructureViewerListener(this, this.getPdbFile());
     // and shut down jmol
@@ -489,9 +489,10 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
    * using the getFeatureRenderer() and getSequenceRenderer() renderers but only
    * if colourBySequence is enabled.
    */
-  public void colourBySequence(boolean showFeatures,
-          jalview.api.AlignmentViewPanel alignmentv)
+  public void colourBySequence(AlignmentViewPanel alignmentv)
   {
+    boolean showFeatures = alignmentv.getAlignViewport()
+            .isShowSequenceFeatures();
     if (!colourBySequence || !isLoadingFinished())
     {
       return;
@@ -586,7 +587,10 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
       return null;
     }
     // TODO: verify atomIndex is selecting correct model.
-    return new Color(viewer.getAtomArgb(atomIndex));
+    // return new Color(viewer.getAtomArgb(atomIndex)); Jmol 12.2.4
+    int colour = viewer.ms.at[atomIndex]
+            .atomPropertyInt(T.color);
+    return new Color(colour);
   }
 
   /**
@@ -642,26 +646,33 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     }
     if (modelFileNames == null)
     {
-
-      String mset[] = new String[viewer.getModelCount()];
+      String mset[] = new String[viewer.ms.mc];
       _modelFileNameMap = new int[mset.length];
-      int j = 1;
-      String m = viewer.getModelFileName(0);
+      String m = viewer.ms.getModelFileName(0);
       if (m != null)
       {
+        mset[0] = m;
         try
         {
           mset[0] = new File(m).getAbsolutePath();
         } catch (AccessControlException x)
         {
-          // usually not allowed to do this in applet, so keep raw handle
+          // usually not allowed to do this in applet
+          System.err
+                  .println("jmolBinding: Using local file string from Jmol: "
+                          + m);
+        }
+        if (mset[0].indexOf("/file:") != -1)
+        {
+          // applet path with docroot - discard as format won't match pdbfile
           mset[0] = m;
-          // System.err.println("jmolBinding: Using local file string from Jmol: "+m);
         }
       }
+      int j = 1;
       for (int i = 1; i < mset.length; i++)
       {
-        m = viewer.getModelFileName(i);
+        m = viewer.ms.getModelFileName(i);
+        mset[j] = m;
         if (m != null)
         {
           try
@@ -670,7 +681,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
           } catch (AccessControlException x)
           {
             // usually not allowed to do this in applet, so keep raw handle
-            mset[j] = m;
             // System.err.println("jmolBinding: Using local file string from Jmol: "+m);
           }
         }
@@ -714,7 +724,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
 
   public void handlePopupMenu(int x, int y)
   {
-    jmolpopup.show(x, y);
+    // jmolpopup.show(x, y);
+    // jmolpopup.jpiShow(x, y);
   }
 
   /**
@@ -744,12 +755,10 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
 
     // look up file model number for this pdbfile
     int mdlNum = 0;
-    String fn;
     // may need to adjust for URLencoding here - we don't worry about that yet.
     while (mdlNum < modelFileNames.length
             && !pdbfile.equals(modelFileNames[mdlNum]))
     {
-      // System.out.println("nomatch:"+pdbfile+"\nmodelfn:"+fn);
       mdlNum++;
     }
     if (mdlNum == modelFileNames.length)
@@ -765,31 +774,31 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
       viewer.evalStringQuiet(resetLastRes.toString());
     }
 
-    eval.setLength(0);
-    eval.append("select " + pdbResNum); // +modelNum
+    StringBuilder cmd = new StringBuilder(64);
+    cmd.append("select " + pdbResNum); // +modelNum
 
     resetLastRes.setLength(0);
     resetLastRes.append("select " + pdbResNum); // +modelNum
 
-    eval.append(":");
+    cmd.append(":");
     resetLastRes.append(":");
     if (!chain.equals(" "))
     {
-      eval.append(chain);
+      cmd.append(chain);
       resetLastRes.append(chain);
     }
     {
-      eval.append(" /" + (mdlNum + 1));
+      cmd.append(" /" + (mdlNum + 1));
       resetLastRes.append("/" + (mdlNum + 1));
     }
-    eval.append(";wireframe 100;" + eval.toString() + " and not hetero;");
+    cmd.append(";wireframe 100;" + cmd.toString() + " and not hetero;");
 
     resetLastRes.append(";wireframe 0;" + resetLastRes.toString()
             + " and not hetero; spacefill 0;");
 
-    eval.append("spacefill 200;select none");
+    cmd.append("spacefill 200;select none");
 
-    viewer.evalStringQuiet(eval.toString());
+    viewer.evalStringQuiet(cmd.toString());
     jmolHistory(true);
 
   }
@@ -877,7 +886,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
         pdbfilename = modelFileNames[_mp];
         if (pdbfilename == null)
         {
-          pdbfilename = new File(viewer.getModelFileName(mnumber))
+          pdbfilename = new File(
+                  viewer.ms.getModelFileName(mnumber))
                   .getAbsolutePath();
         }
 
@@ -965,7 +975,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
   }
 
   @Override
-  public void notifyCallback(EnumCallback type, Object[] data)
+  public void notifyCallback(CBK type, Object[] data)
   {
     try
     {
@@ -1019,7 +1029,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
   }
 
   @Override
-  public boolean notifyEnabled(EnumCallback callbackPick)
+  public boolean notifyEnabled(CBK callbackPick)
   {
     switch (callbackPick)
     {
@@ -1032,13 +1042,9 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     case HOVER:
     case ERROR:
       return true;
-    case RESIZE:
-    case SYNC:
-    case CLICK:
-    case ANIMFRAME:
-    case MINIMIZATION:
+    default:
+      return false;
     }
-    return false;
   }
 
   // incremented every time a load notification is successfully handled -
@@ -1069,8 +1075,8 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     fileLoadingError = null;
     String[] oldmodels = modelFileNames;
     modelFileNames = null;
-    chainNames = new Vector();
-    chainFile = new Hashtable();
+    chainNames = new Vector<String>();
+    chainFile = new Hashtable<String, String>();
     boolean notifyLoaded = false;
     String[] modelfilenames = getPdbFile();
     // first check if we've lost any structures
@@ -1114,7 +1120,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
       String fileName = modelfilenames[modelnum];
       boolean foundEntry = false;
       MCview.PDBfile pdb = null;
-      String pdbfile = null, pdbfhash = null;
+      String pdbfile = null;
       // model was probably loaded inline - so check the pdb file hashcode
       if (loadedInline)
       {
@@ -1123,7 +1129,6 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
         // 'best guess'
         pdbfile = viewer.getData("" + (1 + _modelFileNameMap[modelnum])
                 + ".0", "PDB");
-        pdbfhash = "" + pdbfile.hashCode();
       }
         // search pdbentries and sequences to find correct pdbentry for this
         // model
@@ -1144,9 +1149,9 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
         }
         else
         {
-          File fl;
-          if (matches = (fl = new File(getPdbEntry(pe).getFile()))
-                  .equals(new File(fileName)))
+          File fl = new File(getPdbEntry(pe).getFile());
+          matches = fl.equals(new File(fileName));
+          if (matches)
           {
             foundEntry = true;
             // TODO: Jmol can in principle retrieve from CLASSLOADER but
@@ -1204,11 +1209,11 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     }
     // FILE LOADED OK
     // so finally, update the jmol bits and pieces
-    if (jmolpopup != null)
-    {
-      // potential for deadlock here:
-      // jmolpopup.updateComputedMenus();
-    }
+    // if (jmolpopup != null)
+    // {
+    // // potential for deadlock here:
+    // // jmolpopup.updateComputedMenus();
+    // }
     if (!isLoadingFromArchive())
     {
       viewer.evalStringQuiet("model 0; select backbone;restrict;cartoon;wireframe off;spacefill off");
@@ -1360,12 +1365,14 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     {
       commandOptions = "";
     }
-    viewer = JmolViewer.allocateViewer(renderPanel,
+    viewer = (Viewer) JmolViewer.allocateViewer(renderPanel,
             (jmolfileio ? new SmarterJmolAdapter() : null), htmlName
                     + ((Object) this).toString(), documentBase, codeBase,
             commandOptions, this);
 
-    console = createJmolConsole(viewer, consolePanel, buttonsToShow);
+    viewer.setJmolStatusListener(this); // extends JmolCallbackListener
+
+    console = createJmolConsole(consolePanel, buttonsToShow);
     if (consolePanel != null)
     {
       consolePanel.addComponentListener(this);
@@ -1375,7 +1382,7 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
   }
 
   protected abstract JmolAppConsoleInterface createJmolConsole(
-          JmolViewer viewer2, Container consolePanel, String buttonsToShow);
+          Container consolePanel, String buttonsToShow);
 
   protected org.jmol.api.JmolAppConsoleInterface console = null;
 
@@ -1388,10 +1395,10 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
   }
 
   @Override
-  public void resizeInnerPanel(String data)
+  public Dimension resizeInnerPanel(String data)
   {
     // Jalview doesn't honour resize panel requests
-
+    return null;
   }
 
   public boolean isFinishedInit()
@@ -1458,3 +1465,4 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel
     showConsole(false);
   }
 }
+