*/\r
package jalview.ext.jmol;\r
\r
-import java.io.File;\r
-import java.net.URL;\r
-import java.util.*;\r
-import java.applet.Applet;\r
-import java.awt.*;\r
-import java.awt.event.*;\r
-\r
-import javax.swing.JPanel;\r
-\r
import jalview.api.AlignmentViewPanel;\r
import jalview.api.FeatureRenderer;\r
import jalview.api.SequenceRenderer;\r
import jalview.api.SequenceStructureBinding;\r
import jalview.api.StructureSelectionManagerProvider;\r
-import jalview.datamodel.*;\r
-import jalview.structure.*;\r
-import jalview.io.*;\r
+import jalview.datamodel.AlignmentI;\r
+import jalview.datamodel.ColumnSelection;\r
+import jalview.datamodel.PDBEntry;\r
+import jalview.datamodel.SequenceI;\r
+import jalview.io.AppletFormatAdapter;\r
+import jalview.schemes.ColourSchemeI;\r
+import jalview.schemes.ResidueProperties;\r
+import jalview.structure.StructureListener;\r
+import jalview.structure.StructureMapping;\r
+import jalview.structure.StructureSelectionManager;\r
+\r
+import java.awt.Color;\r
+import java.awt.Container;\r
+import java.awt.event.ComponentEvent;\r
+import java.awt.event.ComponentListener;\r
+import java.io.File;\r
+import java.net.URL;\r
+import java.security.AccessControlException;\r
+import java.util.Enumeration;\r
+import java.util.Hashtable;\r
+import java.util.Map;\r
+import java.util.Vector;\r
\r
-import org.jmol.api.*;\r
import org.jmol.adapter.smarter.SmarterJmolAdapter;\r
-\r
-import org.jmol.popup.*;\r
-import org.jmol.viewer.JmolConstants;\r
-import org.jmol.viewer.Viewer;\r
-\r
-import jalview.schemes.*;\r
+import org.jmol.api.JmolAppConsoleInterface;\r
+import org.jmol.api.JmolSelectionListener;\r
+import org.jmol.api.JmolStatusListener;\r
+import org.jmol.api.JmolViewer;\r
+import org.jmol.constant.EnumCallback;\r
+import org.jmol.popup.JmolPopup;\r
\r
public abstract class JalviewJmolBinding implements StructureListener,\r
JmolStatusListener, SequenceStructureBinding,\r
- JmolSelectionListener, ComponentListener, StructureSelectionManagerProvider\r
+ JmolSelectionListener, ComponentListener,\r
+ StructureSelectionManagerProvider\r
\r
{\r
/**\r
\r
public JmolViewer viewer;\r
\r
- public JalviewJmolBinding(StructureSelectionManager ssm, PDBEntry[] pdbentry, SequenceI[][] sequenceIs,\r
- String[][] chains, String protocol)\r
+ public JalviewJmolBinding(StructureSelectionManager ssm,\r
+ PDBEntry[] pdbentry, SequenceI[][] sequenceIs, String[][] chains,\r
+ String protocol)\r
{\r
this.ssm = ssm;\r
this.sequence = sequenceIs;\r
*/\r
}\r
\r
- public JalviewJmolBinding(StructureSelectionManager ssm, JmolViewer viewer2)\r
+ public JalviewJmolBinding(StructureSelectionManager ssm,\r
+ JmolViewer viewer2)\r
{\r
this.ssm = ssm;\r
viewer = viewer2;\r
for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)\r
{\r
StructureMapping[] mapping = ssm.getMapping(files[pdbfnum]);\r
-\r
+ // RACE CONDITION - getMapping only returns Jmol loaded filenames once\r
+ // Jmol callback has completed.\r
if (mapping == null || mapping.length < 1)\r
continue;\r
\r
}\r
AlignmentI alignment = alignmentv.getAlignment();\r
\r
- for (jalview.structure.StructureMappingcommandSet cpdbbyseq: JmolCommands.getColourBySequenceCommand(ssm, files, sequence, sr, fr, alignment))\r
- for (String cbyseq : cpdbbyseq.commands) {\r
- evalStateCommand(cbyseq);\r
- }\r
+ for (jalview.structure.StructureMappingcommandSet cpdbbyseq : JmolCommands\r
+ .getColourBySequenceCommand(ssm, files, sequence, sr, fr,\r
+ alignment))\r
+ for (String cbyseq : cpdbbyseq.commands)\r
+ {\r
+ evalStateCommand(cbyseq);\r
+ }\r
}\r
- \r
+\r
public boolean isColourBySequence()\r
{\r
return colourBySequence;\r
String mset[] = new String[viewer.getModelCount()];\r
_modelFileNameMap = new int[mset.length];\r
int j = 1;\r
- mset[0] = viewer.getModelFileName(0);\r
+ String m = viewer.getModelFileName(0);\r
+ if (m != null)\r
+ {\r
+ try\r
+ {\r
+ mset[0] = new File(m).getAbsolutePath();\r
+ } catch (AccessControlException x)\r
+ {\r
+ // usually not allowed to do this in applet, so keep raw handle\r
+ mset[0] = m;\r
+ // System.err.println("jmolBinding: Using local file string from Jmol: "+m);\r
+ }\r
+ }\r
for (int i = 1; i < mset.length; i++)\r
{\r
- mset[j] = viewer.getModelFileName(i);\r
+ m = viewer.getModelFileName(i);\r
+ if (m != null)\r
+ {\r
+ try\r
+ {\r
+ mset[j] = new File(m).getAbsolutePath();\r
+ } catch (AccessControlException x)\r
+ {\r
+ // usually not allowed to do this in applet, so keep raw handle\r
+ mset[j] = m;\r
+ // System.err.println("jmolBinding: Using local file string from Jmol: "+m);\r
+ }\r
+ }\r
_modelFileNameMap[j] = i; // record the model index for the filename\r
// skip any additional models in the same file (NMR structures)\r
if ((mset[j] == null ? mset[j] != mset[j - 1]\r
try\r
{\r
// recover PDB filename for the model hovered over.\r
- pdbfilename = viewer\r
- .getModelFileName(new Integer(mdlId).intValue() - 1);\r
+ int _mp = _modelFileNameMap.length - 1, mnumber = new Integer(mdlId)\r
+ .intValue() - 1;\r
+ while (mnumber < _modelFileNameMap[_mp])\r
+ {\r
+ _mp--;\r
+ }\r
+ pdbfilename = modelFileNames[_mp];\r
+ if (pdbfilename == null)\r
+ {\r
+ pdbfilename = new File(viewer.getModelFileName(mnumber))\r
+ .getAbsolutePath();\r
+ }\r
+\r
} catch (Exception e)\r
{\r
}\r
\r
}\r
\r
- public void notifyCallback(int type, Object[] data)\r
+ @Override\r
+ public void notifyCallback(EnumCallback type, Object[] data)\r
{\r
try\r
{\r
switch (type)\r
{\r
- case JmolConstants.CALLBACK_LOADSTRUCT:\r
+ case LOADSTRUCT:\r
notifyFileLoaded((String) data[1], (String) data[2],\r
(String) data[3], (String) data[4],\r
((Integer) data[5]).intValue());\r
\r
break;\r
- case JmolConstants.CALLBACK_PICK:\r
+ case PICK:\r
notifyAtomPicked(((Integer) data[2]).intValue(), (String) data[1],\r
(String) data[0]);\r
// also highlight in alignment\r
- case JmolConstants.CALLBACK_HOVER:\r
+ case HOVER:\r
notifyAtomHovered(((Integer) data[2]).intValue(), (String) data[1],\r
(String) data[0]);\r
break;\r
- case JmolConstants.CALLBACK_SCRIPT:\r
+ case SCRIPT:\r
notifyScriptTermination((String) data[2],\r
((Integer) data[3]).intValue());\r
break;\r
- case JmolConstants.CALLBACK_ECHO:\r
+ case ECHO:\r
sendConsoleEcho((String) data[1]);\r
break;\r
- case JmolConstants.CALLBACK_MESSAGE:\r
+ case MESSAGE:\r
sendConsoleMessage((data == null) ? ((String) null)\r
: (String) data[1]);\r
break;\r
- case JmolConstants.CALLBACK_ERROR:\r
+ case ERROR:\r
// System.err.println("Ignoring error callback.");\r
break;\r
- case JmolConstants.CALLBACK_SYNC:\r
- case JmolConstants.CALLBACK_RESIZE:\r
+ case SYNC:\r
+ case RESIZE:\r
refreshGUI();\r
break;\r
- case JmolConstants.CALLBACK_MEASURE:\r
+ case MEASURE:\r
\r
- case JmolConstants.CALLBACK_CLICK:\r
+ case CLICK:\r
default:\r
System.err.println("Unhandled callback " + type + " "\r
+ data[1].toString());\r
}\r
}\r
\r
- public boolean notifyEnabled(int callbackPick)\r
+ @Override\r
+ public boolean notifyEnabled(EnumCallback callbackPick)\r
{\r
switch (callbackPick)\r
{\r
- case JmolConstants.CALLBACK_ECHO:\r
- case JmolConstants.CALLBACK_LOADSTRUCT:\r
- case JmolConstants.CALLBACK_MEASURE:\r
- case JmolConstants.CALLBACK_MESSAGE:\r
- case JmolConstants.CALLBACK_PICK:\r
- case JmolConstants.CALLBACK_SCRIPT:\r
- case JmolConstants.CALLBACK_HOVER:\r
- case JmolConstants.CALLBACK_ERROR:\r
+ case ECHO:\r
+ case LOADSTRUCT:\r
+ case MEASURE:\r
+ case MESSAGE:\r
+ case PICK:\r
+ case SCRIPT:\r
+ case HOVER:\r
+ case ERROR:\r
return true;\r
- case JmolConstants.CALLBACK_RESIZE:\r
- case JmolConstants.CALLBACK_SYNC:\r
- case JmolConstants.CALLBACK_CLICK:\r
- case JmolConstants.CALLBACK_ANIMFRAME:\r
- case JmolConstants.CALLBACK_MINIMIZATION:\r
+ case RESIZE:\r
+ case SYNC:\r
+ case CLICK:\r
+ case ANIMFRAME:\r
+ case MINIMIZATION:\r
}\r
return false;\r
}\r
}\r
else\r
{\r
- if (matches = pdbentry[pe].getFile().equals(fileName))\r
+ File fl;\r
+ if (matches = (fl = new File(pdbentry[pe].getFile()))\r
+ .equals(new File(fileName)))\r
{\r
foundEntry = true;\r
// TODO: Jmol can in principle retrieve from CLASSLOADER but\r
String protocol = AppletFormatAdapter.URL;\r
try\r
{\r
- File fl = new java.io.File(pdbentry[pe].getFile());\r
if (fl.exists())\r
{\r
protocol = AppletFormatAdapter.FILE;\r
} catch (Error e)\r
{\r
}\r
- ;\r
- pdb = ssm.setMapping(sequence[pe], chains[pe],\r
- pdbentry[pe].getFile(), protocol);\r
+ // Explicitly map to the filename used by Jmol ;\r
+ pdb = ssm.setMapping(sequence[pe], chains[pe], fileName,\r
+ protocol);\r
+ // pdbentry[pe].getFile(), protocol);\r
\r
}\r
}\r
{\r
String chid = new String(pdb.id + ":"\r
+ ((MCview.PDBChain) pdb.chains.elementAt(i)).id);\r
- chainFile.put(chid, pdbentry[pe].getFile());\r
+ chainFile.put(chid, fileName);\r
chainNames.addElement(chid);\r
}\r
notifyLoaded = true;\r
String commandOptions, final Container consolePanel,\r
String buttonsToShow)\r
{\r
- if (commandOptions==null) {
- commandOptions="";
- }
+ if (commandOptions == null)\r
+ {\r
+ commandOptions = "";\r
+ }\r
viewer = JmolViewer.allocateViewer(renderPanel,\r
(jmolfileio ? new SmarterJmolAdapter() : null), htmlName\r
+ ((Object) this).toString(), documentBase, codeBase,\r
chains[pe] = null;\r
}\r
}\r
+\r
/**\r
* \r
* @param pdbfile\r
- * @return text report of alignment between pdbfile and any associated alignment sequences\r
+ * @return text report of alignment between pdbfile and any associated\r
+ * alignment sequences\r
*/\r
public String printMapping(String pdbfile)\r
{\r
return ssm.printMapping(pdbfile);\r
}\r
\r
+ @Override\r
+ public void resizeInnerPanel(String data)\r
+ {\r
+ // Jalview doesn't honour resize panel requests\r
+\r
+ }\r
}\r