JAL-1807 test
[jalviewjs.git] / bin / jalview / viewmodel / seqfeatures / FeatureRendererModel.js
index cd53bbe..985bdda 100644 (file)
-Clazz.declarePackage ("jalview.viewmodel.seqfeatures");\r
-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
-c$ = Clazz.decorateAsClass (function () {\r
-this.transparency = 1.0;\r
-this.featureColours = null;\r
-this.featureGroups = null;\r
-this.currentColour = null;\r
-this.renderOrder = null;\r
-this.changeSupport = null;\r
-this.av = null;\r
-this.minmax = null;\r
-this.newFeatureAdded = false;\r
-this.findingFeatures = false;\r
-this.firing = null;\r
-this.featureOrder = null;\r
-Clazz.instantialize (this, arguments);\r
-}, jalview.viewmodel.seqfeatures, "FeatureRendererModel", null, jalview.api.FeatureRenderer);\r
-Clazz.prepareFields (c$, function () {\r
-this.featureColours =  new java.util.concurrent.ConcurrentHashMap ();\r
-this.featureGroups =  new java.util.concurrent.ConcurrentHashMap ();\r
-this.changeSupport =  new java.beans.PropertyChangeSupport (this);\r
-this.minmax =  new java.util.Hashtable ();\r
-this.firing = Boolean.FALSE;\r
-});\r
-Clazz.overrideMethod (c$, "getViewport", \r
-function () {\r
-return this.av;\r
-});\r
-Clazz.defineMethod (c$, "getSettings", \r
-function () {\r
-return  new jalview.viewmodel.seqfeatures.FeatureRendererSettings (this);\r
-});\r
-Clazz.defineMethod (c$, "transferSettings", \r
-function (fr) {\r
-this.renderOrder = fr.renderOrder;\r
-this.featureGroups = fr.featureGroups;\r
-this.featureColours = fr.featureColours;\r
-this.transparency = fr.transparency;\r
-this.featureOrder = fr.featureOrder;\r
-}, "jalview.viewmodel.seqfeatures.FeatureRendererSettings");\r
-Clazz.defineMethod (c$, "transferSettings", \r
-function (_fr) {\r
-var fr = _fr;\r
-var frs =  new jalview.viewmodel.seqfeatures.FeatureRendererSettings (fr);\r
-this.renderOrder = frs.renderOrder;\r
-this.featureGroups = frs.featureGroups;\r
-this.featureColours = frs.featureColours;\r
-this.transparency = frs.transparency;\r
-this.featureOrder = frs.featureOrder;\r
-if (this.av != null && this.av !== fr.getViewport ()) {\r
-if (_fr.getFeaturesDisplayed () != null) {\r
-var fd = this.getFeaturesDisplayed ();\r
-if (fd == null) {\r
-this.setFeaturesDisplayedFrom (_fr.getFeaturesDisplayed ());\r
-} else {\r
-{\r
-fd.clear ();\r
-var fdisp = _fr.getFeaturesDisplayed ().getVisibleFeatures ();\r
-while (fdisp.hasNext ()) {\r
-fd.setVisible (fdisp.next ());\r
-}\r
-}}}}}, "jalview.api.FeatureRenderer");\r
-Clazz.defineMethod (c$, "setFeaturesDisplayedFrom", \r
-function (featuresDisplayed) {\r
-this.av.setFeaturesDisplayed ( new jalview.viewmodel.seqfeatures.FeaturesDisplayed (featuresDisplayed));\r
-}, "jalview.api.FeaturesDisplayedI");\r
-Clazz.overrideMethod (c$, "setVisible", \r
-function (featureType) {\r
-var fdi = this.av.getFeaturesDisplayed ();\r
-if (fdi == null) {\r
-this.av.setFeaturesDisplayed (fdi =  new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());\r
-}if (!fdi.isRegistered (featureType)) {\r
-this.pushFeatureType (java.util.Arrays.asList ( Clazz.newArray (-1, [featureType])));\r
-}fdi.setVisible (featureType);\r
-}, "~S");\r
-Clazz.overrideMethod (c$, "setAllVisible", \r
-function (featureTypes) {\r
-var fdi = this.av.getFeaturesDisplayed ();\r
-if (fdi == null) {\r
-this.av.setFeaturesDisplayed (fdi =  new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());\r
-}var nft =  new java.util.ArrayList ();\r
-for (var featureType, $featureType = featureTypes.iterator (); $featureType.hasNext () && ((featureType = $featureType.next ()) || true);) {\r
-if (!fdi.isRegistered (featureType)) {\r
-nft.add (featureType);\r
-}}\r
-if (nft.size () > 0) {\r
-this.pushFeatureType (nft);\r
-}fdi.setAllVisible (featureTypes);\r
-}, "java.util.List");\r
-Clazz.defineMethod (c$, "pushFeatureType", \r
-($fz = function (types) {\r
-var ts = types.size ();\r
-var neworder =  new Array ((this.renderOrder == null ? 0 : this.renderOrder.length) + ts);\r
-types.toArray (neworder);\r
-if (this.renderOrder != null) {\r
-System.arraycopy (neworder, 0, neworder, this.renderOrder.length, ts);\r
-System.arraycopy (this.renderOrder, 0, neworder, 0, this.renderOrder.length);\r
-}this.renderOrder = neworder;\r
-}, $fz.isPrivate = true, $fz), "java.util.List");\r
-Clazz.defineMethod (c$, "getMinMax", \r
-function () {\r
-return this.minmax;\r
-});\r
-Clazz.defineMethod (c$, "normaliseScore", \r
-function (sequenceFeature) {\r
-var mm = (this.minmax.get (sequenceFeature.type))[0];\r
-var r =  Clazz.newByteArray (-1, [0, 255]);\r
-if (mm != null) {\r
-if (r[0] != 0 || mm[0] < 0.0) {\r
-r[0] = 1;\r
-r[1] = Clazz.doubleToByte (Clazz.doubleToInt (128.0) + 127.0 * (sequenceFeature.score / mm[1]));\r
-} else {\r
-r[1] = Clazz.floatToByte (Clazz.doubleToInt (255.0) * (sequenceFeature.score / mm[1]));\r
-}}return r;\r
-}, "jalview.datamodel.SequenceFeature");\r
-Clazz.defineMethod (c$, "updateFeatures", \r
-function () {\r
-if (this.av.getFeaturesDisplayed () == null || this.renderOrder == null || this.newFeatureAdded) {\r
-this.findAllFeatures ();\r
-if (this.av.getFeaturesDisplayed ().getVisibleFeatureCount () < 1) {\r
-return false;\r
-}}return true;\r
-});\r
-Clazz.defineMethod (c$, "findAllFeatures", \r
-function () {\r
-{\r
-if (this.firing.equals (Boolean.FALSE)) {\r
-this.firing = Boolean.TRUE;\r
-this.findAllFeatures (true);\r
-this.changeSupport.firePropertyChange ("changeSupport", null, null);\r
-this.firing = Boolean.FALSE;\r
-}}});\r
-Clazz.overrideMethod (c$, "findFeaturesAtRes", \r
-function (sequence, res) {\r
-var tmp =  new java.util.ArrayList ();\r
-var features = sequence.getSequenceFeatures ();\r
-if (features != null) {\r
-for (var i = 0; i < features.length; i++) {\r
-if (!this.av.areFeaturesDisplayed () || !this.av.getFeaturesDisplayed ().isVisible (features[i].getType ())) {\r
-continue;\r
-}if (features[i].featureGroup != null && this.featureGroups != null && this.featureGroups.containsKey (features[i].featureGroup) && !this.featureGroups.get (features[i].featureGroup).booleanValue ()) {\r
-continue;\r
-}if ((features[i].getBegin () <= res) && (features[i].getEnd () >= res)) {\r
-tmp.add (features[i]);\r
-}}\r
-}return tmp;\r
-}, "jalview.datamodel.SequenceI,~N");\r
-Clazz.defineMethod (c$, "findAllFeatures", \r
-function (newMadeVisible) {\r
-this.newFeatureAdded = false;\r
-if (this.findingFeatures) {\r
-this.newFeatureAdded = true;\r
-return;\r
-}this.findingFeatures = true;\r
-if (this.av.getFeaturesDisplayed () == null) {\r
-this.av.setFeaturesDisplayed ( new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());\r
-}var featuresDisplayed = this.av.getFeaturesDisplayed ();\r
-var allfeatures =  new java.util.ArrayList ();\r
-var oldfeatures =  new java.util.ArrayList ();\r
-if (this.renderOrder != null) {\r
-for (var i = 0; i < this.renderOrder.length; i++) {\r
-if (this.renderOrder[i] != null) {\r
-oldfeatures.add (this.renderOrder[i]);\r
-}}\r
-}if (this.minmax == null) {\r
-this.minmax =  new java.util.Hashtable ();\r
-}var alignment = this.av.getAlignment ();\r
-for (var i = 0; i < alignment.getHeight (); i++) {\r
-var asq = alignment.getSequenceAt (i);\r
-var features = asq.getSequenceFeatures ();\r
-if (features == null) {\r
-continue;\r
-}var index = 0;\r
-while (index < features.length) {\r
-if (!featuresDisplayed.isRegistered (features[index].getType ())) {\r
-var fgrp = features[index].getFeatureGroup ();\r
-if (fgrp != null) {\r
-var groupDisplayed = this.featureGroups.get (fgrp);\r
-if (groupDisplayed == null) {\r
-groupDisplayed = Boolean.$valueOf (newMadeVisible);\r
-this.featureGroups.put (fgrp, groupDisplayed);\r
-}if (!groupDisplayed.booleanValue ()) {\r
-index++;\r
-continue;\r
-}}if (!(features[index].begin == 0 && features[index].end == 0)) {\r
-if (newMadeVisible && !oldfeatures.contains (features[index].getType ())) {\r
-featuresDisplayed.setVisible (features[index].getType ());\r
-this.setOrder (features[index].getType (), 0);\r
-}}}if (!allfeatures.contains (features[index].getType ())) {\r
-allfeatures.add (features[index].getType ());\r
-}if (!Float.isNaN (features[index].score)) {\r
-var nonpos = features[index].getBegin () >= 1 ? 0 : 1;\r
-var mm = this.minmax.get (features[index].getType ());\r
-if (mm == null) {\r
-mm =  Clazz.newArray (-1, [null, null]);\r
-this.minmax.put (features[index].getType (), mm);\r
-}if (mm[nonpos] == null) {\r
-mm[nonpos] =  Clazz.newFloatArray (-1, [features[index].score, features[index].score]);\r
-} else {\r
-if (mm[nonpos][0] > features[index].score) {\r
-mm[nonpos][0] = features[index].score;\r
-}if (mm[nonpos][1] < features[index].score) {\r
-mm[nonpos][1] = features[index].score;\r
-}}}index++;\r
-}\r
-}\r
-this.updateRenderOrder (allfeatures);\r
-this.findingFeatures = false;\r
-}, "~B");\r
-Clazz.defineMethod (c$, "updateRenderOrder", \r
-($fz = function (allFeatures) {\r
-var allfeatures =  new java.util.ArrayList (allFeatures);\r
-var oldRender = this.renderOrder;\r
-this.renderOrder =  new Array (allfeatures.size ());\r
-var mmrange;\r
-var fc = null;\r
-var initOrders = (this.featureOrder == null);\r
-var opos = 0;\r
-if (oldRender != null && oldRender.length > 0) {\r
-for (var j = 0; j < oldRender.length; j++) {\r
-if (oldRender[j] != null) {\r
-if (initOrders) {\r
-this.setOrder (oldRender[j], (1 - (1 + j) / oldRender.length));\r
-}if (allfeatures.contains (oldRender[j])) {\r
-this.renderOrder[opos++] = oldRender[j];\r
-allfeatures.remove (oldRender[j]);\r
-if (this.minmax != null) {\r
-mmrange = this.minmax.get (oldRender[j]);\r
-if (mmrange != null) {\r
-fc = this.featureColours.get (oldRender[j]);\r
-if (fc != null && Clazz.instanceOf (fc, jalview.schemes.GraduatedColor) && (fc).isAutoScale ()) {\r
-(fc).updateBounds ((mmrange)[0][0], (mmrange)[0][1]);\r
-}}}}}}\r
-}if (allfeatures.size () == 0) {\r
-return;\r
-}var i = allfeatures.size () - 1;\r
-var iSize = i;\r
-var sort = false;\r
-var newf =  new Array (allfeatures.size ());\r
-var sortOrder =  Clazz.newFloatArray (allfeatures.size (), 0);\r
-for (var newfeat, $newfeat = allfeatures.iterator (); $newfeat.hasNext () && ((newfeat = $newfeat.next ()) || true);) {\r
-newf[i] = newfeat;\r
-if (this.minmax != null) {\r
-mmrange = this.minmax.get (newf[i]);\r
-if (mmrange != null) {\r
-fc = this.featureColours.get (newf[i]);\r
-if (fc != null && Clazz.instanceOf (fc, jalview.schemes.GraduatedColor) && (fc).isAutoScale ()) {\r
-(fc).updateBounds ((mmrange)[0][0], (mmrange)[0][1]);\r
-}}}if (initOrders || !this.featureOrder.containsKey (newf[i])) {\r
-var denom = initOrders ? allfeatures.size () : this.featureOrder.size ();\r
-this.setOrder (newf[i], i / denom);\r
-}sortOrder[i] = 2 - (this.featureOrder.get (newf[i])).floatValue ();\r
-if (i < iSize) {\r
-sort = sort || sortOrder[i] > sortOrder[i + 1];\r
-}i--;\r
-}\r
-if (iSize > 1 && sort) {\r
-jalview.util.QuickSort.sortFloatObject (sortOrder, newf);\r
-}sortOrder = null;\r
-System.arraycopy (newf, 0, this.renderOrder, opos, newf.length);\r
-}, $fz.isPrivate = true, $fz), "java.util.List");\r
-Clazz.overrideMethod (c$, "getFeatureStyle", \r
-function (featureType) {\r
-var fc = this.featureColours.get (featureType);\r
-if (fc == null) {\r
-var ucs =  new jalview.schemes.UserColourScheme ();\r
-var col = ucs.createColourFromName (featureType);\r
-this.featureColours.put (featureType, fc = col);\r
-}return fc;\r
-}, "~S");\r
-Clazz.defineMethod (c$, "getColour", \r
-function (featureType) {\r
-var fc = this.getFeatureStyle (featureType);\r
-if (Clazz.instanceOf (fc, java.awt.Color)) {\r
-return fc;\r
-} else {\r
-if (Clazz.instanceOf (fc, jalview.schemes.GraduatedColor)) {\r
-return (fc).getMaxColor ();\r
-}}throw  new Error ("Implementation Error: Unrecognised render object " + fc.getClass () + " for features of type " + featureType);\r
-}, "~S");\r
-Clazz.defineMethod (c$, "getColour", \r
-function (feature) {\r
-var fc = this.getFeatureStyle (feature.getType ());\r
-if (Clazz.instanceOf (fc, java.awt.Color)) {\r
-return fc;\r
-} else {\r
-if (Clazz.instanceOf (fc, jalview.schemes.GraduatedColor)) {\r
-return (fc).findColor (feature);\r
-}}throw  new Error ("Implementation Error: Unrecognised render object " + fc.getClass () + " for features of type " + feature.getType ());\r
-}, "jalview.datamodel.SequenceFeature");\r
-Clazz.defineMethod (c$, "showFeature", \r
-function (sequenceFeature) {\r
-var fc = this.getFeatureStyle (sequenceFeature.type);\r
-if (Clazz.instanceOf (fc, jalview.schemes.GraduatedColor)) {\r
-return (fc).isColored (sequenceFeature);\r
-} else {\r
-return true;\r
-}}, "jalview.datamodel.SequenceFeature");\r
-Clazz.defineMethod (c$, "showFeatureOfType", \r
-function (type) {\r
-return this.av.getFeaturesDisplayed ().isVisible (type);\r
-}, "~S");\r
-Clazz.overrideMethod (c$, "setColour", \r
-function (featureType, col) {\r
-{\r
-this.featureColours.put (featureType, col);\r
-}}, "~S,~O");\r
-Clazz.defineMethod (c$, "setTransparency", \r
-function (value) {\r
-this.transparency = value;\r
-}, "~N");\r
-Clazz.defineMethod (c$, "getTransparency", \r
-function () {\r
-return this.transparency;\r
-});\r
-Clazz.defineMethod (c$, "setOrder", \r
-function (type, position) {\r
-if (this.featureOrder == null) {\r
-this.featureOrder =  new java.util.Hashtable ();\r
-}this.featureOrder.put (type,  new Float (position));\r
-return position;\r
-}, "~S,~N");\r
-Clazz.defineMethod (c$, "getOrder", \r
-function (type) {\r
-if (this.featureOrder != null) {\r
-if (this.featureOrder.containsKey (type)) {\r
-return (this.featureOrder.get (type)).floatValue ();\r
-}}return -1;\r
-}, "~S");\r
-Clazz.overrideMethod (c$, "getFeatureColours", \r
-function () {\r
-return  new java.util.concurrent.ConcurrentHashMap (this.featureColours);\r
-});\r
-Clazz.defineMethod (c$, "setFeaturePriority", \r
-function (data) {\r
-this.setFeaturePriority (data, true);\r
-}, "~A");\r
-Clazz.defineMethod (c$, "setFeaturePriority", \r
-function (data, visibleNew) {\r
-var av_featuresdisplayed = null;\r
-if (visibleNew) {\r
-if ((av_featuresdisplayed = this.av.getFeaturesDisplayed ()) != null) {\r
-this.av.getFeaturesDisplayed ().clear ();\r
-} else {\r
-this.av.setFeaturesDisplayed (av_featuresdisplayed =  new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());\r
-}} else {\r
-av_featuresdisplayed = this.av.getFeaturesDisplayed ();\r
-}if (data == null) {\r
-return;\r
-}this.renderOrder =  new Array (data.length);\r
-if (data.length > 0) {\r
-for (var i = 0; i < data.length; i++) {\r
-var type = data[i][0].toString ();\r
-this.setColour (type, data[i][1]);\r
-if ((data[i][2]).booleanValue ()) {\r
-av_featuresdisplayed.setVisible (type);\r
-}this.renderOrder[data.length - i - 1] = type;\r
-}\r
-}}, "~A,~B");\r
-Clazz.defineMethod (c$, "addPropertyChangeListener", \r
-function (listener) {\r
-this.changeSupport.addPropertyChangeListener (listener);\r
-}, "java.beans.PropertyChangeListener");\r
-Clazz.defineMethod (c$, "removePropertyChangeListener", \r
-function (listener) {\r
-this.changeSupport.removePropertyChangeListener (listener);\r
-}, "java.beans.PropertyChangeListener");\r
-Clazz.defineMethod (c$, "getAllFeatureColours", \r
-function () {\r
-return this.featureColours.keySet ();\r
-});\r
-Clazz.defineMethod (c$, "clearRenderOrder", \r
-function () {\r
-this.renderOrder = null;\r
-});\r
-Clazz.defineMethod (c$, "hasRenderOrder", \r
-function () {\r
-return this.renderOrder != null;\r
-});\r
-Clazz.defineMethod (c$, "getRenderOrder", \r
-function () {\r
-if (this.renderOrder == null) {\r
-return java.util.Arrays.asList ( Clazz.newArray (-1, []));\r
-}return java.util.Arrays.asList (this.renderOrder);\r
-});\r
-Clazz.defineMethod (c$, "getFeatureGroupsSize", \r
-function () {\r
-return this.featureGroups != null ? 0 : this.featureGroups.size ();\r
-});\r
-Clazz.overrideMethod (c$, "getFeatureGroups", \r
-function () {\r
-return (this.featureGroups == null) ? java.util.Arrays.asList ( new Array (0)) : java.util.Arrays.asList (this.featureGroups.keySet ().toArray ( new Array (0)));\r
-});\r
-Clazz.defineMethod (c$, "checkGroupVisibility", \r
-function (group, newGroupsVisible) {\r
-if (this.featureGroups == null) {\r
-}if (this.featureGroups.containsKey (group)) {\r
-return this.featureGroups.get (group).booleanValue ();\r
-}if (newGroupsVisible) {\r
-this.featureGroups.put (group,  new Boolean (true));\r
-return true;\r
-}return false;\r
-}, "~S,~B");\r
-Clazz.overrideMethod (c$, "getGroups", \r
-function (visible) {\r
-if (this.featureGroups != null) {\r
-var gp =  new java.util.ArrayList ();\r
-for (var grp, $grp = this.featureGroups.keySet ().iterator (); $grp.hasNext () && ((grp = $grp.next ()) || true);) {\r
-var state = this.featureGroups.get (grp);\r
-if (state.booleanValue () == visible) {\r
-gp.add (grp);\r
-}}\r
-return gp;\r
-}return null;\r
-}, "~B");\r
-Clazz.defineMethod (c$, "setGroupVisibility", \r
-function (group, visible) {\r
-this.featureGroups.put (group,  new Boolean (visible));\r
-}, "~S,~B");\r
-Clazz.defineMethod (c$, "setGroupVisibility", \r
-function (toset, visible) {\r
-if (toset != null && toset.size () > 0 && this.featureGroups != null) {\r
-var rdrw = false;\r
-for (var gst, $gst = toset.iterator (); $gst.hasNext () && ((gst = $gst.next ()) || true);) {\r
-var st = this.featureGroups.get (gst);\r
-this.featureGroups.put (gst,  new Boolean (visible));\r
-if (st != null) {\r
-rdrw = rdrw || (visible != st.booleanValue ());\r
-}}\r
-if (rdrw) {\r
-}}}, "java.util.List,~B");\r
-Clazz.overrideMethod (c$, "getDisplayedFeatureCols", \r
-function () {\r
-var fcols =  new java.util.Hashtable ();\r
-if (this.getViewport ().getFeaturesDisplayed () == null) {\r
-return fcols;\r
-}var en = this.getViewport ().getFeaturesDisplayed ().getVisibleFeatures ();\r
-while (en.hasNext ()) {\r
-var col = en.next ();\r
-fcols.put (col, this.getColour (col));\r
-}\r
-return fcols;\r
-});\r
-Clazz.defineMethod (c$, "getFeaturesDisplayed", \r
-function () {\r
-return this.av.getFeaturesDisplayed ();\r
-});\r
-Clazz.overrideMethod (c$, "getDisplayedFeatureTypes", \r
-function () {\r
-var typ = null;\r
-typ = this.getRenderOrder ().toArray ( new Array (0));\r
-var feature_disp = this.av.getFeaturesDisplayed ();\r
-if (feature_disp != null) {\r
-{\r
-for (var i = 0; i < typ.length; i++) {\r
-if (!feature_disp.isVisible (typ[i])) {\r
-typ[i] = null;\r
-}}\r
-}}return typ;\r
-});\r
-Clazz.overrideMethod (c$, "getDisplayedFeatureGroups", \r
-function () {\r
-var gps = null;\r
-var _gps =  new java.util.ArrayList ();\r
-var en = this.getFeatureGroups ().iterator ();\r
-var g = 0;\r
-var valid = false;\r
-while (en.hasNext ()) {\r
-var gp = en.next ();\r
-if (this.checkGroupVisibility (gp, false)) {\r
-valid = true;\r
-_gps.add (gp);\r
-}if (!valid) {\r
-return null;\r
-} else {\r
-gps =  new Array (_gps.size ());\r
-_gps.toArray (gps);\r
-}}\r
-return gps;\r
-});\r
-});\r
+Clazz.declarePackage ("jalview.viewmodel.seqfeatures");
+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 () {
+c$ = Clazz.decorateAsClass (function () {
+this.transparency = 1.0;
+this.featureColours = null;
+this.featureGroups = null;
+this.currentColour = null;
+this.renderOrder = null;
+this.changeSupport = null;
+this.av = null;
+this.minmax = null;
+this.newFeatureAdded = false;
+this.findingFeatures = false;
+this.firing = null;
+this.featureOrder = null;
+Clazz.instantialize (this, arguments);
+}, jalview.viewmodel.seqfeatures, "FeatureRendererModel", null, jalview.api.FeatureRenderer);
+Clazz.prepareFields (c$, function () {
+this.featureColours =  new java.util.concurrent.ConcurrentHashMap ();
+this.featureGroups =  new java.util.concurrent.ConcurrentHashMap ();
+this.changeSupport =  new java.beans.PropertyChangeSupport (this);
+this.minmax =  new java.util.Hashtable ();
+this.firing = Boolean.FALSE;
+});
+Clazz.overrideMethod (c$, "getViewport", 
+function () {
+return this.av;
+});
+Clazz.defineMethod (c$, "getSettings", 
+function () {
+return  new jalview.viewmodel.seqfeatures.FeatureRendererSettings (this);
+});
+Clazz.defineMethod (c$, "transferSettings", 
+function (fr) {
+this.renderOrder = fr.renderOrder;
+this.featureGroups = fr.featureGroups;
+this.featureColours = fr.featureColours;
+this.transparency = fr.transparency;
+this.featureOrder = fr.featureOrder;
+}, "jalview.viewmodel.seqfeatures.FeatureRendererSettings");
+Clazz.defineMethod (c$, "transferSettings", 
+function (_fr) {
+var fr = _fr;
+var frs =  new jalview.viewmodel.seqfeatures.FeatureRendererSettings (fr);
+this.renderOrder = frs.renderOrder;
+this.featureGroups = frs.featureGroups;
+this.featureColours = frs.featureColours;
+this.transparency = frs.transparency;
+this.featureOrder = frs.featureOrder;
+if (this.av != null && this.av !== fr.getViewport ()) {
+if (_fr.getFeaturesDisplayed () != null) {
+var fd = this.getFeaturesDisplayed ();
+if (fd == null) {
+this.setFeaturesDisplayedFrom (_fr.getFeaturesDisplayed ());
+} else {
+{
+fd.clear ();
+var fdisp = _fr.getFeaturesDisplayed ().getVisibleFeatures ();
+while (fdisp.hasNext ()) {
+fd.setVisible (fdisp.next ());
+}
+}}}}}, "jalview.api.FeatureRenderer");
+Clazz.defineMethod (c$, "setFeaturesDisplayedFrom", 
+function (featuresDisplayed) {
+this.av.setFeaturesDisplayed ( new jalview.viewmodel.seqfeatures.FeaturesDisplayed (featuresDisplayed));
+}, "jalview.api.FeaturesDisplayedI");
+Clazz.overrideMethod (c$, "setVisible", 
+function (featureType) {
+var fdi = this.av.getFeaturesDisplayed ();
+if (fdi == null) {
+this.av.setFeaturesDisplayed (fdi =  new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());
+}if (!fdi.isRegistered (featureType)) {
+this.pushFeatureType (java.util.Arrays.asList ( Clazz.newArray (-1, [featureType])));
+}fdi.setVisible (featureType);
+}, "~S");
+Clazz.overrideMethod (c$, "setAllVisible", 
+function (featureTypes) {
+var fdi = this.av.getFeaturesDisplayed ();
+if (fdi == null) {
+this.av.setFeaturesDisplayed (fdi =  new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());
+}var nft =  new java.util.ArrayList ();
+for (var featureType, $featureType = featureTypes.iterator (); $featureType.hasNext () && ((featureType = $featureType.next ()) || true);) {
+if (!fdi.isRegistered (featureType)) {
+nft.add (featureType);
+}}
+if (nft.size () > 0) {
+this.pushFeatureType (nft);
+}fdi.setAllVisible (featureTypes);
+}, "java.util.List");
+Clazz.defineMethod (c$, "pushFeatureType", 
+($fz = function (types) {
+var ts = types.size ();
+var neworder =  new Array ((this.renderOrder == null ? 0 : this.renderOrder.length) + ts);
+types.toArray (neworder);
+if (this.renderOrder != null) {
+System.arraycopy (neworder, 0, neworder, this.renderOrder.length, ts);
+System.arraycopy (this.renderOrder, 0, neworder, 0, this.renderOrder.length);
+}this.renderOrder = neworder;
+}, $fz.isPrivate = true, $fz), "java.util.List");
+Clazz.defineMethod (c$, "getMinMax", 
+function () {
+return this.minmax;
+});
+Clazz.defineMethod (c$, "normaliseScore", 
+function (sequenceFeature) {
+var mm = (this.minmax.get (sequenceFeature.type))[0];
+var r =  Clazz.newByteArray (-1, [0, 255]);
+if (mm != null) {
+if (r[0] != 0 || mm[0] < 0.0) {
+r[0] = 1;
+r[1] = Clazz.doubleToByte (Clazz.doubleToInt (128.0) + 127.0 * (sequenceFeature.score / mm[1]));
+} else {
+r[1] = Clazz.floatToByte (Clazz.doubleToInt (255.0) * (sequenceFeature.score / mm[1]));
+}}return r;
+}, "jalview.datamodel.SequenceFeature");
+Clazz.defineMethod (c$, "updateFeatures", 
+function () {
+if (this.av.getFeaturesDisplayed () == null || this.renderOrder == null || this.newFeatureAdded) {
+this.findAllFeatures ();
+if (this.av.getFeaturesDisplayed ().getVisibleFeatureCount () < 1) {
+return false;
+}}return true;
+});
+Clazz.defineMethod (c$, "findAllFeatures", 
+function () {
+{
+if (this.firing.equals (Boolean.FALSE)) {
+this.firing = Boolean.TRUE;
+this.findAllFeatures (true);
+this.changeSupport.firePropertyChange ("changeSupport", null, null);
+this.firing = Boolean.FALSE;
+}}});
+Clazz.overrideMethod (c$, "findFeaturesAtRes", 
+function (sequence, res) {
+var tmp =  new java.util.ArrayList ();
+var features = sequence.getSequenceFeatures ();
+if (features != null) {
+for (var i = 0; i < features.length; i++) {
+if (!this.av.areFeaturesDisplayed () || !this.av.getFeaturesDisplayed ().isVisible (features[i].getType ())) {
+continue;
+}if (features[i].featureGroup != null && this.featureGroups != null && this.featureGroups.containsKey (features[i].featureGroup) && !this.featureGroups.get (features[i].featureGroup).booleanValue ()) {
+continue;
+}if ((features[i].getBegin () <= res) && (features[i].getEnd () >= res)) {
+tmp.add (features[i]);
+}}
+}return tmp;
+}, "jalview.datamodel.SequenceI,~N");
+Clazz.defineMethod (c$, "findAllFeatures", 
+function (newMadeVisible) {
+this.newFeatureAdded = false;
+if (this.findingFeatures) {
+this.newFeatureAdded = true;
+return;
+}this.findingFeatures = true;
+if (this.av.getFeaturesDisplayed () == null) {
+this.av.setFeaturesDisplayed ( new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());
+}var featuresDisplayed = this.av.getFeaturesDisplayed ();
+var allfeatures =  new java.util.ArrayList ();
+var oldfeatures =  new java.util.ArrayList ();
+if (this.renderOrder != null) {
+for (var i = 0; i < this.renderOrder.length; i++) {
+if (this.renderOrder[i] != null) {
+oldfeatures.add (this.renderOrder[i]);
+}}
+}if (this.minmax == null) {
+this.minmax =  new java.util.Hashtable ();
+}var alignment = this.av.getAlignment ();
+for (var i = 0; i < alignment.getHeight (); i++) {
+var asq = alignment.getSequenceAt (i);
+var features = asq.getSequenceFeatures ();
+if (features == null) {
+continue;
+}var index = 0;
+while (index < features.length) {
+if (!featuresDisplayed.isRegistered (features[index].getType ())) {
+var fgrp = features[index].getFeatureGroup ();
+if (fgrp != null) {
+var groupDisplayed = this.featureGroups.get (fgrp);
+if (groupDisplayed == null) {
+groupDisplayed = Boolean.$valueOf (newMadeVisible);
+this.featureGroups.put (fgrp, groupDisplayed);
+}if (!groupDisplayed.booleanValue ()) {
+index++;
+continue;
+}}if (!(features[index].begin == 0 && features[index].end == 0)) {
+if (newMadeVisible && !oldfeatures.contains (features[index].getType ())) {
+featuresDisplayed.setVisible (features[index].getType ());
+this.setOrder (features[index].getType (), 0);
+}}}if (!allfeatures.contains (features[index].getType ())) {
+allfeatures.add (features[index].getType ());
+}if (!Float.isNaN (features[index].score)) {
+var nonpos = features[index].getBegin () >= 1 ? 0 : 1;
+var mm = this.minmax.get (features[index].getType ());
+if (mm == null) {
+mm =  Clazz.newArray (-1, [null, null]);
+this.minmax.put (features[index].getType (), mm);
+}if (mm[nonpos] == null) {
+mm[nonpos] =  Clazz.newFloatArray (-1, [features[index].score, features[index].score]);
+} else {
+if (mm[nonpos][0] > features[index].score) {
+mm[nonpos][0] = features[index].score;
+}if (mm[nonpos][1] < features[index].score) {
+mm[nonpos][1] = features[index].score;
+}}}index++;
+}
+}
+this.updateRenderOrder (allfeatures);
+this.findingFeatures = false;
+}, "~B");
+Clazz.defineMethod (c$, "updateRenderOrder", 
+($fz = function (allFeatures) {
+var allfeatures =  new java.util.ArrayList (allFeatures);
+var oldRender = this.renderOrder;
+this.renderOrder =  new Array (allfeatures.size ());
+var mmrange;
+var fc = null;
+var initOrders = (this.featureOrder == null);
+var opos = 0;
+if (oldRender != null && oldRender.length > 0) {
+for (var j = 0; j < oldRender.length; j++) {
+if (oldRender[j] != null) {
+if (initOrders) {
+this.setOrder (oldRender[j], (1 - (1 + j) / oldRender.length));
+}if (allfeatures.contains (oldRender[j])) {
+this.renderOrder[opos++] = oldRender[j];
+allfeatures.remove (oldRender[j]);
+if (this.minmax != null) {
+mmrange = this.minmax.get (oldRender[j]);
+if (mmrange != null) {
+fc = this.featureColours.get (oldRender[j]);
+if (fc != null && Clazz.instanceOf (fc, jalview.schemes.GraduatedColor) && (fc).isAutoScale ()) {
+(fc).updateBounds ((mmrange)[0][0], (mmrange)[0][1]);
+}}}}}}
+}if (allfeatures.size () == 0) {
+return;
+}var i = allfeatures.size () - 1;
+var iSize = i;
+var sort = false;
+var newf =  new Array (allfeatures.size ());
+var sortOrder =  Clazz.newFloatArray (allfeatures.size (), 0);
+for (var newfeat, $newfeat = allfeatures.iterator (); $newfeat.hasNext () && ((newfeat = $newfeat.next ()) || true);) {
+newf[i] = newfeat;
+if (this.minmax != null) {
+mmrange = this.minmax.get (newf[i]);
+if (mmrange != null) {
+fc = this.featureColours.get (newf[i]);
+if (fc != null && Clazz.instanceOf (fc, jalview.schemes.GraduatedColor) && (fc).isAutoScale ()) {
+(fc).updateBounds ((mmrange)[0][0], (mmrange)[0][1]);
+}}}if (initOrders || !this.featureOrder.containsKey (newf[i])) {
+var denom = initOrders ? allfeatures.size () : this.featureOrder.size ();
+this.setOrder (newf[i], i / denom);
+}sortOrder[i] = 2 - (this.featureOrder.get (newf[i])).floatValue ();
+if (i < iSize) {
+sort = sort || sortOrder[i] > sortOrder[i + 1];
+}i--;
+}
+if (iSize > 1 && sort) {
+jalview.util.QuickSort.sortFloatObject (sortOrder, newf);
+}sortOrder = null;
+System.arraycopy (newf, 0, this.renderOrder, opos, newf.length);
+}, $fz.isPrivate = true, $fz), "java.util.List");
+Clazz.overrideMethod (c$, "getFeatureStyle", 
+function (featureType) {
+var fc = this.featureColours.get (featureType);
+if (fc == null) {
+var ucs =  new jalview.schemes.UserColourScheme ();
+var col = ucs.createColourFromName (featureType);
+this.featureColours.put (featureType, fc = col);
+}return fc;
+}, "~S");
+Clazz.defineMethod (c$, "getColour", 
+function (featureType) {
+var fc = this.getFeatureStyle (featureType);
+if (Clazz.instanceOf (fc, java.awt.Color)) {
+return fc;
+} else {
+if (Clazz.instanceOf (fc, jalview.schemes.GraduatedColor)) {
+return (fc).getMaxColor ();
+}}throw  new Error ("Implementation Error: Unrecognised render object " + fc.getClass () + " for features of type " + featureType);
+}, "~S");
+Clazz.defineMethod (c$, "getColour", 
+function (feature) {
+var fc = this.getFeatureStyle (feature.getType ());
+if (Clazz.instanceOf (fc, java.awt.Color)) {
+return fc;
+} else {
+if (Clazz.instanceOf (fc, jalview.schemes.GraduatedColor)) {
+return (fc).findColor (feature);
+}}throw  new Error ("Implementation Error: Unrecognised render object " + fc.getClass () + " for features of type " + feature.getType ());
+}, "jalview.datamodel.SequenceFeature");
+Clazz.defineMethod (c$, "showFeature", 
+function (sequenceFeature) {
+var fc = this.getFeatureStyle (sequenceFeature.type);
+if (Clazz.instanceOf (fc, jalview.schemes.GraduatedColor)) {
+return (fc).isColored (sequenceFeature);
+} else {
+return true;
+}}, "jalview.datamodel.SequenceFeature");
+Clazz.defineMethod (c$, "showFeatureOfType", 
+function (type) {
+return this.av.getFeaturesDisplayed ().isVisible (type);
+}, "~S");
+Clazz.overrideMethod (c$, "setColour", 
+function (featureType, col) {
+{
+this.featureColours.put (featureType, col);
+}}, "~S,~O");
+Clazz.defineMethod (c$, "setTransparency", 
+function (value) {
+this.transparency = value;
+}, "~N");
+Clazz.defineMethod (c$, "getTransparency", 
+function () {
+return this.transparency;
+});
+Clazz.defineMethod (c$, "setOrder", 
+function (type, position) {
+if (this.featureOrder == null) {
+this.featureOrder =  new java.util.Hashtable ();
+}this.featureOrder.put (type,  new Float (position));
+return position;
+}, "~S,~N");
+Clazz.defineMethod (c$, "getOrder", 
+function (type) {
+if (this.featureOrder != null) {
+if (this.featureOrder.containsKey (type)) {
+return (this.featureOrder.get (type)).floatValue ();
+}}return -1;
+}, "~S");
+Clazz.overrideMethod (c$, "getFeatureColours", 
+function () {
+return  new java.util.concurrent.ConcurrentHashMap (this.featureColours);
+});
+Clazz.defineMethod (c$, "setFeaturePriority", 
+function (data) {
+this.setFeaturePriority (data, true);
+}, "~A");
+Clazz.defineMethod (c$, "setFeaturePriority", 
+function (data, visibleNew) {
+var av_featuresdisplayed = null;
+if (visibleNew) {
+if ((av_featuresdisplayed = this.av.getFeaturesDisplayed ()) != null) {
+this.av.getFeaturesDisplayed ().clear ();
+} else {
+this.av.setFeaturesDisplayed (av_featuresdisplayed =  new jalview.viewmodel.seqfeatures.FeaturesDisplayed ());
+}} else {
+av_featuresdisplayed = this.av.getFeaturesDisplayed ();
+}if (data == null) {
+return;
+}this.renderOrder =  new Array (data.length);
+if (data.length > 0) {
+for (var i = 0; i < data.length; i++) {
+var type = data[i][0].toString ();
+this.setColour (type, data[i][1]);
+if ((data[i][2]).booleanValue ()) {
+av_featuresdisplayed.setVisible (type);
+}this.renderOrder[data.length - i - 1] = type;
+}
+}}, "~A,~B");
+Clazz.defineMethod (c$, "addPropertyChangeListener", 
+function (listener) {
+this.changeSupport.addPropertyChangeListener (listener);
+}, "java.beans.PropertyChangeListener");
+Clazz.defineMethod (c$, "removePropertyChangeListener", 
+function (listener) {
+this.changeSupport.removePropertyChangeListener (listener);
+}, "java.beans.PropertyChangeListener");
+Clazz.defineMethod (c$, "getAllFeatureColours", 
+function () {
+return this.featureColours.keySet ();
+});
+Clazz.defineMethod (c$, "clearRenderOrder", 
+function () {
+this.renderOrder = null;
+});
+Clazz.defineMethod (c$, "hasRenderOrder", 
+function () {
+return this.renderOrder != null;
+});
+Clazz.defineMethod (c$, "getRenderOrder", 
+function () {
+if (this.renderOrder == null) {
+return java.util.Arrays.asList ( Clazz.newArray (-1, []));
+}return java.util.Arrays.asList (this.renderOrder);
+});
+Clazz.defineMethod (c$, "getFeatureGroupsSize", 
+function () {
+return this.featureGroups != null ? 0 : this.featureGroups.size ();
+});
+Clazz.overrideMethod (c$, "getFeatureGroups", 
+function () {
+return (this.featureGroups == null) ? java.util.Arrays.asList ( new Array (0)) : java.util.Arrays.asList (this.featureGroups.keySet ().toArray ( new Array (0)));
+});
+Clazz.defineMethod (c$, "checkGroupVisibility", 
+function (group, newGroupsVisible) {
+if (this.featureGroups == null) {
+}if (this.featureGroups.containsKey (group)) {
+return this.featureGroups.get (group).booleanValue ();
+}if (newGroupsVisible) {
+this.featureGroups.put (group,  new Boolean (true));
+return true;
+}return false;
+}, "~S,~B");
+Clazz.overrideMethod (c$, "getGroups", 
+function (visible) {
+if (this.featureGroups != null) {
+var gp =  new java.util.ArrayList ();
+for (var grp, $grp = this.featureGroups.keySet ().iterator (); $grp.hasNext () && ((grp = $grp.next ()) || true);) {
+var state = this.featureGroups.get (grp);
+if (state.booleanValue () == visible) {
+gp.add (grp);
+}}
+return gp;
+}return null;
+}, "~B");
+Clazz.defineMethod (c$, "setGroupVisibility", 
+function (group, visible) {
+this.featureGroups.put (group,  new Boolean (visible));
+}, "~S,~B");
+Clazz.defineMethod (c$, "setGroupVisibility", 
+function (toset, visible) {
+if (toset != null && toset.size () > 0 && this.featureGroups != null) {
+var rdrw = false;
+for (var gst, $gst = toset.iterator (); $gst.hasNext () && ((gst = $gst.next ()) || true);) {
+var st = this.featureGroups.get (gst);
+this.featureGroups.put (gst,  new Boolean (visible));
+if (st != null) {
+rdrw = rdrw || (visible != st.booleanValue ());
+}}
+if (rdrw) {
+}}}, "java.util.List,~B");
+Clazz.overrideMethod (c$, "getDisplayedFeatureCols", 
+function () {
+var fcols =  new java.util.Hashtable ();
+if (this.getViewport ().getFeaturesDisplayed () == null) {
+return fcols;
+}var en = this.getViewport ().getFeaturesDisplayed ().getVisibleFeatures ();
+while (en.hasNext ()) {
+var col = en.next ();
+fcols.put (col, this.getColour (col));
+}
+return fcols;
+});
+Clazz.defineMethod (c$, "getFeaturesDisplayed", 
+function () {
+return this.av.getFeaturesDisplayed ();
+});
+Clazz.overrideMethod (c$, "getDisplayedFeatureTypes", 
+function () {
+var typ = null;
+typ = this.getRenderOrder ().toArray ( new Array (0));
+var feature_disp = this.av.getFeaturesDisplayed ();
+if (feature_disp != null) {
+{
+for (var i = 0; i < typ.length; i++) {
+if (!feature_disp.isVisible (typ[i])) {
+typ[i] = null;
+}}
+}}return typ;
+});
+Clazz.overrideMethod (c$, "getDisplayedFeatureGroups", 
+function () {
+var gps = null;
+var _gps =  new java.util.ArrayList ();
+var en = this.getFeatureGroups ().iterator ();
+var g = 0;
+var valid = false;
+while (en.hasNext ()) {
+var gp = en.next ();
+if (this.checkGroupVisibility (gp, false)) {
+valid = true;
+_gps.add (gp);
+}if (!valid) {
+return null;
+} else {
+gps =  new Array (_gps.size ());
+_gps.toArray (gps);
+}}
+return gps;
+});
+});