239 lines
6.7 KiB
JavaScript
239 lines
6.7 KiB
JavaScript
define("dojox/dgauges/ScaleBase", ["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();
|
|
}
|
|
}
|
|
});
|
|
});
|