1 // default console to report messages
\r
2 var _console = document.getElementById("stdout");
\r
3 var _jvapps = new Array();
\r
4 // jvjmols is a list associating a jmol id to { modelstofiles }
\r
5 var _jvjmols = new Hashtable();
\r
6 // array of model names used to lookup index in Jmol
\r
7 var _modeltofiles = new Array();
\r
8 // counter for jmol structures
\r
11 function setConsole(console) {
\r
15 function getDestinationFrms(source, frames) {
\r
16 var frms = new Array();
\r
18 for (frm in frames) {
\r
20 frid = (source!=null) && (("" + source.getSequenceSetId()) == ("" + frames[frm].currentAlignFrame
\r
21 .getSequenceSetId()));
\r
25 if (!frames[frm].equals(source) && !frid
\r
26 && !frames[frm].currentAlignFrame.equals(source)) {
\r
27 frms[frms.length] = frames[frm];
\r
33 function mouseover(list1, list2, list3, list4) {
\r
34 // list1 = new Object(list1);
\r
35 var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));
\r
36 var msg = "Mouse over :\n" + "AlignFrame obj: " + list1 + " Seq : "
\r
37 + list[1] + "\nPos: " + list[2] + "(" + list[3] + ")\n";
\r
39 var flist = getDestinationFrms(list1, _jvapps);
\r
41 _console.value = msg + "\n";
\r
44 for (follower in flist) {
\r
46 _console.value += "Sending to " + flist[follower] + "\n";
\r
48 flist[follower].highlight(list[1], list[2], "true");
\r
53 function sellist(list1, list2, list3, list4) {
\r
54 // list1 = new Object(list1);
\r
55 var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));
\r
56 var msg = "Selection:\n" + "AlignFrame obj: " + list[0] + " id : "
\r
57 + list[1] + "\nSeqs " + list[2] + "\nColumns " + list[3] + "\n";
\r
58 var flist = getDestinationFrms(list1, _jvapps);
\r
60 _console.value = msg + "\n";
\r
63 for (follower in flist) {
\r
65 _console.value += "Sending to " + flist[follower] + "\n";
\r
67 flist[follower].selectIn(flist[follower].getDefaultTargetFrame(),
\r
73 function viewlist(list1, list2, list3, list4) {
\r
74 // list1 = new Object(list1);
\r
75 var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));
\r
76 var msg = "Viewport extent change::\n" + "AlignFrame obj: " + list[0]
\r
77 + " id : " + list[1] + "\nRow from " + list[2] + " and to "
\r
78 + list[3] + "\nVisible columns: " + list[4] + "\n";
\r
79 var flist = getDestinationFrms(list1, _jvapps);
\r
81 _console.value = msg + "\n";
\r
84 for (follower in flist) {
\r
86 _console.value += "Sending to " + flist[follower] + "\n";
\r
88 flist[follower].scrollToViewIn(flist[follower].getDefaultTargetFrame(),
\r
94 // register a jalview applet and add some handlers to it
\r
95 // jmolView is a reference to a jmol applet that is displaying the PDB files listed (in order) in the modeltofiles Array
\r
96 function linkJvJmol(applet, jmolView, modeltofiles) {
\r
97 var i = _jvapps.length;
\r
99 if (_jvapps[i].equals(applet)) {
\r
100 throw ("Ignoring additional linkJvJmol call for "
\r
101 + applet.getName() + ".");
\r
104 _jvapps[_jvapps.length] = applet;
\r
105 applet.setMouseoverListener("mouseover");
\r
106 applet.setSelectionListener("sellist");
\r
107 // viewListener not fully implemented in 2.7
\r
108 // try { applet.setViewListener("viewlist"); } catch (err) {};
\r
111 var sep = applet.getSeparator();
\r
112 var oldjm=jmolView;
\r
113 // recover full id of Jmol applet
\r
114 jmolView=_jmolGetApplet(jmolView).id;
\r
115 var jmbinding=_jvjmols.get(jmolView);
\r
118 jmbinding=new Object();
\r
119 jmbinding._modelstofiles=new Array();
\r
120 jmbinding._fullmpath=new Array();
\r
121 jmbinding._filetonum=new Hashtable();
\r
122 jmbinding._jmol=jmolView;
\r
123 jmbinding._jmhandle=oldjm;
\r
124 _jvjmols.put(jmolView,jmbinding);
\r
127 jmbinding._modelstofiles=jmbinding._modelstofiles.concat(jmbinding._modelstofiles,modeltofiles);
\r
128 jmbinding._jmol=jmolView;
\r
129 // now update structureListener list
\r
131 var dbase = document.baseURI.substring(0,document.baseURI.lastIndexOf("/")+1);
\r
132 for (m in jmbinding._modelstofiles)
\r
133 { if (m>0) { mtf+=sep; }
\r
134 mtf+=jmbinding._modelstofiles[m];
\r
135 if (jmbinding._modelstofiles[m].indexOf("//")==-1)
\r
136 { jmbinding._fullmpath[m] = dbase+((jmbinding._modelstofiles[m].indexOf("/")==0) ? jmbinding._modelstofiles[m].substring(1) : jmbinding._modelstofiles[m]); }
\r
137 jmbinding._filetonum.put(jmbinding._modelstofiles[m], m+1);
\r
138 jmbinding._filetonum.put(jmbinding._fullmpath[m], m+1);
\r
141 applet.setStructureListener("_structure", mtf);
\r
145 /*function _addJmolModel(jmolid, modelname) {
\r
146 modelname=""+modelname;
\r
147 var jminf = _jvjmols[jmolid];
\r
149 jminf = new Object();
\r
150 jminf._modelstofiles = new Array(); //new Hashtable();
\r
151 jminf._jmol = jmolid;
\r
152 jminf._modellist=new Array();
\r
153 _jvjmols[jmolid] = jminf;
\r
155 var obj = new Object();
\r
156 jminf._modeltofiles[modelname] = obj; // .put(modelname, obj);
\r
157 obj.id = modelname;
\r
158 obj.mnum = jminf._modeltofiles.length;
\r
159 jminf._modellist+=modelname;
\r
164 // jmol Jalview Methods
\r
166 function _structure(list1, list2, list3, list4) {
\r
168 // if (_console) { if (!_console.value) { _console.value="";} }
\r
169 if (list1 == "mouseover") {
\r
170 var list = new Array(("" + list1), ("" + list2), ("" + list3),
\r
172 // 1 is pdb file, 2 is residue number, 3 is chain
\r
173 // list1 = new Object(list1);
\r
174 var base = list[1].indexOf(document.baseURI
\r
175 .substring(0, document.baseURI.lastIndexOf('/'))
\r
176 ); // .indexOf(_path);
\r
177 if (base==0) { base = document.baseURI.lastIndexOf('/'); }
\r
178 var sid = list[1]; // .substring(base);
\r
179 base = list[1].substring(0, base);
\r
181 _console.value += "Model is " + list[1] + ", Structure id is : "
\r
186 for ( var jmolappi in _jvjmols.values()) {
\r
187 var jmolapp=_jvjmols.values()[jmolappi];
\r
189 if (siddat = jmolapp._filetonum.get(sid)) {
\r
190 // we don't putin chain number because there isn't one ?
\r
191 // skip select 0 bit
\r
192 var ch = ""+list[3];
\r
193 if ((""+list[2]).trim().length==1)
\r
197 msg = "select (" + ch + " /" + siddat + ") ;";
\r
201 _console.value += "Sending '" + msg + "' to jmol." + "\n";
\r
204 jmolScriptWait(msg, "" + jmolapp._jmhandle);
\r
205 // only do highlight for one jmol ?
\r
209 if (list1 == "colourstruct") {
\r
211 _console.value += 'colourStruct("' + list1 + '","' + list2
\r
212 + '") [' + list4 + ']' + "\n";
\r
214 setTimeout('colourStruct("'+list4+'","' + list1 + '","' + list2 + '")', 1);
\r
219 // last colour message
\r
221 // indicator - if _colourStruct==0 then no colouring is going on
\r
222 var _colourStruct = 0;
\r
224 function colourStruct(involves, msg, handle) {
\r
225 if (_colourStruct == 0) {
\r
227 for (ap in _jvapps) {
\r
230 if (_msg.match(/\S/)) {
\r
233 _msg = "" + _jvapps[ap].getJsMessage(msg, handle);
\r
234 } while (_msg.match(/\S/));
\r
236 // locate the jmol that should get the message
\r
237 for (var jmol in _jvjmols.values())
\r
239 var jml=_jvjmols.values()[jmol];
\r
240 if (jml._filetonum.get(involves))
\r
242 colourStructs(jml._jmhandle);
\r
247 // setTimeout('colourStruct("'+msg+'","'+handle+'")',3);
\r
251 function colourStructs(jmolapp) {
\r
252 dbg(0, "Colouring the structures\n");
\r
253 jmolScriptWait("set selectionhalos false;" + _lastMsg
\r
254 + "; select 0; set selectionhalos true;", jmolapp);
\r
257 var _jmolhovermsg="";
\r
258 function _jmolhover(jmid, atomlabel, atomidx) {
\r
259 var msg=""+jmid+" "+atomlabel+" "+atomidx;
\r
260 if (_jmolhovermsg==msg)
\r
265 modeltofiles = _jvjmols.get(jmid)._modelstofiles;
\r
266 // atomlabel=(""+atomlabel).match(/\[(.+)\](\d+):(.)\.(\S+)\s*\/(\d+)\..+/);
\r
267 // relaxed third parameter - may be null or a model number for multi model
\r
269 atomlabel = ("" + atomlabel)
\r
270 .match(/\[(.+)\](\d+):(.)\.([^\/]+)(\/\d+\.|).+/);
\r
271 atomidx = "" + atomidx;
\r
272 if (atomlabel[5]) {
\r
273 atomlabel[5] = atomlabel[5].match(/\/(.+)\./)[1];
\r
274 atomlabel[5] = parseInt(atomlabel[5])-1;
\r
276 // default - first model
\r
279 // use atomlabel[5] to look up model filename so we can highlight associated positions in any jalviews
\r
280 for (ap in _jvapps) {
\r
281 _jvapps[ap].mouseOverStructure(atomlabel[2], atomlabel[3],
\r
283 .substring(0, document.baseURI.lastIndexOf('/'))
\r
285 modeltofiles[atomlabel[5]]);
\r
286 msg = _jmolhovermsg;
\r
289 function _jmolpick(jmid, atomlabel, atomidx) {
\r
290 atomlabel = "" + atomlabel;
\r
291 atomidx = "" + atomidx;
\r
292 // label is atom id, atom number, and xyz coordinates in the form:
\r
293 // C6 #6 -0.30683374 -1.6836332 -0.716934
\r
294 // atom index, starting with 0.
\r
297 function _jmolMessagecallback(jmid, statmess) {
\r
298 // if (statmess.indexOf("Script Terminated")==0)
\r
300 var thisTime = new Date();
\r
302 _console.value += "Last script execution took : "
\r
303 + (thisTime.valueOf() - _lastTime.valueOf()) / 1000.0
\r
306 _lastTime = thisTime;
\r