085e50dd8f444fe17ff77ea13a2338b90b7242f9
[jalview.git] / src / jalview / javascript / MouseOverStructureListener.java
1 package jalview.javascript;\r
2 \r
3 import java.awt.Color;\r
4 import java.util.ArrayList;\r
5 \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
17 \r
18 /**\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
23  * <ul>\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
33  * jalview\r
34  * .javascript.JalviewLiteJsApi.getJsMessage('colourstruct',String(alignment\r
35  * view id)) to retrieve successive chunks of the message.</li>\r
36  * </ul>\r
37  * \r
38  * @author Jim Procter (jprocter)\r
39  * \r
40  */\r
41 public class MouseOverStructureListener extends JSFunctionExec implements\r
42         JsCallBack, StructureListener\r
43 {\r
44 \r
45   String _listenerfn;\r
46 \r
47   String[] modelSet;\r
48 \r
49   public MouseOverStructureListener(JalviewLite jalviewLite,\r
50           String listener, String[] modelList)\r
51   {\r
52     super(jalviewLite);\r
53     _listenerfn = listener;\r
54     modelSet = modelList;\r
55     if (modelSet != null)\r
56     {\r
57       for (int i = 0; i < modelSet.length; i++)\r
58       {\r
59         // resolve a real filename\r
60         try\r
61         {\r
62           if (new java.net.URL(modelSet[i]).openConnection() != null)\r
63           {\r
64             continue;\r
65           }\r
66         } catch (Exception x)\r
67         {\r
68         }\r
69         ;\r
70         try\r
71         {\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
75           {\r
76             modelSet[i] = db + "/" + modelSet[i];\r
77             continue;\r
78           }\r
79         } catch (Exception x)\r
80         {\r
81         }\r
82         ;\r
83         try\r
84         {\r
85           if (new java.net.URL(jvlite.getCodeBase() + modelSet[i])\r
86                   .openConnection() != null)\r
87           {\r
88             modelSet[i] = jvlite.getCodeBase() + modelSet[i];\r
89             continue;\r
90           }\r
91         } catch (Exception x)\r
92         {\r
93         }\r
94         ;\r
95 \r
96       }\r
97     }\r
98   }\r
99 \r
100   @Override\r
101   public String[] getPdbFile()\r
102   {\r
103     return modelSet;\r
104   }\r
105 \r
106   @Override\r
107   public void mouseOverStructure(int atomIndex, String strInfo)\r
108   {\r
109 \r
110     // StructureSelectionManager.getStructureSelectionManager().mouseOverStructure(atomIndex,\r
111     // chain, pdbfile)\r
112     // TODO Auto-generated method stub\r
113 \r
114   }\r
115 \r
116   @Override\r
117   public void highlightAtom(int atomIndex, int pdbResNum, String chain,\r
118           String pdbId)\r
119   {\r
120     String[] st = new String[0];\r
121     try\r
122     {\r
123       executeJavascriptFunction(_listenerfn, st = new String[]\r
124       { "mouseover", "" + pdbId, "" + chain, "" + (pdbResNum),\r
125           "" + atomIndex });\r
126     } catch (Exception ex)\r
127     {\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
132 \r
133     }\r
134 \r
135   }\r
136 \r
137   @Override\r
138  public synchronized void updateColours(Object srce)\r
139   {\r
140     final Object source = srce;\r
141     StructureSelectionManager ssm = StructureSelectionManager\r
142             .getStructureSelectionManager(jvlite);\r
143     // if (jvlite.debug)\r
144     // {\r
145     // ssm.reportMapping();\r
146     // }\r
147     if (source instanceof jalview.api.AlignmentViewPanel)\r
148     {\r
149       SequenceI[][] sequence = new SequenceI[modelSet.length][];\r
150       for (int m = 0; m < modelSet.length; m++)\r
151       {\r
152         StructureMapping[] sm = ssm.getMapping(modelSet[m]);\r
153         if (sm != null && sm.length > 0)\r
154         {\r
155           sequence[m] = new SequenceI[sm.length];\r
156           for (int i = 0; i < sm.length; i++)\r
157           {\r
158             sequence[m][i] = sm[i].getSequence();\r
159           }\r
160         }\r
161         else\r
162         {\r
163           sequence[m] = new SequenceI[0];\r
164         }\r
165         // if (jvlite.debug)\r
166         // {\r
167         // System.err.println("Mapped '" + modelSet[m] + "' to "\r
168         // + sequence[m].length + " sequences.");\r
169         // }\r
170       }\r
171 \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
177       if (fr != null)\r
178       {\r
179         ((jalview.appletgui.FeatureRenderer) fr)\r
180                 .transferSettings(((jalview.appletgui.AlignmentPanel) source)\r
181                         .getFeatureRenderer());\r
182       }\r
183       ;\r
184 \r
185       \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
193         return;\r
194       }\r
195       int sz=0;\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
200       }\r
201       \r
202       String mclass,mhandle;\r
203       String ccomandset[] = new String[sz];\r
204       sz=0;\r
205       for (String[] ccset: ccomands) {\r
206         System.arraycopy(ccset, 0, ccomandset, sz, ccset.length);\r
207         sz+=ccset.length;\r
208       }\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
214                                                   {\r
215               "colourstruct",\r
216               ""\r
217                       + ((jalview.appletgui.AlignmentPanel) source).av\r
218                               .getViewId(), ""+ccomandset.length, jvlite.arrayToSeparatorList(pdbfn.toArray(new String[pdbfn.size()]))\r
219                               };\r
220       try\r
221       {\r
222         executeJavascriptFunction(\r
223                 true,\r
224                 _listenerfn,st\r
225 );\r
226       } catch (Exception ex)\r
227       {\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
232 \r
233       }\r
234       }\r
235 /*      new Thread(new Runnable()\r
236       {\r
237         public void run()\r
238         {\r
239           // and send to javascript handler\r
240           String st[] = new String[0];\r
241           int i = 0;\r
242           for (String colcommand : colcommands)\r
243           {\r
244             // do sync execution for each chunk\r
245             try\r
246             {\r
247               executeJavascriptFunction(\r
248                       false,\r
249                       _listenerfn,\r
250                       st = new String[]\r
251                       {\r
252                           "colourstruct",\r
253                           ""\r
254                                   + ((jalview.appletgui.AlignmentPanel) source).av\r
255                                           .getViewId(), handle, "" });\r
256             } catch (Exception ex)\r
257             {\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
262 \r
263             }\r
264           }\r
265         }\r
266       }).start();\r
267   */\r
268     }\r
269 \r
270   }\r
271 \r
272   @Override\r
273   public Color getColour(int atomIndex, int pdbResNum, String chain,\r
274           String pdbId)\r
275   {\r
276     return null;\r
277   }\r
278 \r
279   @Override\r
280   public AlignFrame getAlignFrame()\r
281   {\r
282     // associated with all alignframes, always.\r
283     return null;\r
284   }\r
285 \r
286   @Override\r
287   public String getListenerFunction()\r
288   {\r
289     return _listenerfn;\r
290   }\r
291 \r
292   public void finalise()\r
293   {\r
294     jvlite=null;\r
295     super.finalize();\r
296   }\r
297   @Override\r
298   public void releaseReferences(Object svl)\r
299   {\r
300     \r
301     // TODO Auto-generated method stub\r
302 \r
303   }\r
304 \r
305 }\r