162 lines
5.3 KiB
JavaScript
162 lines
5.3 KiB
JavaScript
define("dojox/dgauges/LinearScaler", ["dojo/_base/lang", "dojo/_base/declare", "dojo/Stateful"], function(lang, declare, Stateful){
|
|
return declare("dojox.dgauges.LinearScaler", Stateful, {
|
|
// summary:
|
|
// The linear scaler. This scaler creates major and minor ticks regularly between
|
|
// a minimum and a maximum.
|
|
// Scalers are responsible for tick generation and various data-transform operations.
|
|
|
|
// minimum: Number
|
|
// The minimum value of the scaler. Default is 0.
|
|
minimum: 0,
|
|
// maximum: Number
|
|
// The maximum value of the scaler. Default is 100.
|
|
maximum: 100,
|
|
// snapInterval:
|
|
// Specifies the increment value to be used as snap values on this scale
|
|
// during user interaction.
|
|
// Default is 1.
|
|
snapInterval: 1,
|
|
// majorTickInterval: Number
|
|
// The interval between two major ticks.
|
|
majorTickInterval: NaN,
|
|
// minorTickInterval: Number
|
|
// The interval between two minor ticks.
|
|
minorTickInterval: NaN,
|
|
// minorTicksEnabled: Boolean
|
|
// If false, minor ticks are not generated. Default is true.
|
|
minorTicksEnabled: true,
|
|
// majorTicks:
|
|
// The array of generated major ticks. You should not set this
|
|
// property when using the scaler.
|
|
majorTicks: null,
|
|
// minorTicks:
|
|
// The array of generated minor ticks. You should not set this
|
|
// property when using the scaler.
|
|
minorTicks: null,
|
|
|
|
_computedMajorTickInterval: NaN,
|
|
_computedMinorTickInterval: NaN,
|
|
|
|
constructor: function(){
|
|
this.watchedProperties = ["minimum", "maximum", "majorTickInterval", "minorTickInterval", "snapInterval", "minorTicksEnabled"];
|
|
},
|
|
|
|
_buildMinorTickItems: function(){
|
|
// summary:
|
|
// Internal method.
|
|
// tags:
|
|
// private
|
|
var mt = this.majorTicks;
|
|
var minorTickCache = [];
|
|
if(this.maximum > this.minimum){
|
|
var majorTickCount = Math.floor((this.maximum - this.minimum) / this.getComputedMajorTickInterval()) + 1;
|
|
var minorTickCount = Math.floor(this.getComputedMajorTickInterval() / this.getComputedMinorTickInterval());
|
|
var data;
|
|
for(var i = 0; i < majorTickCount - 1; i++){
|
|
for(var j = 1; j < minorTickCount; j++){
|
|
data = {scaler: this};
|
|
data.isMinor = true;
|
|
data.value = mt[i].value + j * this.getComputedMinorTickInterval();
|
|
data.position = (Number(data.value) - this.minimum) / (this.maximum - this.minimum);
|
|
minorTickCache.push(data);
|
|
}
|
|
}
|
|
}
|
|
return minorTickCache;
|
|
},
|
|
|
|
_buildMajorTickItems: function(){
|
|
// summary:
|
|
// Internal method.
|
|
// tags:
|
|
// private
|
|
var majorTickCache = [];
|
|
if(this.maximum > this.minimum){
|
|
var majorTickCount = Math.floor((this.maximum - this.minimum) / this.getComputedMajorTickInterval()) + 1;
|
|
var data;
|
|
for(var i = 0; i < majorTickCount; i++){
|
|
data = {scaler: this};
|
|
data.isMinor = false;
|
|
data.value = this.minimum + i * this.getComputedMajorTickInterval();
|
|
data.position = (Number(data.value) - this.minimum) / (this.maximum - this.minimum);
|
|
majorTickCache.push(data);
|
|
}
|
|
}
|
|
return majorTickCache;
|
|
},
|
|
|
|
getComputedMajorTickInterval: function(){
|
|
// summary:
|
|
// The computed or user defined major tick interval.
|
|
// returns: Number
|
|
// The major tick interval used for ticks generation.
|
|
if(!isNaN(this.majorTickInterval)){
|
|
return this.majorTickInterval;
|
|
}
|
|
if(isNaN(this._computedMajorTickInterval)){
|
|
this._computedMajorTickInterval = (this.maximum - this.minimum) / 10;
|
|
}
|
|
return this._computedMajorTickInterval;
|
|
},
|
|
|
|
getComputedMinorTickInterval: function(){
|
|
// summary:
|
|
// The computed or user defined minor tick interval.
|
|
// returns: Number
|
|
// The minor tick interval used for ticks generation.
|
|
if(!isNaN(this.minorTickInterval)){
|
|
return this.minorTickInterval;
|
|
}
|
|
if(isNaN(this._computedMinorTickInterval)){
|
|
this._computedMinorTickInterval = this.getComputedMajorTickInterval() / 5;
|
|
}
|
|
return this._computedMinorTickInterval;
|
|
},
|
|
|
|
computeTicks: function(){
|
|
// summary:
|
|
// Creates or re-creates the ticks for this scaler.
|
|
// returns: Array
|
|
// An array containing all ticks (major then minor ticks).
|
|
this.majorTicks = this._buildMajorTickItems();
|
|
this.minorTicks = this.minorTicksEnabled ? this._buildMinorTickItems() : [];
|
|
return this.majorTicks.concat(this.minorTicks);
|
|
},
|
|
|
|
positionForValue: function(value){
|
|
// summary:
|
|
// Transforms a value into a relative position between 0 and 1.
|
|
// value: Number
|
|
// A value to transform.
|
|
// returns: Number
|
|
// The position between 0 and 1.
|
|
var position;
|
|
if(value == null || isNaN(value) || value <= this.minimum){
|
|
position = 0;
|
|
}
|
|
if(value >= this.maximum){
|
|
position = 1;
|
|
}
|
|
if(isNaN(position)){
|
|
position = (value - this.minimum) / (this.maximum - this.minimum);
|
|
}
|
|
return position;
|
|
},
|
|
|
|
valueForPosition: function(position){
|
|
// summary:
|
|
// Transforms a relative position (between 0 and 1) into a value.
|
|
// position: Number
|
|
// A relative position to transform.
|
|
// returns: Number
|
|
// The transformed value between minimum and maximum.
|
|
var range = Math.abs(this.minimum - this.maximum);
|
|
var value = this.minimum + range * position;
|
|
if(!isNaN(this.snapInterval) && this.snapInterval > 0){
|
|
value = Math.round((value - this.minimum) / this.snapInterval) * this.snapInterval + this.minimum;
|
|
}
|
|
return value;
|
|
}
|
|
});
|
|
});
|