1 package jalview.javascript;
\r
3 import java.awt.Color;
\r
4 import jalview.api.AlignmentViewPanel;
\r
5 import jalview.api.FeatureRenderer;
\r
6 import jalview.api.SequenceRenderer;
\r
7 import jalview.appletgui.AlignFrame;
\r
8 import jalview.bin.JalviewLite;
\r
9 import jalview.datamodel.SequenceI;
\r
10 import jalview.ext.jmol.JmolCommands;
\r
11 import jalview.structure.StructureListener;
\r
12 import jalview.structure.StructureMapping;
\r
13 import jalview.structure.StructureSelectionManager;
\r
16 * Propagate events involving PDB structures associated with sequences to a
\r
17 * javascript function. Generally, the javascript handler is called with a
\r
18 * series of arguments like (eventname, ... ). As of Jalview 2.7, the following
\r
19 * different types of events are supported:
\r
21 * <li>mouseover: javascript function called with arguments <pre>
\r
22 * ['mouseover',String(pdb file URI), String(pdb file chain ID), String(residue
\r
23 * number moused over), String(atom index corresponding to residue)]</pre></li>
\r
24 * <li>colourstruct: javascript function called with arguments <pre>
\r
25 * ['colourstruct',String(alignment view id),String(number of javascript message
\r
26 * chunks to collect),String(length of first chunk in set of messages - or zero
\r
27 * for null message)]</pre><br>
\r
28 * The message contains a series of Jmol script commands that will colour
\r
29 * structures according to their associated sequences in the current view. Use
\r
31 * .javascript.JalviewLiteJsApi.getJsMessage('colourstruct',String(alignment
\r
32 * view id)) to retrieve successive chunks of the message.</li>
\r
35 * @author Jim Procter (jprocter)
\r
38 public class MouseOverStructureListener extends JSFunctionExec implements
\r
39 JsCallBack, StructureListener
\r
46 public MouseOverStructureListener(JalviewLite jalviewLite,
\r
47 String listener, String[] modelList)
\r
50 _listenerfn = listener;
\r
51 modelSet = modelList;
\r
52 if (modelSet != null)
\r
54 for (int i = 0; i < modelSet.length; i++)
\r
56 // resolve a real filename
\r
59 if (new java.net.URL(modelSet[i]).openConnection() != null)
\r
63 } catch (Exception x)
\r
69 String db = jvlite.getDocumentBase().toString();
\r
70 db = db.substring(0, db.lastIndexOf("/"));
\r
71 if (new java.net.URL(db + "/" + modelSet[i]).openConnection() != null)
\r
73 modelSet[i] = db + "/" + modelSet[i];
\r
76 } catch (Exception x)
\r
82 if (new java.net.URL(jvlite.getCodeBase() + modelSet[i])
\r
83 .openConnection() != null)
\r
85 modelSet[i] = jvlite.getCodeBase() + modelSet[i];
\r
88 } catch (Exception x)
\r
98 public String[] getPdbFile()
\r
104 public void mouseOverStructure(int atomIndex, String strInfo)
\r
107 // StructureSelectionManager.getStructureSelectionManager().mouseOverStructure(atomIndex,
\r
109 // TODO Auto-generated method stub
\r
114 public void highlightAtom(int atomIndex, int pdbResNum, String chain,
\r
117 String[] st = new String[0];
\r
120 executeJavascriptFunction(_listenerfn, st = new String[]
\r
121 { "mouseover", "" + pdbId, "" + chain, "" + (pdbResNum),
\r
123 } catch (Exception ex)
\r
125 System.err.println("Couldn't execute callback with " + _listenerfn
\r
126 + " using args { " + st[0] + ", " + st[1] + ", " + st[2]
\r
127 + "," + st[3] + "\n");
\r
128 ex.printStackTrace();
\r
135 public synchronized void updateColours(Object srce)
\r
137 final Object source = srce;
\r
138 StructureSelectionManager ssm = StructureSelectionManager
\r
139 .getStructureSelectionManager(jvlite);
\r
140 // if (jvlite.debug)
\r
142 // ssm.reportMapping();
\r
144 if (source instanceof jalview.api.AlignmentViewPanel)
\r
146 SequenceI[][] sequence = new SequenceI[modelSet.length][];
\r
147 for (int m = 0; m < modelSet.length; m++)
\r
149 StructureMapping[] sm = ssm.getMapping(modelSet[m]);
\r
150 if (sm != null && sm.length > 0)
\r
152 sequence[m] = new SequenceI[sm.length];
\r
153 for (int i = 0; i < sm.length; i++)
\r
155 sequence[m][i] = sm[i].getSequence();
\r
160 sequence[m] = new SequenceI[0];
\r
162 // if (jvlite.debug)
\r
164 // System.err.println("Mapped '" + modelSet[m] + "' to "
\r
165 // + sequence[m].length + " sequences.");
\r
169 SequenceRenderer sr = ((jalview.appletgui.AlignmentPanel) source)
\r
170 .getSequenceRenderer();
\r
171 FeatureRenderer fr = ((jalview.appletgui.AlignmentPanel) source).av
\r
172 .getShowSequenceFeatures() ? new jalview.appletgui.FeatureRenderer(
\r
173 ((jalview.appletgui.AlignmentPanel) source).av) : null;
\r
176 ((jalview.appletgui.FeatureRenderer) fr)
\r
177 .transferSettings(((jalview.appletgui.AlignmentPanel) source)
\r
178 .getFeatureRenderer());
\r
182 // Form a colour command for the given alignment panel
\r
183 final String[] colcommands = JmolCommands.getColourBySequenceCommand(
\r
184 ssm, modelSet, sequence, sr, fr,
\r
185 ((AlignmentViewPanel) source).getAlignment());
\r
186 if (colcommands==null)
\r
191 String mclass,mhandle;
\r
192 if (jvlite.isJsMessageSetChanged(mclass="colourstruct",mhandle=((jalview.appletgui.AlignmentPanel) source).av
\r
193 .getViewId(), colcommands)) {
\r
194 jvlite.setJsMessageSet(mclass, mhandle , colcommands);
\r
195 // and notify javascript handler
\r
196 String st[] = new String[]
\r
200 + ((jalview.appletgui.AlignmentPanel) source).av
\r
201 .getViewId(), ""+colcommands.length, ""+(colcommands[0]!=null ? colcommands[0].length() : 0)};
\r
204 executeJavascriptFunction(
\r
208 } catch (Exception ex)
\r
210 System.err.println("Couldn't execute callback with "
\r
211 + _listenerfn + " using args { " + st[0] + ", "
\r
212 + st[1] + ", " + st[2] + "," + st[3] + "\n");
\r
213 ex.printStackTrace();
\r
217 /* new Thread(new Runnable()
\r
221 // and send to javascript handler
\r
222 String st[] = new String[0];
\r
224 for (String colcommand : colcommands)
\r
226 // do sync execution for each chunk
\r
229 executeJavascriptFunction(
\r
236 + ((jalview.appletgui.AlignmentPanel) source).av
\r
237 .getViewId(), handle, "" });
\r
238 } catch (Exception ex)
\r
240 System.err.println("Couldn't execute callback with "
\r
241 + _listenerfn + " using args { " + st[0] + ", "
\r
242 + st[1] + ", " + st[2] + "," + st[3] + "\n");
\r
243 ex.printStackTrace();
\r
255 public Color getColour(int atomIndex, int pdbResNum, String chain,
\r
262 public AlignFrame getAlignFrame()
\r
264 // associated with all alignframes, always.
\r
269 public String getListenerFunction()
\r
271 return _listenerfn;
\r
274 public void finalise()
\r
280 public void releaseReferences(Object svl)
\r
283 // TODO Auto-generated method stub
\r