JAL-1807 test
[jalviewjs.git] / bin / jalview / viewmodel / seqfeatures / FeatureRendererModel.js
1 Clazz.declarePackage ("jalview.viewmodel.seqfeatures");
2 Clazz.load (["jalview.api.FeatureRenderer", "java.beans.PropertyChangeSupport", "java.lang.Boolean", "java.util.Hashtable", "java.util.concurrent.ConcurrentHashMap"], "jalview.viewmodel.seqfeatures.FeatureRendererModel", ["jalview.schemes.GraduatedColor", "$.UserColourScheme", "jalview.util.QuickSort", "jalview.viewmodel.seqfeatures.FeatureRendererSettings", "$.FeaturesDisplayed", "java.awt.Color", "java.lang.Error", "$.Float", "java.util.ArrayList", "$.Arrays"], function () {
3 c$ = Clazz.decorateAsClass (function () {
4 this.transparency = 1.0;
5 this.featureColours = null;
6 this.featureGroups = null;
7 this.currentColour = null;
8 this.renderOrder = null;
9 this.changeSupport = null;
10 this.av = null;
11 this.minmax = null;
12 this.newFeatureAdded = false;
13 this.findingFeatures = false;
14 this.firing = null;
15 this.featureOrder = null;
16 Clazz.instantialize (this, arguments);
17 }, jalview.viewmodel.seqfeatures, "FeatureRendererModel", null, jalview.api.FeatureRenderer);
18 Clazz.prepareFields (c$, function () {
19 this.featureColours =  new java.util.concurrent.ConcurrentHashMap ();
20 this.featureGroups =  new java.util.concurrent.ConcurrentHashMap ();
21 this.changeSupport =  new java.beans.PropertyChangeSupport (this);
22 this.minmax =  new java.util.Hashtable ();
23 this.firing = Boolean.FALSE;
24 });
25 Clazz.overrideMethod (c$, "getViewport", 
26 function () {
27 return this.av;
28 });
29 Clazz.defineMethod (c$, "getSettings", 
30 function () {
31 return  new jalview.viewmodel.seqfeatures.FeatureRendererSettings (this);
32 });
33 Clazz.defineMethod (c$, "transferSettings", 
34 function (fr) {
35 this.renderOrder = fr.renderOrder;
36 this.featureGroups = fr.featureGroups;
37 this.featureColours = fr.featureColours;
38 this.transparency = fr.transparency;
39 this.featureOrder = fr.featureOrder;
40 }, "jalview.viewmodel.seqfeatures.FeatureRendererSettings");
41 Clazz.defineMethod (c$, "transferSettings", 
42 function (_fr) {
43 var fr = _fr;
44 var frs =  new jalview.viewmodel.seqfeatures.FeatureRendererSettings (fr);
45 this.renderOrder = frs.renderOrder;
46 this.featureGroups = frs.featureGroups;
47 this.featureColours = frs.featureColours;
48 this.transparency = frs.transparency;
49 this.featureOrder = frs.featureOrder;
50 if (this.av != null && this.av !== fr.getViewport ()) {
51 if (_fr.getFeaturesDisplayed () != null) {
52 var fd = this.getFeaturesDisplayed ();
53 if (fd == null) {
54 this.setFeaturesDisplayedFrom (_fr.getFeaturesDisplayed ());
55 } else {
56 {
57 fd.clear ();
58 var fdisp = _fr.getFeaturesDisplayed ().getVisibleFeatures ();
59 while (fdisp.hasNext ()) {
60 fd.setVisible (fdisp.next ());
61 }
62 }}}}}, "jalview.api.FeatureRenderer");
63 Clazz.defineMethod (c$, "setFeaturesDisplayedFrom", 
64 function (featuresDisplayed) {
65 this.av.setFeaturesDisplayed ( new jalview.viewmodel.seqfeatures.FeaturesDisplayed (featuresDisplayed));
66 }, "jalview.api.FeaturesDisplayedI");
67 Clazz.overrideMethod (c$, "setVisible", 
68 function (featureType) {
69 var fdi = this.av.getFeaturesDisplayed ();
70 if (fdi == null) {
71 this.av.setFeaturesDisplayed (fdi =  new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());
72 }if (!fdi.isRegistered (featureType)) {
73 this.pushFeatureType (java.util.Arrays.asList ( Clazz.newArray (-1, [featureType])));
74 }fdi.setVisible (featureType);
75 }, "~S");
76 Clazz.overrideMethod (c$, "setAllVisible", 
77 function (featureTypes) {
78 var fdi = this.av.getFeaturesDisplayed ();
79 if (fdi == null) {
80 this.av.setFeaturesDisplayed (fdi =  new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());
81 }var nft =  new java.util.ArrayList ();
82 for (var featureType, $featureType = featureTypes.iterator (); $featureType.hasNext () && ((featureType = $featureType.next ()) || true);) {
83 if (!fdi.isRegistered (featureType)) {
84 nft.add (featureType);
85 }}
86 if (nft.size () > 0) {
87 this.pushFeatureType (nft);
88 }fdi.setAllVisible (featureTypes);
89 }, "java.util.List");
90 Clazz.defineMethod (c$, "pushFeatureType", 
91 ($fz = function (types) {
92 var ts = types.size ();
93 var neworder =  new Array ((this.renderOrder == null ? 0 : this.renderOrder.length) + ts);
94 types.toArray (neworder);
95 if (this.renderOrder != null) {
96 System.arraycopy (neworder, 0, neworder, this.renderOrder.length, ts);
97 System.arraycopy (this.renderOrder, 0, neworder, 0, this.renderOrder.length);
98 }this.renderOrder = neworder;
99 }, $fz.isPrivate = true, $fz), "java.util.List");
100 Clazz.defineMethod (c$, "getMinMax", 
101 function () {
102 return this.minmax;
103 });
104 Clazz.defineMethod (c$, "normaliseScore", 
105 function (sequenceFeature) {
106 var mm = (this.minmax.get (sequenceFeature.type))[0];
107 var r =  Clazz.newByteArray (-1, [0, 255]);
108 if (mm != null) {
109 if (r[0] != 0 || mm[0] < 0.0) {
110 r[0] = 1;
111 r[1] = Clazz.doubleToByte (Clazz.doubleToInt (128.0) + 127.0 * (sequenceFeature.score / mm[1]));
112 } else {
113 r[1] = Clazz.floatToByte (Clazz.doubleToInt (255.0) * (sequenceFeature.score / mm[1]));
114 }}return r;
115 }, "jalview.datamodel.SequenceFeature");
116 Clazz.defineMethod (c$, "updateFeatures", 
117 function () {
118 if (this.av.getFeaturesDisplayed () == null || this.renderOrder == null || this.newFeatureAdded) {
119 this.findAllFeatures ();
120 if (this.av.getFeaturesDisplayed ().getVisibleFeatureCount () < 1) {
121 return false;
122 }}return true;
123 });
124 Clazz.defineMethod (c$, "findAllFeatures", 
125 function () {
126 {
127 if (this.firing.equals (Boolean.FALSE)) {
128 this.firing = Boolean.TRUE;
129 this.findAllFeatures (true);
130 this.changeSupport.firePropertyChange ("changeSupport", null, null);
131 this.firing = Boolean.FALSE;
132 }}});
133 Clazz.overrideMethod (c$, "findFeaturesAtRes", 
134 function (sequence, res) {
135 var tmp =  new java.util.ArrayList ();
136 var features = sequence.getSequenceFeatures ();
137 if (features != null) {
138 for (var i = 0; i < features.length; i++) {
139 if (!this.av.areFeaturesDisplayed () || !this.av.getFeaturesDisplayed ().isVisible (features[i].getType ())) {
140 continue;
141 }if (features[i].featureGroup != null && this.featureGroups != null && this.featureGroups.containsKey (features[i].featureGroup) && !this.featureGroups.get (features[i].featureGroup).booleanValue ()) {
142 continue;
143 }if ((features[i].getBegin () <= res) && (features[i].getEnd () >= res)) {
144 tmp.add (features[i]);
145 }}
146 }return tmp;
147 }, "jalview.datamodel.SequenceI,~N");
148 Clazz.defineMethod (c$, "findAllFeatures", 
149 function (newMadeVisible) {
150 this.newFeatureAdded = false;
151 if (this.findingFeatures) {
152 this.newFeatureAdded = true;
153 return;
154 }this.findingFeatures = true;
155 if (this.av.getFeaturesDisplayed () == null) {
156 this.av.setFeaturesDisplayed ( new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());
157 }var featuresDisplayed = this.av.getFeaturesDisplayed ();
158 var allfeatures =  new java.util.ArrayList ();
159 var oldfeatures =  new java.util.ArrayList ();
160 if (this.renderOrder != null) {
161 for (var i = 0; i < this.renderOrder.length; i++) {
162 if (this.renderOrder[i] != null) {
163 oldfeatures.add (this.renderOrder[i]);
164 }}
165 }if (this.minmax == null) {
166 this.minmax =  new java.util.Hashtable ();
167 }var alignment = this.av.getAlignment ();
168 for (var i = 0; i < alignment.getHeight (); i++) {
169 var asq = alignment.getSequenceAt (i);
170 var features = asq.getSequenceFeatures ();
171 if (features == null) {
172 continue;
173 }var index = 0;
174 while (index < features.length) {
175 if (!featuresDisplayed.isRegistered (features[index].getType ())) {
176 var fgrp = features[index].getFeatureGroup ();
177 if (fgrp != null) {
178 var groupDisplayed = this.featureGroups.get (fgrp);
179 if (groupDisplayed == null) {
180 groupDisplayed = Boolean.$valueOf (newMadeVisible);
181 this.featureGroups.put (fgrp, groupDisplayed);
182 }if (!groupDisplayed.booleanValue ()) {
183 index++;
184 continue;
185 }}if (!(features[index].begin == 0 && features[index].end == 0)) {
186 if (newMadeVisible && !oldfeatures.contains (features[index].getType ())) {
187 featuresDisplayed.setVisible (features[index].getType ());
188 this.setOrder (features[index].getType (), 0);
189 }}}if (!allfeatures.contains (features[index].getType ())) {
190 allfeatures.add (features[index].getType ());
191 }if (!Float.isNaN (features[index].score)) {
192 var nonpos = features[index].getBegin () >= 1 ? 0 : 1;
193 var mm = this.minmax.get (features[index].getType ());
194 if (mm == null) {
195 mm =  Clazz.newArray (-1, [null, null]);
196 this.minmax.put (features[index].getType (), mm);
197 }if (mm[nonpos] == null) {
198 mm[nonpos] =  Clazz.newFloatArray (-1, [features[index].score, features[index].score]);
199 } else {
200 if (mm[nonpos][0] > features[index].score) {
201 mm[nonpos][0] = features[index].score;
202 }if (mm[nonpos][1] < features[index].score) {
203 mm[nonpos][1] = features[index].score;
204 }}}index++;
205 }
206 }
207 this.updateRenderOrder (allfeatures);
208 this.findingFeatures = false;
209 }, "~B");
210 Clazz.defineMethod (c$, "updateRenderOrder", 
211 ($fz = function (allFeatures) {
212 var allfeatures =  new java.util.ArrayList (allFeatures);
213 var oldRender = this.renderOrder;
214 this.renderOrder =  new Array (allfeatures.size ());
215 var mmrange;
216 var fc = null;
217 var initOrders = (this.featureOrder == null);
218 var opos = 0;
219 if (oldRender != null && oldRender.length > 0) {
220 for (var j = 0; j < oldRender.length; j++) {
221 if (oldRender[j] != null) {
222 if (initOrders) {
223 this.setOrder (oldRender[j], (1 - (1 + j) / oldRender.length));
224 }if (allfeatures.contains (oldRender[j])) {
225 this.renderOrder[opos++] = oldRender[j];
226 allfeatures.remove (oldRender[j]);
227 if (this.minmax != null) {
228 mmrange = this.minmax.get (oldRender[j]);
229 if (mmrange != null) {
230 fc = this.featureColours.get (oldRender[j]);
231 if (fc != null && Clazz.instanceOf (fc, jalview.schemes.GraduatedColor) && (fc).isAutoScale ()) {
232 (fc).updateBounds ((mmrange)[0][0], (mmrange)[0][1]);
233 }}}}}}
234 }if (allfeatures.size () == 0) {
235 return;
236 }var i = allfeatures.size () - 1;
237 var iSize = i;
238 var sort = false;
239 var newf =  new Array (allfeatures.size ());
240 var sortOrder =  Clazz.newFloatArray (allfeatures.size (), 0);
241 for (var newfeat, $newfeat = allfeatures.iterator (); $newfeat.hasNext () && ((newfeat = $newfeat.next ()) || true);) {
242 newf[i] = newfeat;
243 if (this.minmax != null) {
244 mmrange = this.minmax.get (newf[i]);
245 if (mmrange != null) {
246 fc = this.featureColours.get (newf[i]);
247 if (fc != null && Clazz.instanceOf (fc, jalview.schemes.GraduatedColor) && (fc).isAutoScale ()) {
248 (fc).updateBounds ((mmrange)[0][0], (mmrange)[0][1]);
249 }}}if (initOrders || !this.featureOrder.containsKey (newf[i])) {
250 var denom = initOrders ? allfeatures.size () : this.featureOrder.size ();
251 this.setOrder (newf[i], i / denom);
252 }sortOrder[i] = 2 - (this.featureOrder.get (newf[i])).floatValue ();
253 if (i < iSize) {
254 sort = sort || sortOrder[i] > sortOrder[i + 1];
255 }i--;
256 }
257 if (iSize > 1 && sort) {
258 jalview.util.QuickSort.sortFloatObject (sortOrder, newf);
259 }sortOrder = null;
260 System.arraycopy (newf, 0, this.renderOrder, opos, newf.length);
261 }, $fz.isPrivate = true, $fz), "java.util.List");
262 Clazz.overrideMethod (c$, "getFeatureStyle", 
263 function (featureType) {
264 var fc = this.featureColours.get (featureType);
265 if (fc == null) {
266 var ucs =  new jalview.schemes.UserColourScheme ();
267 var col = ucs.createColourFromName (featureType);
268 this.featureColours.put (featureType, fc = col);
269 }return fc;
270 }, "~S");
271 Clazz.defineMethod (c$, "getColour", 
272 function (featureType) {
273 var fc = this.getFeatureStyle (featureType);
274 if (Clazz.instanceOf (fc, java.awt.Color)) {
275 return fc;
276 } else {
277 if (Clazz.instanceOf (fc, jalview.schemes.GraduatedColor)) {
278 return (fc).getMaxColor ();
279 }}throw  new Error ("Implementation Error: Unrecognised render object " + fc.getClass () + " for features of type " + featureType);
280 }, "~S");
281 Clazz.defineMethod (c$, "getColour", 
282 function (feature) {
283 var fc = this.getFeatureStyle (feature.getType ());
284 if (Clazz.instanceOf (fc, java.awt.Color)) {
285 return fc;
286 } else {
287 if (Clazz.instanceOf (fc, jalview.schemes.GraduatedColor)) {
288 return (fc).findColor (feature);
289 }}throw  new Error ("Implementation Error: Unrecognised render object " + fc.getClass () + " for features of type " + feature.getType ());
290 }, "jalview.datamodel.SequenceFeature");
291 Clazz.defineMethod (c$, "showFeature", 
292 function (sequenceFeature) {
293 var fc = this.getFeatureStyle (sequenceFeature.type);
294 if (Clazz.instanceOf (fc, jalview.schemes.GraduatedColor)) {
295 return (fc).isColored (sequenceFeature);
296 } else {
297 return true;
298 }}, "jalview.datamodel.SequenceFeature");
299 Clazz.defineMethod (c$, "showFeatureOfType", 
300 function (type) {
301 return this.av.getFeaturesDisplayed ().isVisible (type);
302 }, "~S");
303 Clazz.overrideMethod (c$, "setColour", 
304 function (featureType, col) {
305 {
306 this.featureColours.put (featureType, col);
307 }}, "~S,~O");
308 Clazz.defineMethod (c$, "setTransparency", 
309 function (value) {
310 this.transparency = value;
311 }, "~N");
312 Clazz.defineMethod (c$, "getTransparency", 
313 function () {
314 return this.transparency;
315 });
316 Clazz.defineMethod (c$, "setOrder", 
317 function (type, position) {
318 if (this.featureOrder == null) {
319 this.featureOrder =  new java.util.Hashtable ();
320 }this.featureOrder.put (type,  new Float (position));
321 return position;
322 }, "~S,~N");
323 Clazz.defineMethod (c$, "getOrder", 
324 function (type) {
325 if (this.featureOrder != null) {
326 if (this.featureOrder.containsKey (type)) {
327 return (this.featureOrder.get (type)).floatValue ();
328 }}return -1;
329 }, "~S");
330 Clazz.overrideMethod (c$, "getFeatureColours", 
331 function () {
332 return  new java.util.concurrent.ConcurrentHashMap (this.featureColours);
333 });
334 Clazz.defineMethod (c$, "setFeaturePriority", 
335 function (data) {
336 this.setFeaturePriority (data, true);
337 }, "~A");
338 Clazz.defineMethod (c$, "setFeaturePriority", 
339 function (data, visibleNew) {
340 var av_featuresdisplayed = null;
341 if (visibleNew) {
342 if ((av_featuresdisplayed = this.av.getFeaturesDisplayed ()) != null) {
343 this.av.getFeaturesDisplayed ().clear ();
344 } else {
345 this.av.setFeaturesDisplayed (av_featuresdisplayed =  new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());
346 }} else {
347 av_featuresdisplayed = this.av.getFeaturesDisplayed ();
348 }if (data == null) {
349 return;
350 }this.renderOrder =  new Array (data.length);
351 if (data.length > 0) {
352 for (var i = 0; i < data.length; i++) {
353 var type = data[i][0].toString ();
354 this.setColour (type, data[i][1]);
355 if ((data[i][2]).booleanValue ()) {
356 av_featuresdisplayed.setVisible (type);
357 }this.renderOrder[data.length - i - 1] = type;
358 }
359 }}, "~A,~B");
360 Clazz.defineMethod (c$, "addPropertyChangeListener", 
361 function (listener) {
362 this.changeSupport.addPropertyChangeListener (listener);
363 }, "java.beans.PropertyChangeListener");
364 Clazz.defineMethod (c$, "removePropertyChangeListener", 
365 function (listener) {
366 this.changeSupport.removePropertyChangeListener (listener);
367 }, "java.beans.PropertyChangeListener");
368 Clazz.defineMethod (c$, "getAllFeatureColours", 
369 function () {
370 return this.featureColours.keySet ();
371 });
372 Clazz.defineMethod (c$, "clearRenderOrder", 
373 function () {
374 this.renderOrder = null;
375 });
376 Clazz.defineMethod (c$, "hasRenderOrder", 
377 function () {
378 return this.renderOrder != null;
379 });
380 Clazz.defineMethod (c$, "getRenderOrder", 
381 function () {
382 if (this.renderOrder == null) {
383 return java.util.Arrays.asList ( Clazz.newArray (-1, []));
384 }return java.util.Arrays.asList (this.renderOrder);
385 });
386 Clazz.defineMethod (c$, "getFeatureGroupsSize", 
387 function () {
388 return this.featureGroups != null ? 0 : this.featureGroups.size ();
389 });
390 Clazz.overrideMethod (c$, "getFeatureGroups", 
391 function () {
392 return (this.featureGroups == null) ? java.util.Arrays.asList ( new Array (0)) : java.util.Arrays.asList (this.featureGroups.keySet ().toArray ( new Array (0)));
393 });
394 Clazz.defineMethod (c$, "checkGroupVisibility", 
395 function (group, newGroupsVisible) {
396 if (this.featureGroups == null) {
397 }if (this.featureGroups.containsKey (group)) {
398 return this.featureGroups.get (group).booleanValue ();
399 }if (newGroupsVisible) {
400 this.featureGroups.put (group,  new Boolean (true));
401 return true;
402 }return false;
403 }, "~S,~B");
404 Clazz.overrideMethod (c$, "getGroups", 
405 function (visible) {
406 if (this.featureGroups != null) {
407 var gp =  new java.util.ArrayList ();
408 for (var grp, $grp = this.featureGroups.keySet ().iterator (); $grp.hasNext () && ((grp = $grp.next ()) || true);) {
409 var state = this.featureGroups.get (grp);
410 if (state.booleanValue () == visible) {
411 gp.add (grp);
412 }}
413 return gp;
414 }return null;
415 }, "~B");
416 Clazz.defineMethod (c$, "setGroupVisibility", 
417 function (group, visible) {
418 this.featureGroups.put (group,  new Boolean (visible));
419 }, "~S,~B");
420 Clazz.defineMethod (c$, "setGroupVisibility", 
421 function (toset, visible) {
422 if (toset != null && toset.size () > 0 && this.featureGroups != null) {
423 var rdrw = false;
424 for (var gst, $gst = toset.iterator (); $gst.hasNext () && ((gst = $gst.next ()) || true);) {
425 var st = this.featureGroups.get (gst);
426 this.featureGroups.put (gst,  new Boolean (visible));
427 if (st != null) {
428 rdrw = rdrw || (visible != st.booleanValue ());
429 }}
430 if (rdrw) {
431 }}}, "java.util.List,~B");
432 Clazz.overrideMethod (c$, "getDisplayedFeatureCols", 
433 function () {
434 var fcols =  new java.util.Hashtable ();
435 if (this.getViewport ().getFeaturesDisplayed () == null) {
436 return fcols;
437 }var en = this.getViewport ().getFeaturesDisplayed ().getVisibleFeatures ();
438 while (en.hasNext ()) {
439 var col = en.next ();
440 fcols.put (col, this.getColour (col));
441 }
442 return fcols;
443 });
444 Clazz.defineMethod (c$, "getFeaturesDisplayed", 
445 function () {
446 return this.av.getFeaturesDisplayed ();
447 });
448 Clazz.overrideMethod (c$, "getDisplayedFeatureTypes", 
449 function () {
450 var typ = null;
451 typ = this.getRenderOrder ().toArray ( new Array (0));
452 var feature_disp = this.av.getFeaturesDisplayed ();
453 if (feature_disp != null) {
454 {
455 for (var i = 0; i < typ.length; i++) {
456 if (!feature_disp.isVisible (typ[i])) {
457 typ[i] = null;
458 }}
459 }}return typ;
460 });
461 Clazz.overrideMethod (c$, "getDisplayedFeatureGroups", 
462 function () {
463 var gps = null;
464 var _gps =  new java.util.ArrayList ();
465 var en = this.getFeatureGroups ().iterator ();
466 var g = 0;
467 var valid = false;
468 while (en.hasNext ()) {
469 var gp = en.next ();
470 if (this.checkGroupVisibility (gp, false)) {
471 valid = true;
472 _gps.add (gp);
473 }if (!valid) {
474 return null;
475 } else {
476 gps =  new Array (_gps.size ());
477 _gps.toArray (gps);
478 }}
479 return gps;
480 });
481 });