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