You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
6.7 KiB
239 lines
6.7 KiB
define(["dojo/_base/lang", "dojo/_base/declare", "dojox/gfx", "dojo/_base/array", "dojox/widget/_Invalidating", "dojo/_base/sniff"], |
|
function(lang, declare, gfx, array, _Invalidating, has){ |
|
return declare("dojox.dgauges.ScaleBase", _Invalidating, { |
|
// summary: |
|
// The ScaleBase class is the base class for the circular and rectangular scales. |
|
// A scaler must be set to use this class. A scaler is responsible for |
|
// tick generation and various data-transform operations. |
|
|
|
// scaler: Object |
|
// The scaler used for tick generation and data-transform operations. |
|
// This property is mandatory for using the scale. |
|
scaler: null, |
|
// font: Object |
|
// The font used for the ticks labels. |
|
// This is null by default which means this scale use the font defined |
|
// on the gauge. |
|
font: null, |
|
// labelPosition: String |
|
// See CircularScale and RectangularScale for valid values. |
|
labelPosition: null, |
|
// labelGap: Number |
|
// The label gap between the ticks and their labels. Default value is 1. |
|
labelGap: 1, |
|
// tickStroke: Object |
|
// The GFX stroke used by the default tickShapeFunc implementation. |
|
tickStroke: null, |
|
_gauge: null, |
|
_gfxGroup: null, |
|
_bgGroup: null, |
|
_fgGroup: null, |
|
_indicators: null, |
|
_indicatorsIndex: null, |
|
_indicatorsRenderers: null, |
|
|
|
constructor: function(){ |
|
this._indicators = []; |
|
this._indicatorsIndex = {}; |
|
this._indicatorsRenderers = {}; |
|
this._gauge = null; |
|
this._gfxGroup = null; |
|
// Fix for #1, IE<9 don't render correctly stroke with width<1 |
|
this.tickStroke = {color: "black", width: has("ie") <= 8 ? 1 : 0.5}; |
|
|
|
this.addInvalidatingProperties(["scaler", "font", "labelGap", "labelPosition", "tickShapeFunc", "tickLabelFunc", "tickStroke"]); |
|
|
|
this.watch("scaler", lang.hitch(this, this._watchScaler)); |
|
}, |
|
|
|
postscript: function(mixin){ |
|
// summary: |
|
// Internal method. |
|
// tags: |
|
// private |
|
this.inherited(arguments); |
|
if(mixin && mixin.scaler){ |
|
this._watchScaler("scaler", null, mixin.scaler); |
|
} |
|
}, |
|
|
|
_watchers: null, |
|
|
|
_watchScaler: function(name, oldValue, newValue){ |
|
// summary: |
|
// Internal method. |
|
// tags: |
|
// private |
|
array.forEach(this._watchers, lang.hitch(this, function(entry){ |
|
entry.unwatch(); |
|
})); |
|
|
|
// Get the properties declared by the watched object |
|
var props = newValue.watchedProperties; |
|
this._watchers = []; |
|
array.forEach(props, lang.hitch(this, function(entry){ |
|
this._watchers.push(newValue.watch(entry, lang.hitch(this, this.invalidateRendering))); |
|
})); |
|
}, |
|
|
|
_getFont: function(){ |
|
// summary: |
|
// Internal method. |
|
// tags: |
|
// private |
|
var font = this.font; |
|
if(!font){ |
|
font = this._gauge.font; |
|
} |
|
if(!font){ |
|
font = gfx.defaultFont; |
|
} |
|
return font; |
|
}, |
|
|
|
positionForValue: function(value){ |
|
// summary: |
|
// See CircularScale and Rectangular for more informations. |
|
// value: Number |
|
// The value to convert. |
|
// returns: Number |
|
// The position corresponding to the value. |
|
return 0; |
|
}, |
|
|
|
valueForPosition: function(position){ |
|
// summary: |
|
// See CircularScale and Rectangular for more informations. |
|
// position: Number |
|
// The position to convert. |
|
// returns: Number |
|
// The value corresponding to the position. |
|
}, |
|
|
|
tickLabelFunc: function(tickItem){ |
|
// summary: |
|
// Customize the text of ticks labels. |
|
// tickItem: Object |
|
// An object containing the tick informations. |
|
// returns: String |
|
// The text to be aligned with the tick. If null, the tick has no label. |
|
if(tickItem.isMinor){ |
|
return null; |
|
}else{ |
|
return String(tickItem.value); |
|
} |
|
}, |
|
|
|
tickShapeFunc: function(group, scale, tickItem){ |
|
// summary: |
|
// Customize the shape of ticks. |
|
// group: dojox/gfx/Group |
|
// The GFX group used for drawing the tick. |
|
// scale: dojox/dgauges/ScaleBase |
|
// The scale being processed. |
|
// tickItem: Object |
|
// An object containing the tick informations. |
|
return group.createLine({ |
|
x1: 0, |
|
y1: 0, |
|
x2: tickItem.isMinor ? 6 : 10, |
|
y2: 0 |
|
}).setStroke(this.tickStroke); |
|
}, |
|
|
|
getIndicatorRenderer: function(name){ |
|
// summary: |
|
// Gets the GFX shape of an indicator. |
|
// name: String |
|
// The name of the indicator as defined using addIndicator. |
|
// returns: dojox/gfx/canvas/Shape |
|
// The GFX shape of the indicator. |
|
return this._indicatorsRenderers[name]; |
|
}, |
|
|
|
removeIndicator: function(name){ |
|
// summary: |
|
// Removes an indicator. |
|
// name: String |
|
// The name of the indicator as defined using addIndicator. |
|
// returns: IndicatorBase |
|
// The removed indicator. |
|
var indicator = this._indicatorsIndex[name]; |
|
if(indicator){ |
|
indicator._gfxGroup.removeShape(); |
|
var idx = this._indicators.indexOf(indicator); |
|
this._indicators.splice(idx, 1); |
|
|
|
indicator._disconnectListeners(); |
|
|
|
delete this._indicatorsIndex[name]; |
|
delete this._indicatorsRenderers[name]; |
|
} |
|
if(this._gauge){ |
|
this._gauge._resetMainIndicator(); |
|
} |
|
this.invalidateRendering(); |
|
return indicator; |
|
}, |
|
|
|
getIndicator: function(name){ |
|
// summary: |
|
// Get an indicator instance. |
|
// name: String |
|
// The name of the indicator as defined using addIndicator. |
|
// returns: IndicatorBase |
|
// The indicator associated with the name parameter. |
|
return this._indicatorsIndex[name]; |
|
}, |
|
|
|
addIndicator: function(name, indicator, behindScale){ |
|
// summary: |
|
// Add an indicator to the scale. Before calling this function, ensure |
|
// this scale has already been added to a gauge using the addElement method |
|
// of the gauge. |
|
// name: String |
|
// The name of the indicator to be added. |
|
// indicator: dojox/dgauges/IndicatorBase |
|
// The indicator to add to this scale. |
|
// behindScale: Boolean |
|
// If true, this indicator is drawn behind the scale. Default value is false. |
|
if(this._indicatorsIndex[name] && this._indicatorsIndex[name] != indicator){ |
|
this.removeIndicator(name); |
|
} |
|
|
|
this._indicators.push(indicator); |
|
this._indicatorsIndex[name] = indicator; |
|
|
|
if(!this._ticksGroup){ |
|
this._createSubGroups(); |
|
} |
|
|
|
var group = behindScale ? this._bgGroup : this._fgGroup; |
|
indicator._gfxGroup = group.createGroup(); |
|
|
|
indicator.scale = this; |
|
|
|
return this.invalidateRendering(); |
|
}, |
|
|
|
_createSubGroups: function(){ |
|
// summary: |
|
// Internal method. |
|
// tags: |
|
// private |
|
if(!this._gfxGroup || this._ticksGroup){ |
|
return; |
|
} |
|
this._bgGroup = this._gfxGroup.createGroup(); |
|
this._ticksGroup = this._gfxGroup.createGroup(); |
|
this._fgGroup = this._gfxGroup.createGroup(); |
|
}, |
|
|
|
refreshRendering: function(){ |
|
if(!this._ticksGroup){ |
|
this._createSubGroups(); |
|
} |
|
} |
|
}); |
|
}); |
|
|
|
|