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;
 | 
						|
		}
 | 
						|
	});
 | 
						|
});
 |