1 package jalview.javascript;
\r
3 import java.awt.Color;
\r
4 import java.util.ArrayList;
\r
6 import jalview.api.AlignmentViewPanel;
\r
7 import jalview.api.FeatureRenderer;
\r
8 import jalview.api.SequenceRenderer;
\r
9 import jalview.appletgui.AlignFrame;
\r
10 import jalview.bin.JalviewLite;
\r
11 import jalview.datamodel.SequenceI;
\r
12 import jalview.ext.jmol.JmolCommands;
\r
13 import jalview.structure.StructureListener;
\r
14 import jalview.structure.StructureMapping;
\r
15 import jalview.structure.StructureMappingcommandSet;
\r
16 import jalview.structure.StructureSelectionManager;
\r
19 * Propagate events involving PDB structures associated with sequences to a
\r
20 * javascript function. Generally, the javascript handler is called with a
\r
21 * series of arguments like (eventname, ... ). As of Jalview 2.7, the following
\r
22 * different types of events are supported:
\r
24 * <li>mouseover: javascript function called with arguments <pre>
\r
25 * ['mouseover',String(pdb file URI), String(pdb file chain ID), String(residue
\r
26 * number moused over), String(atom index corresponding to residue)]</pre></li>
\r
27 * <li>colourstruct: javascript function called with arguments <pre>
\r
28 * ['colourstruct',String(alignment view id),String(number of javascript message
\r
29 * chunks to collect),String(length of first chunk in set of messages - or zero
\r
30 * for null message)]</pre><br>
\r
31 * The message contains a series of Jmol script commands that will colour
\r
32 * structures according to their associated sequences in the current view. Use
\r
34 * .javascript.JalviewLiteJsApi.getJsMessage('colourstruct',String(alignment
\r
35 * view id)) to retrieve successive chunks of the message.</li>
\r
38 * @author Jim Procter (jprocter)
\r
41 public class MouseOverStructureListener extends JSFunctionExec implements
\r
42 JsCallBack, StructureListener
\r
49 public MouseOverStructureListener(JalviewLite jalviewLite,
\r
50 String listener, String[] modelList)
\r
53 _listenerfn = listener;
\r
54 modelSet = modelList;
\r
55 if (modelSet != null)
\r
57 for (int i = 0; i < modelSet.length; i++)
\r
59 // resolve a real filename
\r
62 if (new java.net.URL(modelSet[i]).openConnection() != null)
\r
66 } catch (Exception x)
\r
72 String db = jvlite.getDocumentBase().toString();
\r
73 db = db.substring(0, db.lastIndexOf("/"));
\r
74 if (new java.net.URL(db + "/" + modelSet[i]).openConnection() != null)
\r
76 modelSet[i] = db + "/" + modelSet[i];
\r
79 } catch (Exception x)
\r
85 if (new java.net.URL(jvlite.getCodeBase() + modelSet[i])
\r
86 .openConnection() != null)
\r
88 modelSet[i] = jvlite.getCodeBase() + modelSet[i];
\r
91 } catch (Exception x)
\r
101 public String[] getPdbFile()
\r
107 public void mouseOverStructure(int atomIndex, String strInfo)
\r
110 // StructureSelectionManager.getStructureSelectionManager().mouseOverStructure(atomIndex,
\r
112 // TODO Auto-generated method stub
\r
117 public void highlightAtom(int atomIndex, int pdbResNum, String chain,
\r
120 String[] st = new String[0];
\r
123 executeJavascriptFunction(_listenerfn, st = new String[]
\r
124 { "mouseover", "" + pdbId, "" + chain, "" + (pdbResNum),
\r
126 } catch (Exception ex)
\r
128 System.err.println("Couldn't execute callback with " + _listenerfn
\r
129 + " using args { " + st[0] + ", " + st[1] + ", " + st[2]
\r
130 + "," + st[3] + "\n");
\r
131 ex.printStackTrace();
\r
138 public synchronized void updateColours(Object srce)
\r
140 final Object source = srce;
\r
141 StructureSelectionManager ssm = StructureSelectionManager
\r
142 .getStructureSelectionManager(jvlite);
\r
143 // if (jvlite.debug)
\r
145 // ssm.reportMapping();
\r
147 if (source instanceof jalview.api.AlignmentViewPanel)
\r
149 SequenceI[][] sequence = new SequenceI[modelSet.length][];
\r
150 for (int m = 0; m < modelSet.length; m++)
\r
152 StructureMapping[] sm = ssm.getMapping(modelSet[m]);
\r
153 if (sm != null && sm.length > 0)
\r
155 sequence[m] = new SequenceI[sm.length];
\r
156 for (int i = 0; i < sm.length; i++)
\r
158 sequence[m][i] = sm[i].getSequence();
\r
163 sequence[m] = new SequenceI[0];
\r
165 // if (jvlite.debug)
\r
167 // System.err.println("Mapped '" + modelSet[m] + "' to "
\r
168 // + sequence[m].length + " sequences.");
\r
172 SequenceRenderer sr = ((jalview.appletgui.AlignmentPanel) source)
\r
173 .getSequenceRenderer();
\r
174 FeatureRenderer fr = ((jalview.appletgui.AlignmentPanel) source).av
\r
175 .getShowSequenceFeatures() ? new jalview.appletgui.FeatureRenderer(
\r
176 ((jalview.appletgui.AlignmentPanel) source).av) : null;
\r
179 ((jalview.appletgui.FeatureRenderer) fr)
\r
180 .transferSettings(((jalview.appletgui.AlignmentPanel) source)
\r
181 .getFeatureRenderer());
\r
186 // Form a colour command from the given alignment panel for each distinct structure
\r
187 ArrayList<String[]> ccomands=new ArrayList<String[]>();
\r
188 ArrayList<String> pdbfn=new ArrayList<String>();
\r
189 StructureMappingcommandSet[] colcommands=JmolCommands.getColourBySequenceCommand(
\r
190 ssm, modelSet, sequence, sr, fr,
\r
191 ((AlignmentViewPanel) source).getAlignment());
\r
192 if (colcommands==null) {
\r
196 for (jalview.structure.StructureMappingcommandSet ccset: colcommands) {
\r
197 sz+=ccset.commands.length;
\r
198 ccomands.add(ccset.commands);
\r
199 pdbfn.add(ccset.mapping);
\r
202 String mclass,mhandle;
\r
203 String ccomandset[] = new String[sz];
\r
205 for (String[] ccset: ccomands) {
\r
206 System.arraycopy(ccset, 0, ccomandset, sz, ccset.length);
\r
209 if (jvlite.isJsMessageSetChanged(mclass="colourstruct",mhandle=((jalview.appletgui.AlignmentPanel) source).av
\r
210 .getViewId(), ccomandset)) {
\r
211 jvlite.setJsMessageSet(mclass, mhandle , ccomandset);
\r
212 // and notify javascript handler
\r
213 String st[] = new String[]
\r
217 + ((jalview.appletgui.AlignmentPanel) source).av
\r
218 .getViewId(), ""+ccomandset.length, jvlite.arrayToSeparatorList(pdbfn.toArray(new String[pdbfn.size()]))
\r
222 executeJavascriptFunction(
\r
226 } catch (Exception ex)
\r
228 System.err.println("Couldn't execute callback with "
\r
229 + _listenerfn + " using args { " + st[0] + ", "
\r
230 + st[1] + ", " + st[2] + "," + st[3]+"}"); // + ","+st[4]+"\n");
\r
231 ex.printStackTrace();
\r
235 /* new Thread(new Runnable()
\r
239 // and send to javascript handler
\r
240 String st[] = new String[0];
\r
242 for (String colcommand : colcommands)
\r
244 // do sync execution for each chunk
\r
247 executeJavascriptFunction(
\r
254 + ((jalview.appletgui.AlignmentPanel) source).av
\r
255 .getViewId(), handle, "" });
\r
256 } catch (Exception ex)
\r
258 System.err.println("Couldn't execute callback with "
\r
259 + _listenerfn + " using args { " + st[0] + ", "
\r
260 + st[1] + ", " + st[2] + "," + st[3] + "\n");
\r
261 ex.printStackTrace();
\r
273 public Color getColour(int atomIndex, int pdbResNum, String chain,
\r
280 public AlignFrame getAlignFrame()
\r
282 // associated with all alignframes, always.
\r
287 public String getListenerFunction()
\r
289 return _listenerfn;
\r
292 public void finalise()
\r
298 public void releaseReferences(Object svl)
\r
301 // TODO Auto-generated method stub
\r