177 lines
4.6 KiB
JavaScript
177 lines
4.6 KiB
JavaScript
define("dojox/dgauges/RectangularScale", ["dojo/_base/declare", "dojox/gfx", "./ScaleBase"], function(declare, gfx, ScaleBase){
|
|
return declare("dojox.dgauges.RectangularScale", ScaleBase, {
|
|
// summary:
|
|
// The rectangular scale. A scaler must be set to use this class.
|
|
|
|
// paddingLeft: Number
|
|
// The left padding.
|
|
paddingLeft: 15,
|
|
// paddingTop: Number
|
|
// The top padding.
|
|
paddingTop: 12,
|
|
// paddingRight: Number
|
|
// The right padding.
|
|
paddingRight: 15,
|
|
// paddingBottom: Number
|
|
// The bottom padding.
|
|
paddingBottom: 0,
|
|
_contentBox: null,
|
|
constructor: function(){
|
|
this.labelPosition = "leading";
|
|
this.addInvalidatingProperties(["paddingTop", "paddingLeft", "paddingRight", "paddingBottom"]);
|
|
},
|
|
|
|
positionForValue: function(value){
|
|
// summary:
|
|
// Transforms a value into a position using the associated scaler.
|
|
// value:
|
|
// The value to transform.
|
|
// returns: Number
|
|
// A position in pixels.
|
|
var relativePos = 0;
|
|
var position;
|
|
var spos = 0;
|
|
var length = 0;
|
|
if(this._contentBox){
|
|
if(this._gauge.orientation == "horizontal"){
|
|
spos = this._contentBox.x;
|
|
length = this._contentBox.w;
|
|
}else{
|
|
spos = this._contentBox.y;
|
|
length = this._contentBox.h;
|
|
}
|
|
}
|
|
relativePos = this.scaler.positionForValue(value);
|
|
position = spos + (relativePos * length);
|
|
return position;
|
|
},
|
|
|
|
valueForPosition: function(pos){
|
|
// summary:
|
|
// Transforms a position in pixels into a value using the associated scaler.
|
|
// pos:
|
|
// The position to transform.
|
|
// returns: Number
|
|
// The value represented by pos.
|
|
var value = this.scaler.minimum;
|
|
var position = NaN;
|
|
var spos = 0;
|
|
var epos = 0;
|
|
|
|
if(this._gauge.orientation == "horizontal"){
|
|
position = pos.x;
|
|
spos = this._contentBox.x;
|
|
epos = this._contentBox.x + this._contentBox.w;
|
|
}else{
|
|
position = pos.y;
|
|
spos = this._contentBox.y;
|
|
epos = this._contentBox.y + this._contentBox.h;
|
|
}
|
|
|
|
if(position <= spos){
|
|
value = this.scaler.minimum;
|
|
}else if(position >= epos){
|
|
value = this.scaler.maximum;
|
|
}else {
|
|
value = this.scaler.valueForPosition((position - spos)/(epos - spos));
|
|
}
|
|
return value;
|
|
|
|
},
|
|
|
|
refreshRendering: function(){
|
|
this.inherited(arguments);
|
|
if(!this._gfxGroup || !this.scaler)
|
|
return;
|
|
|
|
this._ticksGroup.clear();
|
|
|
|
// variables for ticks rendering
|
|
var middleBox = this._gauge._layoutInfos.middle;
|
|
|
|
this._contentBox = {};
|
|
|
|
this._contentBox.x = middleBox.x + this.paddingLeft;
|
|
this._contentBox.y = middleBox.y + this.paddingTop;
|
|
this._contentBox.w = middleBox.w - (this.paddingLeft + this.paddingRight);
|
|
this._contentBox.h = middleBox.h - (this.paddingBottom + this.paddingTop);
|
|
var renderer;
|
|
|
|
// variables for tick labels
|
|
var labelText;
|
|
var font = this._getFont();
|
|
|
|
// Layout ticks
|
|
var allTicks = this.scaler.computeTicks();
|
|
|
|
for(var i = 0; i < allTicks.length; i++){
|
|
var tickItem = allTicks[i];
|
|
renderer = this.tickShapeFunc(this._ticksGroup, this, tickItem);
|
|
|
|
if(renderer){
|
|
var a = this.positionForValue(tickItem.value);
|
|
var tickSize = this._gauge._computeBoundingBox(renderer).width;
|
|
|
|
var x1 = 0, y1 = 0, angle = 0;
|
|
if(this._gauge.orientation == "horizontal"){
|
|
x1 = a;
|
|
y1 = this._contentBox.y;
|
|
angle = 90;
|
|
}else{
|
|
x1 = this._contentBox.x;
|
|
y1 = a;
|
|
}
|
|
|
|
renderer.setTransform([{
|
|
dx: x1,
|
|
dy: y1
|
|
}, gfx.matrix.rotateg(angle)]);
|
|
}
|
|
|
|
labelText = this.tickLabelFunc(tickItem);
|
|
|
|
if(labelText){
|
|
var tbox = gfx._base._getTextBox(labelText, {
|
|
font: gfx.makeFontString(gfx.makeParameters(gfx.defaultFont, font))
|
|
});
|
|
var tw = tbox.w;
|
|
var th = tbox.h;
|
|
var al = "start";
|
|
var xt = x1;
|
|
var yt = y1;
|
|
|
|
if(this._gauge.orientation == "horizontal"){
|
|
xt = x1;
|
|
if(this.labelPosition == "trailing"){
|
|
yt = y1 + tickSize + this.labelGap + th;
|
|
}else{
|
|
yt = y1 - this.labelGap;
|
|
}
|
|
al = "middle";
|
|
}else{
|
|
if(this.labelPosition == "trailing"){
|
|
xt = x1 + tickSize + this.labelGap;
|
|
}else{
|
|
xt = x1 - this.labelGap - tw;
|
|
}
|
|
yt = y1 + th / 2;
|
|
}
|
|
|
|
var t = this._ticksGroup.createText({
|
|
x: xt,
|
|
y: yt,
|
|
text: labelText,
|
|
align: al
|
|
});
|
|
t.setFill(font.color ? font.color : "black");
|
|
t.setFont(font);
|
|
}
|
|
}
|
|
|
|
for(var key in this._indicatorsIndex){
|
|
this._indicatorsRenderers[key] = this._indicatorsIndex[key].invalidateRendering();
|
|
}
|
|
}
|
|
})
|
|
});
|