improved javascript callback execution thread and provided 'large string' asynchronou...
[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 public class MouseOverStructureListener extends JSFunctionExec implements\r
16         JsCallBack, StructureListener\r
17 {\r
18 \r
19   String _listenerfn;\r
20 \r
21   String[] modelSet;\r
22 \r
23   public MouseOverStructureListener(JalviewLite jalviewLite,\r
24           String listener, String[] modelList)\r
25   {\r
26     super(jalviewLite);\r
27     _listenerfn = listener;\r
28     modelSet = modelList;\r
29     if (modelSet != null)\r
30     {\r
31       for (int i = 0; i < modelSet.length; i++)\r
32       {\r
33         // resolve a real filename\r
34         try\r
35         {\r
36           if (new java.net.URL(modelSet[i]).openConnection() != null)\r
37           {\r
38             continue;\r
39           }\r
40         } catch (Exception x)\r
41         {\r
42         }\r
43         ;\r
44         try\r
45         {\r
46           String db = jvlite.getDocumentBase().toString();\r
47           db = db.substring(0, db.lastIndexOf("/"));\r
48           if (new java.net.URL(db + "/" + modelSet[i]).openConnection() != null)\r
49           {\r
50             modelSet[i] = db + "/" + modelSet[i];\r
51             continue;\r
52           }\r
53         } catch (Exception x)\r
54         {\r
55         }\r
56         ;\r
57         try\r
58         {\r
59           if (new java.net.URL(jvlite.getCodeBase() + modelSet[i])\r
60                   .openConnection() != null)\r
61           {\r
62             modelSet[i] = jvlite.getCodeBase() + modelSet[i];\r
63             continue;\r
64           }\r
65         } catch (Exception x)\r
66         {\r
67         }\r
68         ;\r
69 \r
70       }\r
71     }\r
72   }\r
73 \r
74   @Override\r
75   public String[] getPdbFile()\r
76   {\r
77     return modelSet;\r
78   }\r
79 \r
80   @Override\r
81   public void mouseOverStructure(int atomIndex, String strInfo)\r
82   {\r
83 \r
84     // StructureSelectionManager.getStructureSelectionManager().mouseOverStructure(atomIndex,\r
85     // chain, pdbfile)\r
86     // TODO Auto-generated method stub\r
87 \r
88   }\r
89 \r
90   @Override\r
91   public void highlightAtom(int atomIndex, int pdbResNum, String chain,\r
92           String pdbId)\r
93   {\r
94     String[] st = new String[0];\r
95     try\r
96     {\r
97       executeJavascriptFunction(_listenerfn, st = new String[]\r
98       { "mouseover", "" + pdbId, "" + chain, "" + (pdbResNum),\r
99           "" + atomIndex });\r
100     } catch (Exception ex)\r
101     {\r
102       System.err.println("Couldn't execute callback with " + _listenerfn\r
103               + " using args { " + st[0] + ", " + st[1] + ", " + st[2]\r
104               + "," + st[3] + "\n");\r
105       ex.printStackTrace();\r
106 \r
107     }\r
108 \r
109   }\r
110 \r
111   @Override\r
112  public synchronized void updateColours(Object srce)\r
113   {\r
114     final Object source = srce;\r
115     StructureSelectionManager ssm = StructureSelectionManager\r
116             .getStructureSelectionManager();\r
117     // if (jvlite.debug)\r
118     // {\r
119     // ssm.reportMapping();\r
120     // }\r
121     if (source instanceof jalview.api.AlignmentViewPanel)\r
122     {\r
123       SequenceI[][] sequence = new SequenceI[modelSet.length][];\r
124       for (int m = 0; m < modelSet.length; m++)\r
125       {\r
126         StructureMapping[] sm = ssm.getMapping(modelSet[m]);\r
127         if (sm != null && sm.length > 0)\r
128         {\r
129           sequence[m] = new SequenceI[sm.length];\r
130           for (int i = 0; i < sm.length; i++)\r
131           {\r
132             sequence[m][i] = sm[i].getSequence();\r
133           }\r
134         }\r
135         else\r
136         {\r
137           sequence[m] = new SequenceI[0];\r
138         }\r
139         // if (jvlite.debug)\r
140         // {\r
141         // System.err.println("Mapped '" + modelSet[m] + "' to "\r
142         // + sequence[m].length + " sequences.");\r
143         // }\r
144       }\r
145 \r
146       SequenceRenderer sr = ((jalview.appletgui.AlignmentPanel) source)\r
147               .getSequenceRenderer();\r
148       FeatureRenderer fr = ((jalview.appletgui.AlignmentPanel) source).av\r
149               .getShowSequenceFeatures() ? new jalview.appletgui.FeatureRenderer(\r
150               ((jalview.appletgui.AlignmentPanel) source).av) : null;\r
151       if (fr != null)\r
152       {\r
153         ((jalview.appletgui.FeatureRenderer) fr)\r
154                 .transferSettings(((jalview.appletgui.AlignmentPanel) source)\r
155                         .getFeatureRenderer());\r
156       }\r
157       ;\r
158 \r
159       // Form a colour command for the given alignment panel\r
160       final String[] colcommands = JmolCommands.getColourBySequenceCommand(\r
161               ssm, modelSet, sequence, sr, fr,\r
162               ((AlignmentViewPanel) source).getAlignment());\r
163       String mclass,mhandle;\r
164       if (jvlite.isJsMessageSetChanged(mclass="colourstruct",mhandle=((jalview.appletgui.AlignmentPanel) source).av\r
165               .getViewId(), colcommands)) {\r
166       jvlite.setJsMessageSet(mclass, mhandle , colcommands);\r
167       // and notify javascript handler\r
168       String st[] = new String[0];\r
169       try\r
170       {\r
171         executeJavascriptFunction(\r
172                 true,\r
173                 _listenerfn,\r
174                 st = new String[]\r
175                 {\r
176                     "colourstruct",\r
177                     ""\r
178                             + ((jalview.appletgui.AlignmentPanel) source).av\r
179                                     .getViewId(), ""+colcommands.length, "" });\r
180       } catch (Exception ex)\r
181       {\r
182         System.err.println("Couldn't execute callback with "\r
183                 + _listenerfn + " using args { " + st[0] + ", "\r
184                 + st[1] + ", " + st[2] + "," + st[3] + "\n");\r
185         ex.printStackTrace();\r
186 \r
187       }\r
188       }\r
189 /*      new Thread(new Runnable()\r
190       {\r
191         public void run()\r
192         {\r
193           // and send to javascript handler\r
194           String st[] = new String[0];\r
195           int i = 0;\r
196           for (String colcommand : colcommands)\r
197           {\r
198             // do sync execution for each chunk\r
199             try\r
200             {\r
201               executeJavascriptFunction(\r
202                       false,\r
203                       _listenerfn,\r
204                       st = new String[]\r
205                       {\r
206                           "colourstruct",\r
207                           ""\r
208                                   + ((jalview.appletgui.AlignmentPanel) source).av\r
209                                           .getViewId(), handle, "" });\r
210             } catch (Exception ex)\r
211             {\r
212               System.err.println("Couldn't execute callback with "\r
213                       + _listenerfn + " using args { " + st[0] + ", "\r
214                       + st[1] + ", " + st[2] + "," + st[3] + "\n");\r
215               ex.printStackTrace();\r
216 \r
217             }\r
218           }\r
219         }\r
220       }).start();\r
221   */\r
222     }\r
223 \r
224   }\r
225 \r
226   @Override\r
227   public Color getColour(int atomIndex, int pdbResNum, String chain,\r
228           String pdbId)\r
229   {\r
230     return null;\r
231   }\r
232 \r
233   @Override\r
234   public AlignFrame getAlignFrame()\r
235   {\r
236     // associated with all alignframes, always.\r
237     return null;\r
238   }\r
239 \r
240   @Override\r
241   public String getListenerFunction()\r
242   {\r
243     return _listenerfn;\r
244   }\r
245 \r
246   @Override\r
247   public void releaseReferences(Object svl)\r
248   {\r
249     // TODO Auto-generated method stub\r
250 \r
251   }\r
252 \r
253 }\r