c1d3a402deb39cd02dff981c906f119db8266229
[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(jvlite);\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       if (colcommands==null)\r
164       {\r
165         // \r
166         return;\r
167       }\r
168       String mclass,mhandle;\r
169       if (jvlite.isJsMessageSetChanged(mclass="colourstruct",mhandle=((jalview.appletgui.AlignmentPanel) source).av\r
170               .getViewId(), colcommands)) {\r
171       jvlite.setJsMessageSet(mclass, mhandle , colcommands);\r
172       // and notify javascript handler\r
173       String st[] = new String[]\r
174                                                   {\r
175               "colourstruct",\r
176               ""\r
177                       + ((jalview.appletgui.AlignmentPanel) source).av\r
178                               .getViewId(), ""+colcommands.length, ""+(colcommands[0]!=null ? colcommands[0].length() : 0)};\r
179       try\r
180       {\r
181         executeJavascriptFunction(\r
182                 true,\r
183                 _listenerfn,st\r
184 );\r
185       } catch (Exception ex)\r
186       {\r
187         System.err.println("Couldn't execute callback with "\r
188                 + _listenerfn + " using args { " + st[0] + ", "\r
189                 + st[1] + ", " + st[2] + "," + st[3] + "\n");\r
190         ex.printStackTrace();\r
191 \r
192       }\r
193       }\r
194 /*      new Thread(new Runnable()\r
195       {\r
196         public void run()\r
197         {\r
198           // and send to javascript handler\r
199           String st[] = new String[0];\r
200           int i = 0;\r
201           for (String colcommand : colcommands)\r
202           {\r
203             // do sync execution for each chunk\r
204             try\r
205             {\r
206               executeJavascriptFunction(\r
207                       false,\r
208                       _listenerfn,\r
209                       st = new String[]\r
210                       {\r
211                           "colourstruct",\r
212                           ""\r
213                                   + ((jalview.appletgui.AlignmentPanel) source).av\r
214                                           .getViewId(), handle, "" });\r
215             } catch (Exception ex)\r
216             {\r
217               System.err.println("Couldn't execute callback with "\r
218                       + _listenerfn + " using args { " + st[0] + ", "\r
219                       + st[1] + ", " + st[2] + "," + st[3] + "\n");\r
220               ex.printStackTrace();\r
221 \r
222             }\r
223           }\r
224         }\r
225       }).start();\r
226   */\r
227     }\r
228 \r
229   }\r
230 \r
231   @Override\r
232   public Color getColour(int atomIndex, int pdbResNum, String chain,\r
233           String pdbId)\r
234   {\r
235     return null;\r
236   }\r
237 \r
238   @Override\r
239   public AlignFrame getAlignFrame()\r
240   {\r
241     // associated with all alignframes, always.\r
242     return null;\r
243   }\r
244 \r
245   @Override\r
246   public String getListenerFunction()\r
247   {\r
248     return _listenerfn;\r
249   }\r
250 \r
251   public void finalise()\r
252   {\r
253     jvlite=null;\r
254     super.finalize();\r
255   }\r
256   @Override\r
257   public void releaseReferences(Object svl)\r
258   {\r
259     \r
260     // TODO Auto-generated method stub\r
261 \r
262   }\r
263 \r
264 }\r