X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fjavascript%2FMouseOverStructureListener.java;h=e90b9681a13ea6cfe21d5f26138a0be9b5018202;hb=57738a1f3c19b1c3a00bd3ac5108f8cd0af32f99;hp=4db44e12b851d5054387b729f29d5f17b2dcf6ab;hpb=ad15cff29620f960119f80176f1fd443da9f6763;p=jalview.git diff --git a/src/jalview/javascript/MouseOverStructureListener.java b/src/jalview/javascript/MouseOverStructureListener.java index 4db44e1..e90b968 100644 --- a/src/jalview/javascript/MouseOverStructureListener.java +++ b/src/jalview/javascript/MouseOverStructureListener.java @@ -20,9 +20,6 @@ */ package jalview.javascript; -import java.awt.Color; -import java.util.ArrayList; - import jalview.api.AlignmentViewPanel; import jalview.api.FeatureRenderer; import jalview.api.SequenceRenderer; @@ -30,10 +27,14 @@ import jalview.appletgui.AlignFrame; import jalview.bin.JalviewLite; import jalview.datamodel.SequenceI; import jalview.ext.jmol.JmolCommands; +import jalview.structure.AtomSpec; import jalview.structure.StructureListener; import jalview.structure.StructureMapping; -import jalview.structure.StructureMappingcommandSet; import jalview.structure.StructureSelectionManager; +import jalview.util.HttpUtils; + +import java.util.ArrayList; +import java.util.List; /** * Propagate events involving PDB structures associated with sequences to a @@ -68,8 +69,8 @@ import jalview.structure.StructureSelectionManager; * @author Jim Procter (jprocter) * */ -public class MouseOverStructureListener extends JSFunctionExec implements - JsCallBack, StructureListener +public class MouseOverStructureListener extends JSFunctionExec + implements JsCallBack, StructureListener { String _listenerfn; @@ -86,54 +87,49 @@ public class MouseOverStructureListener extends JSFunctionExec implements { for (int i = 0; i < modelSet.length; i++) { - // resolve a real filename - try - { - if (new java.net.URL(modelSet[i]).openConnection() != null) - { - continue; - } - } catch (Exception x) - { - } - ; - try - { - String db = jvlite.getDocumentBase().toString(); - db = db.substring(0, db.lastIndexOf("/")); - if (new java.net.URL(db + "/" + modelSet[i]).openConnection() != null) - { - modelSet[i] = db + "/" + modelSet[i]; - continue; - } - } catch (Exception x) - { - } - ; - try - { - if (new java.net.URL(jvlite.getCodeBase() + modelSet[i]) - .openConnection() != null) - { - modelSet[i] = jvlite.getCodeBase() + modelSet[i]; - continue; - } - } catch (Exception x) - { - } - ; - + modelSet[i] = resolveModelFile(modelSet[i]); } } } + /** + * Returns the first out of: file, file prefixed by document base, or file + * prefixed by codebase which can be resolved to a valid URL. If none can, + * returns the input parameter value. + * + * @param file + */ + public String resolveModelFile(String file) + { + // TODO reuse JalviewLite.LoadingThread.addProtocol instead + if (HttpUtils.isValidUrl(file)) + { + return file; + } + + String db = jvlite.getDocumentBase().toString(); + db = db.substring(0, db.lastIndexOf("/")); + String docBaseFile = db + "/" + file; + if (HttpUtils.isValidUrl(docBaseFile)) + { + return docBaseFile; + } + + String cb = jvlite.getCodeBase() + file; + if (HttpUtils.isValidUrl(cb)) + { + return cb; + } + + return file; + } + @Override - public String[] getPdbFile() + public String[] getStructureFiles() { return modelSet; } - @Override public void mouseOverStructure(int atomIndex, String strInfo) { @@ -144,24 +140,27 @@ public class MouseOverStructureListener extends JSFunctionExec implements } @Override - public void highlightAtom(int atomIndex, int pdbResNum, String chain, - String pdbId) + public void highlightAtoms(List atoms) { - String[] st = new String[0]; - try + for (AtomSpec atom : atoms) { - executeJavascriptFunction(_listenerfn, st = new String[] - { "mouseover", "" + pdbId, "" + chain, "" + (pdbResNum), - "" + atomIndex }); - } catch (Exception ex) - { - System.err.println("Couldn't execute callback with " + _listenerfn - + " using args { " + st[0] + ", " + st[1] + ", " + st[2] - + "," + st[3] + "\n"); - ex.printStackTrace(); - + try + { + // TODO is this right? StructureSelectionManager passes pdbFile as the + // field that is interpreted (in 2.8.2) as pdbId? + // JBPComment: yep - this is right! the Javascript harness uses the + // absolute pdbFile URI to locate the PDB file in the external viewer + executeJavascriptFunction(_listenerfn, + new String[] + { "mouseover", "" + atom.getPdbFile(), "" + atom.getChain(), + "" + (atom.getPdbResNum()), "" + atom.getAtomIndex() }); + } catch (Exception ex) + { + System.err.println("Couldn't execute callback with " + _listenerfn + + " for atomSpec: " + atom); + ex.printStackTrace(); + } } - } @Override @@ -170,10 +169,14 @@ public class MouseOverStructureListener extends JSFunctionExec implements final Object source = srce; StructureSelectionManager ssm = StructureSelectionManager .getStructureSelectionManager(jvlite); - // if (jvlite.debug) - // { - // ssm.reportMapping(); - // } + + if (JalviewLite.debug) + { + System.err.println( + this.getClass().getName() + " modelSet[0]: " + modelSet[0]); + ssm.reportMapping(); + } + if (source instanceof jalview.api.AlignmentViewPanel) { SequenceI[][] sequence = new SequenceI[modelSet.length][]; @@ -202,33 +205,35 @@ public class MouseOverStructureListener extends JSFunctionExec implements SequenceRenderer sr = ((jalview.appletgui.AlignmentPanel) source) .getSequenceRenderer(); FeatureRenderer fr = ((jalview.appletgui.AlignmentPanel) source).av - .isShowSequenceFeatures() ? new jalview.appletgui.FeatureRenderer( - ((jalview.appletgui.AlignmentPanel) source).av) : null; + .isShowSequenceFeatures() + ? new jalview.appletgui.FeatureRenderer( + ((jalview.appletgui.AlignmentPanel) source).av) + : null; if (fr != null) { - ((jalview.appletgui.FeatureRenderer) fr) - .transferSettings(((jalview.appletgui.AlignmentPanel) source) + ((jalview.appletgui.FeatureRenderer) fr).transferSettings( + ((jalview.appletgui.AlignmentPanel) source) .getFeatureRenderer()); } ; // Form a colour command from the given alignment panel for each distinct // structure - ArrayList ccomands = new ArrayList(); - ArrayList pdbfn = new ArrayList(); - StructureMappingcommandSet[] colcommands = JmolCommands - .getColourBySequenceCommand(ssm, modelSet, sequence, sr, fr, - ((AlignmentViewPanel) source).getAlignment()); + ArrayList ccomands = new ArrayList<>(); + ArrayList pdbfn = new ArrayList<>(); + String[] colcommands = new JmolCommands().colourBySequence(ssm, + modelSet, sequence, sr, (AlignmentViewPanel) source); if (colcommands == null) { return; } int sz = 0; - for (jalview.structure.StructureMappingcommandSet ccset : colcommands) + // for (jalview.structure.StructureMappingcommandSet ccset : colcommands) + for (String command : colcommands) { - sz += ccset.commands.length; - ccomands.add(ccset.commands); - pdbfn.add(ccset.mapping); + // sz += ccset.commands.length; + // ccomands.add(command); // ccset.commands); + // pdbfn.add(ccset.mapping); } String mclass, mhandle; @@ -239,28 +244,25 @@ public class MouseOverStructureListener extends JSFunctionExec implements System.arraycopy(ccset, 0, ccomandset, sz, ccset.length); sz += ccset.length; } - if (jvlite.isJsMessageSetChanged( - mclass = "colourstruct", + if (jvlite.isJsMessageSetChanged(mclass = "colourstruct", mhandle = ((jalview.appletgui.AlignmentPanel) source).av - .getViewId(), ccomandset)) + .getViewId(), + ccomandset)) { jvlite.setJsMessageSet(mclass, mhandle, ccomandset); // and notify javascript handler - String st[] = new String[] - { - "colourstruct", + String st[] = new String[] { "colourstruct", "" + ((jalview.appletgui.AlignmentPanel) source).av.getViewId(), - "" + ccomandset.length, - jvlite.arrayToSeparatorList(pdbfn.toArray(new String[pdbfn - .size()])) }; + "" + ccomandset.length, jvlite.arrayToSeparatorList( + pdbfn.toArray(new String[pdbfn.size()])) }; try { executeJavascriptFunction(true, _listenerfn, st); } catch (Exception ex) { - System.err.println("Couldn't execute callback with " - + _listenerfn + " using args { " + st[0] + ", " + st[1] - + ", " + st[2] + "," + st[3] + "}"); // + ","+st[4]+"\n"); + System.err.println("Couldn't execute callback with " + _listenerfn + + " using args { " + st[0] + ", " + st[1] + ", " + st[2] + + "," + st[3] + "}"); // + ","+st[4]+"\n"); ex.printStackTrace(); } @@ -283,13 +285,6 @@ public class MouseOverStructureListener extends JSFunctionExec implements } @Override - public Color getColour(int atomIndex, int pdbResNum, String chain, - String pdbId) - { - return null; - } - - @Override public AlignFrame getAlignFrame() { // associated with all alignframes, always. @@ -302,12 +297,6 @@ public class MouseOverStructureListener extends JSFunctionExec implements return _listenerfn; } - public void finalise() - { - jvlite = null; - super.finalize(); - } - @Override public void releaseReferences(Object svl) { @@ -316,4 +305,10 @@ public class MouseOverStructureListener extends JSFunctionExec implements } + @Override + public boolean isListeningFor(SequenceI seq) + { + return true; + } + }