X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fjavascript%2FMouseOverStructureListener.java;h=9d7e0cc919dee5e7ecbdddd6d5e32d60a3f857a0;hb=865a855a4ca87eadb3e5ff284ed32ed307d9c34b;hp=37d25596468b5ff8b8c17298d3ef8895d53ce888;hpb=2da92b61300307562cb8bec70a72f0b0527aa3b3;p=jalview.git diff --git a/src/jalview/javascript/MouseOverStructureListener.java b/src/jalview/javascript/MouseOverStructureListener.java index 37d2559..9d7e0cc 100644 --- a/src/jalview/javascript/MouseOverStructureListener.java +++ b/src/jalview/javascript/MouseOverStructureListener.java @@ -1,35 +1,142 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1) + * Copyright (C) 2014 The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.javascript; import java.awt.Color; +import java.util.ArrayList; +import jalview.api.AlignmentViewPanel; +import jalview.api.FeatureRenderer; +import jalview.api.SequenceRenderer; import jalview.appletgui.AlignFrame; import jalview.bin.JalviewLite; +import jalview.datamodel.SequenceI; +import jalview.ext.jmol.JmolCommands; import jalview.structure.StructureListener; +import jalview.structure.StructureMapping; +import jalview.structure.StructureMappingcommandSet; import jalview.structure.StructureSelectionManager; +/** + * Propagate events involving PDB structures associated with sequences to a + * javascript function. Generally, the javascript handler is called with a + * series of arguments like (eventname, ... ). As of Jalview 2.7, the following + * different types of events are supported: + * + * + * @author Jim Procter (jprocter) + * + */ public class MouseOverStructureListener extends JSFunctionExec implements JsCallBack, StructureListener { String _listenerfn; - public MouseOverStructureListener(JalviewLite applet, String listenerCb) + + String[] modelSet; + + public MouseOverStructureListener(JalviewLite jalviewLite, + String listener, String[] modelList) { - super(applet); - _listenerfn = listenerCb; - + super(jalviewLite); + _listenerfn = listener; + modelSet = modelList; + if (modelSet != null) + { + 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) + { + } + ; + + } + } } + @Override public String[] getPdbFile() { - // TODO Auto-generated method stub - return null; + return modelSet; } @Override public void mouseOverStructure(int atomIndex, String strInfo) { - - // StructureSelectionManager.getStructureSelectionManager().mouseOverStructure(atomIndex, chain, pdbfile) + + // StructureSelectionManager.getStructureSelectionManager().mouseOverStructure(atomIndex, + // chain, pdbfile) // TODO Auto-generated method stub } @@ -38,22 +145,138 @@ public class MouseOverStructureListener extends JSFunctionExec implements public void highlightAtom(int atomIndex, int pdbResNum, String chain, String pdbId) { - String[] st=new String[0]; - try { - executeJavascriptFunction(_listenerfn, st = new String[] { "mouseover",""+pdbId, ""+chain, ""+(pdbResNum), ""+atomIndex}); + String[] st = new String[0]; + try + { + 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"); + System.err.println("Couldn't execute callback with " + _listenerfn + + " using args { " + st[0] + ", " + st[1] + ", " + st[2] + + "," + st[3] + "\n"); ex.printStackTrace(); - + } } @Override - public void updateColours(Object source) + public synchronized void updateColours(Object srce) { - // TODO Auto-generated method stub + final Object source = srce; + StructureSelectionManager ssm = StructureSelectionManager + .getStructureSelectionManager(jvlite); + // if (jvlite.debug) + // { + // ssm.reportMapping(); + // } + if (source instanceof jalview.api.AlignmentViewPanel) + { + SequenceI[][] sequence = new SequenceI[modelSet.length][]; + for (int m = 0; m < modelSet.length; m++) + { + StructureMapping[] sm = ssm.getMapping(modelSet[m]); + if (sm != null && sm.length > 0) + { + sequence[m] = new SequenceI[sm.length]; + for (int i = 0; i < sm.length; i++) + { + sequence[m][i] = sm[i].getSequence(); + } + } + else + { + sequence[m] = new SequenceI[0]; + } + // if (jvlite.debug) + // { + // System.err.println("Mapped '" + modelSet[m] + "' to " + // + sequence[m].length + " sequences."); + // } + } + + SequenceRenderer sr = ((jalview.appletgui.AlignmentPanel) source) + .getSequenceRenderer(); + FeatureRenderer fr = ((jalview.appletgui.AlignmentPanel) source).av + .getShowSequenceFeatures() ? new jalview.appletgui.FeatureRenderer( + ((jalview.appletgui.AlignmentPanel) source).av) : null; + if (fr != null) + { + ((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()); + if (colcommands == null) + { + return; + } + int sz = 0; + for (jalview.structure.StructureMappingcommandSet ccset : colcommands) + { + sz += ccset.commands.length; + ccomands.add(ccset.commands); + pdbfn.add(ccset.mapping); + } + + String mclass, mhandle; + String ccomandset[] = new String[sz]; + sz = 0; + for (String[] ccset : ccomands) + { + System.arraycopy(ccset, 0, ccomandset, sz, ccset.length); + sz += ccset.length; + } + if (jvlite.isJsMessageSetChanged( + mclass = "colourstruct", + mhandle = ((jalview.appletgui.AlignmentPanel) source).av + .getViewId(), ccomandset)) + { + jvlite.setJsMessageSet(mclass, mhandle, ccomandset); + // and notify javascript handler + String st[] = new String[] + { + "colourstruct", + "" + ((jalview.appletgui.AlignmentPanel) source).av.getViewId(), + "" + 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"); + ex.printStackTrace(); + + } + } + /* + * new Thread(new Runnable() { public void run() { // and send to + * javascript handler String st[] = new String[0]; int i = 0; for (String + * colcommand : colcommands) { // do sync execution for each chunk try { + * executeJavascriptFunction( false, _listenerfn, st = new String[] { + * "colourstruct", "" + ((jalview.appletgui.AlignmentPanel) source).av + * .getViewId(), handle, "" }); } 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(); + * + * } } } }).start(); + */ + } } @@ -76,11 +299,19 @@ public class MouseOverStructureListener extends JSFunctionExec implements { return _listenerfn; } + + public void finalise() + { + jvlite = null; + super.finalize(); + } + @Override public void releaseReferences(Object svl) { + // TODO Auto-generated method stub - + } }