[483] | 1 | define(["dojo/_base/lang", "dojo/_base/declare", "dojox/gfx", "dojo/_base/array", "dojox/widget/_Invalidating", "dojo/_base/sniff"], |
---|
| 2 | function(lang, declare, gfx, array, _Invalidating, has){ |
---|
| 3 | return declare("dojox.dgauges.ScaleBase", _Invalidating, { |
---|
| 4 | // summary: |
---|
| 5 | // The ScaleBase class is the base class for the circular and rectangular scales. |
---|
| 6 | // A scaler must be set to use this class. A scaler is responsible for |
---|
| 7 | // tick generation and various data-transform operations. |
---|
| 8 | |
---|
| 9 | // scaler: Object |
---|
| 10 | // The scaler used for tick generation and data-transform operations. |
---|
| 11 | // This property is mandatory for using the scale. |
---|
| 12 | scaler: null, |
---|
| 13 | // font: Object |
---|
| 14 | // The font used for the ticks labels. |
---|
| 15 | // This is null by default which means this scale use the font defined |
---|
| 16 | // on the gauge. |
---|
| 17 | font: null, |
---|
| 18 | // labelPosition: String |
---|
| 19 | // See CircularScale and RectangularScale for valid values. |
---|
| 20 | labelPosition: null, |
---|
| 21 | // labelGap: Number |
---|
| 22 | // The label gap between the ticks and their labels. Default value is 1. |
---|
| 23 | labelGap: 1, |
---|
| 24 | // tickStroke: Object |
---|
| 25 | // The GFX stroke used by the default tickShapeFunc implementation. |
---|
| 26 | tickStroke: null, |
---|
| 27 | _gauge: null, |
---|
| 28 | _gfxGroup: null, |
---|
| 29 | _bgGroup: null, |
---|
| 30 | _fgGroup: null, |
---|
| 31 | _indicators: null, |
---|
| 32 | _indicatorsIndex: null, |
---|
| 33 | _indicatorsRenderers: null, |
---|
| 34 | |
---|
| 35 | constructor: function(){ |
---|
| 36 | this._indicators = []; |
---|
| 37 | this._indicatorsIndex = {}; |
---|
| 38 | this._indicatorsRenderers = {}; |
---|
| 39 | this._gauge = null; |
---|
| 40 | this._gfxGroup = null; |
---|
| 41 | // Fix for #1, IE<9 don't render correctly stroke with width<1 |
---|
| 42 | this.tickStroke = {color: "black", width: has("ie") <= 8 ? 1 : 0.5}; |
---|
| 43 | |
---|
| 44 | this.addInvalidatingProperties(["scaler", "font", "labelGap", "labelPosition", "tickShapeFunc", "tickLabelFunc", "tickStroke"]); |
---|
| 45 | |
---|
| 46 | this.watch("scaler", lang.hitch(this, this._watchScaler)); |
---|
| 47 | }, |
---|
| 48 | |
---|
| 49 | postscript: function(mixin){ |
---|
| 50 | // summary: |
---|
| 51 | // Internal method. |
---|
| 52 | // tags: |
---|
| 53 | // private |
---|
| 54 | this.inherited(arguments); |
---|
| 55 | if(mixin && mixin.scaler){ |
---|
| 56 | this._watchScaler("scaler", null, mixin.scaler); |
---|
| 57 | } |
---|
| 58 | }, |
---|
| 59 | |
---|
| 60 | _watchers: null, |
---|
| 61 | |
---|
| 62 | _watchScaler: function(name, oldValue, newValue){ |
---|
| 63 | // summary: |
---|
| 64 | // Internal method. |
---|
| 65 | // tags: |
---|
| 66 | // private |
---|
| 67 | array.forEach(this._watchers, lang.hitch(this, function(entry){ |
---|
| 68 | entry.unwatch(); |
---|
| 69 | })); |
---|
| 70 | |
---|
| 71 | // Get the properties declared by the watched object |
---|
| 72 | var props = newValue.watchedProperties; |
---|
| 73 | this._watchers = []; |
---|
| 74 | array.forEach(props, lang.hitch(this, function(entry){ |
---|
| 75 | this._watchers.push(newValue.watch(entry, lang.hitch(this, this.invalidateRendering))); |
---|
| 76 | })); |
---|
| 77 | }, |
---|
| 78 | |
---|
| 79 | _getFont: function(){ |
---|
| 80 | // summary: |
---|
| 81 | // Internal method. |
---|
| 82 | // tags: |
---|
| 83 | // private |
---|
| 84 | var font = this.font; |
---|
| 85 | if(!font){ |
---|
| 86 | font = this._gauge.font; |
---|
| 87 | } |
---|
| 88 | if(!font){ |
---|
| 89 | font = gfx.defaultFont; |
---|
| 90 | } |
---|
| 91 | return font; |
---|
| 92 | }, |
---|
| 93 | |
---|
| 94 | positionForValue: function(value){ |
---|
| 95 | // summary: |
---|
| 96 | // See CircularScale and Rectangular for more informations. |
---|
| 97 | // value: Number |
---|
| 98 | // The value to convert. |
---|
| 99 | // returns: Number |
---|
| 100 | // The position corresponding to the value. |
---|
| 101 | return 0; |
---|
| 102 | }, |
---|
| 103 | |
---|
| 104 | valueForPosition: function(position){ |
---|
| 105 | // summary: |
---|
| 106 | // See CircularScale and Rectangular for more informations. |
---|
| 107 | // position: Number |
---|
| 108 | // The position to convert. |
---|
| 109 | // returns: Number |
---|
| 110 | // The value corresponding to the position. |
---|
| 111 | }, |
---|
| 112 | |
---|
| 113 | tickLabelFunc: function(tickItem){ |
---|
| 114 | // summary: |
---|
| 115 | // Customize the text of ticks labels. |
---|
| 116 | // tickItem: Object |
---|
| 117 | // An object containing the tick informations. |
---|
| 118 | // returns: String |
---|
| 119 | // The text to be aligned with the tick. If null, the tick has no label. |
---|
| 120 | if(tickItem.isMinor){ |
---|
| 121 | return null; |
---|
| 122 | }else{ |
---|
| 123 | return String(tickItem.value); |
---|
| 124 | } |
---|
| 125 | }, |
---|
| 126 | |
---|
| 127 | tickShapeFunc: function(group, scale, tickItem){ |
---|
| 128 | // summary: |
---|
| 129 | // Customize the shape of ticks. |
---|
| 130 | // group: dojox/gfx/Group |
---|
| 131 | // The GFX group used for drawing the tick. |
---|
| 132 | // scale: dojox/dgauges/ScaleBase |
---|
| 133 | // The scale being processed. |
---|
| 134 | // tickItem: Object |
---|
| 135 | // An object containing the tick informations. |
---|
| 136 | return group.createLine({ |
---|
| 137 | x1: 0, |
---|
| 138 | y1: 0, |
---|
| 139 | x2: tickItem.isMinor ? 6 : 10, |
---|
| 140 | y2: 0 |
---|
| 141 | }).setStroke(this.tickStroke); |
---|
| 142 | }, |
---|
| 143 | |
---|
| 144 | getIndicatorRenderer: function(name){ |
---|
| 145 | // summary: |
---|
| 146 | // Gets the GFX shape of an indicator. |
---|
| 147 | // name: String |
---|
| 148 | // The name of the indicator as defined using addIndicator. |
---|
| 149 | // returns: dojox/gfx/canvas/Shape |
---|
| 150 | // The GFX shape of the indicator. |
---|
| 151 | return this._indicatorsRenderers[name]; |
---|
| 152 | }, |
---|
| 153 | |
---|
| 154 | removeIndicator: function(name){ |
---|
| 155 | // summary: |
---|
| 156 | // Removes an indicator. |
---|
| 157 | // name: String |
---|
| 158 | // The name of the indicator as defined using addIndicator. |
---|
| 159 | // returns: IndicatorBase |
---|
| 160 | // The removed indicator. |
---|
| 161 | var indicator = this._indicatorsIndex[name]; |
---|
| 162 | if(indicator){ |
---|
| 163 | indicator._gfxGroup.removeShape(); |
---|
| 164 | var idx = this._indicators.indexOf(indicator); |
---|
| 165 | this._indicators.splice(idx, 1); |
---|
| 166 | |
---|
| 167 | indicator._disconnectListeners(); |
---|
| 168 | |
---|
| 169 | delete this._indicatorsIndex[name]; |
---|
| 170 | delete this._indicatorsRenderers[name]; |
---|
| 171 | } |
---|
| 172 | if(this._gauge){ |
---|
| 173 | this._gauge._resetMainIndicator(); |
---|
| 174 | } |
---|
| 175 | this.invalidateRendering(); |
---|
| 176 | return indicator; |
---|
| 177 | }, |
---|
| 178 | |
---|
| 179 | getIndicator: function(name){ |
---|
| 180 | // summary: |
---|
| 181 | // Get an indicator instance. |
---|
| 182 | // name: String |
---|
| 183 | // The name of the indicator as defined using addIndicator. |
---|
| 184 | // returns: IndicatorBase |
---|
| 185 | // The indicator associated with the name parameter. |
---|
| 186 | return this._indicatorsIndex[name]; |
---|
| 187 | }, |
---|
| 188 | |
---|
| 189 | addIndicator: function(name, indicator, behindScale){ |
---|
| 190 | // summary: |
---|
| 191 | // Add an indicator to the scale. Before calling this function, ensure |
---|
| 192 | // this scale has already been added to a gauge using the addElement method |
---|
| 193 | // of the gauge. |
---|
| 194 | // name: String |
---|
| 195 | // The name of the indicator to be added. |
---|
| 196 | // indicator: dojox/dgauges/IndicatorBase |
---|
| 197 | // The indicator to add to this scale. |
---|
| 198 | // behindScale: Boolean |
---|
| 199 | // If true, this indicator is drawn behind the scale. Default value is false. |
---|
| 200 | if(this._indicatorsIndex[name] && this._indicatorsIndex[name] != indicator){ |
---|
| 201 | this.removeIndicator(name); |
---|
| 202 | } |
---|
| 203 | |
---|
| 204 | this._indicators.push(indicator); |
---|
| 205 | this._indicatorsIndex[name] = indicator; |
---|
| 206 | |
---|
| 207 | if(!this._ticksGroup){ |
---|
| 208 | this._createSubGroups(); |
---|
| 209 | } |
---|
| 210 | |
---|
| 211 | var group = behindScale ? this._bgGroup : this._fgGroup; |
---|
| 212 | indicator._gfxGroup = group.createGroup(); |
---|
| 213 | |
---|
| 214 | indicator.scale = this; |
---|
| 215 | |
---|
| 216 | return this.invalidateRendering(); |
---|
| 217 | }, |
---|
| 218 | |
---|
| 219 | _createSubGroups: function(){ |
---|
| 220 | // summary: |
---|
| 221 | // Internal method. |
---|
| 222 | // tags: |
---|
| 223 | // private |
---|
| 224 | if(!this._gfxGroup || this._ticksGroup){ |
---|
| 225 | return; |
---|
| 226 | } |
---|
| 227 | this._bgGroup = this._gfxGroup.createGroup(); |
---|
| 228 | this._ticksGroup = this._gfxGroup.createGroup(); |
---|
| 229 | this._fgGroup = this._gfxGroup.createGroup(); |
---|
| 230 | }, |
---|
| 231 | |
---|
| 232 | refreshRendering: function(){ |
---|
| 233 | if(!this._ticksGroup){ |
---|
| 234 | this._createSubGroups(); |
---|
| 235 | } |
---|
| 236 | } |
---|
| 237 | }); |
---|
| 238 | }); |
---|
| 239 | |
---|