documentation (JAL-859, JAL-816, JAL-621)
[jalview.git] / src / jalview / javascript / MouseOverStructureListener.java
1 package jalview.javascript;\r
2 \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
14 \r
15 /**\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
20  * <ul>\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
30  * jalview\r
31  * .javascript.JalviewLiteJsApi.getJsMessage('colourstruct',String(alignment\r
32  * view id)) to retrieve successive chunks of the message.</li>\r
33  * </ul>\r
34  * \r
35  * @author Jim Procter (jprocter)\r
36  * \r
37  */\r
38 public class MouseOverStructureListener extends JSFunctionExec implements\r
39         JsCallBack, StructureListener\r
40 {\r
41 \r
42   String _listenerfn;\r
43 \r
44   String[] modelSet;\r
45 \r
46   public MouseOverStructureListener(JalviewLite jalviewLite,\r
47           String listener, String[] modelList)\r
48   {\r
49     super(jalviewLite);\r
50     _listenerfn = listener;\r
51     modelSet = modelList;\r
52     if (modelSet != null)\r
53     {\r
54       for (int i = 0; i < modelSet.length; i++)\r
55       {\r
56         // resolve a real filename\r
57         try\r
58         {\r
59           if (new java.net.URL(modelSet[i]).openConnection() != null)\r
60           {\r
61             continue;\r
62           }\r
63         } catch (Exception x)\r
64         {\r
65         }\r
66         ;\r
67         try\r
68         {\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
72           {\r
73             modelSet[i] = db + "/" + modelSet[i];\r
74             continue;\r
75           }\r
76         } catch (Exception x)\r
77         {\r
78         }\r
79         ;\r
80         try\r
81         {\r
82           if (new java.net.URL(jvlite.getCodeBase() + modelSet[i])\r
83                   .openConnection() != null)\r
84           {\r
85             modelSet[i] = jvlite.getCodeBase() + modelSet[i];\r
86             continue;\r
87           }\r
88         } catch (Exception x)\r
89         {\r
90         }\r
91         ;\r
92 \r
93       }\r
94     }\r
95   }\r
96 \r
97   @Override\r
98   public String[] getPdbFile()\r
99   {\r
100     return modelSet;\r
101   }\r
102 \r
103   @Override\r
104   public void mouseOverStructure(int atomIndex, String strInfo)\r
105   {\r
106 \r
107     // StructureSelectionManager.getStructureSelectionManager().mouseOverStructure(atomIndex,\r
108     // chain, pdbfile)\r
109     // TODO Auto-generated method stub\r
110 \r
111   }\r
112 \r
113   @Override\r
114   public void highlightAtom(int atomIndex, int pdbResNum, String chain,\r
115           String pdbId)\r
116   {\r
117     String[] st = new String[0];\r
118     try\r
119     {\r
120       executeJavascriptFunction(_listenerfn, st = new String[]\r
121       { "mouseover", "" + pdbId, "" + chain, "" + (pdbResNum),\r
122           "" + atomIndex });\r
123     } catch (Exception ex)\r
124     {\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
129 \r
130     }\r
131 \r
132   }\r
133 \r
134   @Override\r
135  public synchronized void updateColours(Object srce)\r
136   {\r
137     final Object source = srce;\r
138     StructureSelectionManager ssm = StructureSelectionManager\r
139             .getStructureSelectionManager(jvlite);\r
140     // if (jvlite.debug)\r
141     // {\r
142     // ssm.reportMapping();\r
143     // }\r
144     if (source instanceof jalview.api.AlignmentViewPanel)\r
145     {\r
146       SequenceI[][] sequence = new SequenceI[modelSet.length][];\r
147       for (int m = 0; m < modelSet.length; m++)\r
148       {\r
149         StructureMapping[] sm = ssm.getMapping(modelSet[m]);\r
150         if (sm != null && sm.length > 0)\r
151         {\r
152           sequence[m] = new SequenceI[sm.length];\r
153           for (int i = 0; i < sm.length; i++)\r
154           {\r
155             sequence[m][i] = sm[i].getSequence();\r
156           }\r
157         }\r
158         else\r
159         {\r
160           sequence[m] = new SequenceI[0];\r
161         }\r
162         // if (jvlite.debug)\r
163         // {\r
164         // System.err.println("Mapped '" + modelSet[m] + "' to "\r
165         // + sequence[m].length + " sequences.");\r
166         // }\r
167       }\r
168 \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
174       if (fr != null)\r
175       {\r
176         ((jalview.appletgui.FeatureRenderer) fr)\r
177                 .transferSettings(((jalview.appletgui.AlignmentPanel) source)\r
178                         .getFeatureRenderer());\r
179       }\r
180       ;\r
181 \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
187       {\r
188         // \r
189         return;\r
190       }\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
197                                                   {\r
198               "colourstruct",\r
199               ""\r
200                       + ((jalview.appletgui.AlignmentPanel) source).av\r
201                               .getViewId(), ""+colcommands.length, ""+(colcommands[0]!=null ? colcommands[0].length() : 0)};\r
202       try\r
203       {\r
204         executeJavascriptFunction(\r
205                 true,\r
206                 _listenerfn,st\r
207 );\r
208       } catch (Exception ex)\r
209       {\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
214 \r
215       }\r
216       }\r
217 /*      new Thread(new Runnable()\r
218       {\r
219         public void run()\r
220         {\r
221           // and send to javascript handler\r
222           String st[] = new String[0];\r
223           int i = 0;\r
224           for (String colcommand : colcommands)\r
225           {\r
226             // do sync execution for each chunk\r
227             try\r
228             {\r
229               executeJavascriptFunction(\r
230                       false,\r
231                       _listenerfn,\r
232                       st = new String[]\r
233                       {\r
234                           "colourstruct",\r
235                           ""\r
236                                   + ((jalview.appletgui.AlignmentPanel) source).av\r
237                                           .getViewId(), handle, "" });\r
238             } catch (Exception ex)\r
239             {\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
244 \r
245             }\r
246           }\r
247         }\r
248       }).start();\r
249   */\r
250     }\r
251 \r
252   }\r
253 \r
254   @Override\r
255   public Color getColour(int atomIndex, int pdbResNum, String chain,\r
256           String pdbId)\r
257   {\r
258     return null;\r
259   }\r
260 \r
261   @Override\r
262   public AlignFrame getAlignFrame()\r
263   {\r
264     // associated with all alignframes, always.\r
265     return null;\r
266   }\r
267 \r
268   @Override\r
269   public String getListenerFunction()\r
270   {\r
271     return _listenerfn;\r
272   }\r
273 \r
274   public void finalise()\r
275   {\r
276     jvlite=null;\r
277     super.finalize();\r
278   }\r
279   @Override\r
280   public void releaseReferences(Object svl)\r
281   {\r
282     \r
283     // TODO Auto-generated method stub\r
284 \r
285   }\r
286 \r
287 }\r