diff options
Diffstat (limited to 'js/dojo/dojox/gauges/GlossyHorizontalGauge.js')
| -rw-r--r-- | js/dojo/dojox/gauges/GlossyHorizontalGauge.js | 568 |
1 files changed, 568 insertions, 0 deletions
diff --git a/js/dojo/dojox/gauges/GlossyHorizontalGauge.js b/js/dojo/dojox/gauges/GlossyHorizontalGauge.js new file mode 100644 index 0000000..5a7bba6 --- /dev/null +++ b/js/dojo/dojox/gauges/GlossyHorizontalGauge.js @@ -0,0 +1,568 @@ +//>>built +define("dojox/gauges/GlossyHorizontalGauge", ["dojo/_base/declare","dojo/_base/connect","dojo/_base/lang","dojo/_base/Color","dojox/gfx","./BarGauge","./BarCircleIndicator","./GlossyHorizontalGaugeMarker"], + function(declare, connect, lang, Color, gfx, BarGauge, BarCircleIndicator, GlossyHorizontalGaugeMarker) { + + +var NumberUtils + +/*===== + BarGauge = dojox.gauges.BarGauge; +=====*/ + +return declare("dojox.gauges.GlossyHorizontalGauge", [BarGauge], { + // summary: + // Represents an horizontal bar gauge with a glossy appearance. + // + // example: + // | <div dojoType="dojox.gauges.GlossyHorizontalGauge" + // | id="testGauge" + // | width="500" + // | height="100" + // | min="0" + // | max="100" + // | value="0" + // | majorTicksInterval="10" + // | majorTicksColor="#c4c4c4" + // | minorTicksInterval="5" + // | minorTicksColor="#c4c4c4" + // | color="black" + // | markerColor="#c4c4c4" + // | font="normal normal normal 10pt sans-serif" + // | noChange="true" + // | title="title" + // | scalePrecision="0" + // | > + // | </div> + + + // the type of default indicator to create + _defaultIndicator: BarCircleIndicator, + + // color: String + // The main color of the gauge. + color: 'black', + + // needleColor: Color + // The main color of the needle. + markerColor: 'black', + + // majorTicksInterval: Number + // Interval between major ticks + majorTicksInterval: 10, + + // _majorTicksLength: Number + // Major tick size, at design + _majorTicksLength: 10, + + // majorTicksColor: Color + // Color of major tick marks + majorTicksColor: '#c4c4c4', + + // minorTicksInterval: Number + // Interval between minor ticks + minorTicksInterval: 5, + + // _minorTicksLength: Number + // Minor tick size, at design + _minorTicksLength: 6, + + // minorTicksColor: Color + // Color of minor tick marks + minorTicksColor: '#c4c4c4', + + // value: Number + // The value of the gauge. + value: 0, + + // noChange: Boolean + // Indicates if the gauge reacts to touch events + noChange: false, + + // title: String + // The title displayed in the needle's tooltip + title: "", + + // font: Object + // The font of the gauge + font: "normal normal normal 10pt serif", + + // scalePrecision: Number + // The precision for the formatting of numbers in the scale (default is 0) + scalePrecision: 0, + + _font: null, + + _margin: 2, + _minBorderWidth: 2, + _maxBorderWidth: 6, + _tickLabelOffset: 5, + _designHeight: 100, + + constructor: function(){ + this.min = 0; + this.max = 100; + }, + + startup: function(){ + this.inherited(arguments); + + if (this._gaugeStarted) return; + + this._gaugeStarted = true; + + var scale = this.height / this._designHeight; + + this._minorTicksLength = this._minorTicksLength * scale; + this._majorTicksLength = this._majorTicksLength * scale; + + var font = this._font; + this._computeDataRectangle(); + + // computing scale height + + var th = gfx.normalizedLength(font.size); + var scaleHeight = th + this._tickLabelOffset + Math.max(this._majorTicksLength, this._minorTicksLength); + // indicator in the middle of the gauge + var yOffset = Math.max(0, (this.height - scaleHeight) / 2); + + this.addRange({ + low: this.min ? this.min : 0, + high: this.max ? this.max : 100, + color: [0, 0, 0, 0] + }); + + this.setMajorTicks({ + fixedPrecision: true, + precision: this.scalePrecision, + font: font, + labelPlacement: 'inside', + offset: yOffset - this._majorTicksLength / 2, + interval: this.majorTicksInterval, + length: this._majorTicksLength, + color: this.majorTicksColor + + }); + + this.setMinorTicks({ + labelPlacement: 'inside', + offset: yOffset - this._minorTicksLength / 2, + interval: this.minorTicksInterval, + length: this._minorTicksLength, + color: this.minorTicksColor + + }); + this._needle = new GlossyHorizontalGaugeMarker({ + hideValue: true, + title: this.title, + noChange: this.noChange, + offset: yOffset, + color: this.markerColor, + value: this.value + }); + this.addIndicator(this._needle); + + connect.connect(this._needle, "valueChanged", lang.hitch(this, function(){ + this.value = this._needle.value; + this.onValueChanged(); + })); + }, + + _layoutGauge: function(){ + // summary: + // Layout the gauge elements depending on the various parameters (size, font, tick length..) + + if (!this._gaugeStarted) + return; + + var font = this._font; + this._computeDataRectangle(); + var th = gfx.normalizedLength(font.size); + var scaleHeight = th + this._tickLabelOffset + Math.max(this._majorTicksLength, this._minorTicksLength); + // indicator in the middle of the gauge + var yOffset = Math.max(0, (this.height - scaleHeight) / 2); + + + this._setMajorTicksProperty({ + fixedPrecision: true, + precision: this.scalePrecision, + font: font, + offset: yOffset - this._majorTicksLength / 2, + interval: this.majorTicksInterval, + length: this._majorTicksLength + }); + + this._setMinorTicksProperty({ + offset: yOffset - this._minorTicksLength / 2, + interval: this.minorTicksInterval, + length: this._minorTicksLength + }); + + this.removeIndicator(this._needle); + this._needle.offset = yOffset; + this.addIndicator(this._needle); + }, + + _formatNumber: function(val){ + var NumberUtils = this._getNumberModule(); + if(NumberUtils){ // use internationalization if loaded + return NumberUtils.format(val, { + places: this.scalePrecision + }); + }else{ + return val.toFixed(this.scalePrecision); + } + }, + + _computeDataRectangle: function(){ + // summary: + // Computes the rectangle that defines the data area of the gauge. + + + if (!this._gaugeStarted) + return; + + var font = this._font; + var leftTextMargin = this._getTextWidth(this._formatNumber(this.min), font) / 2; + var rightTextMargin = this._getTextWidth(this._formatNumber(this.max), font) / 2; + var textMargin = Math.max(leftTextMargin, rightTextMargin); + + var margin = this._getBorderWidth() + Math.max(this._majorTicksLength, this._majorTicksLength) / 2 + textMargin; + this.dataHeight = this.height; + this.dataY = 0; + this.dataX = margin + this._margin; + this.dataWidth = Math.max(0, this.width - 2 * this.dataX); + }, + + _getTextWidth: function(s, font){ + return gfx._base._getTextBox(s, { + font: gfx.makeFontString(gfx.makeParameters(gfx.defaultFont, font)) + }).w || + 0; + }, + + _getBorderWidth: function(){ + // summary: + // Computes the width of the border surrounding the gauge + return Math.max(this._minBorderWidth, Math.min(this._maxBorderWidth, this._maxBorderWidth * this.height / this._designHeight)); + }, + + drawBackground: function(group){ + // summary: + // Draws the background of the gauge + // group: dojox.gfx.Group + // The GFX group where the background must be drawn + if (this._gaugeBackground){ + return; + } + + var lighterColor = Color.blendColors(new Color(this.color), new Color('white'), 0.4); + this._gaugeBackground = group.createGroup(); + + var borderWidth = this._getBorderWidth(); + var margin = this._margin; + var w = this.width; + var h = this.height; + var radius = Math.min(h / 4, 23); + this._gaugeBackground.createRect({ + x: margin, + y: margin, + width: Math.max(0, w - 2 * margin), + height: Math.max(0, h - 2 * margin), + r: radius + }).setFill(this.color); + + var left = margin + borderWidth; + var right = w - borderWidth - margin; + var top = margin + borderWidth; + var w2 = w - 2 * borderWidth - 2 * margin; + var h2 = h - 2 * borderWidth - 2 * margin; + if (w2 <= 0 || h2 <= 0) + return; + radius = Math.min(radius, w2 / 2); + radius = Math.min(radius, h2 / 2); + this._gaugeBackground.createRect({ + x: left, + y: top, + width: w2, + height: h2, + r: radius + }).setFill({ + type: "linear", + x1: left, + y1: 0, + x2: left, + y2: h - borderWidth - margin, + colors: [{ + offset: 0, + color: lighterColor + }, { + offset: .2, + color: this.color + }, { + offset: .8, + color: this.color + }, { + offset: 1, + color: lighterColor + }] + }); + + var f = 4 * (Math.sqrt(2) - 1) / 3 * radius; + this._gaugeBackground.createPath({ + path: 'M' + left + ' ' + (top + radius) + + 'C' + + left + + ' ' + + (top + radius - f) + + ' ' + + (left + radius - f) + + ' ' + + top + + ' ' + + (left + radius) + + ' ' + + top + + 'L' + + (right - radius) + + ' ' + + top + + 'C' + + (right - radius + f) + + ' ' + + top + + ' ' + + right + + ' ' + + (top + radius - f) + + ' ' + + right + + ' ' + + (top + radius) + + 'L' + + right + + ' ' + + (top + h / 2) + + 'L' + + left + + ' ' + + (top + h / 3) + + 'Z' + }).setFill({ + type: "linear", + x1: left, + y1: top, + x2: left, + y2: top + this.height / 2, + colors: [{ + offset: 0, + color: lighterColor + }, { + offset: 1, + color: Color.blendColors(new Color(this.color), new Color('white'), 0.2) + }] + }); + }, + + onValueChanged: function(){ + // summary: + // Callback when the value of the gauge has changed. + + }, + + //******************************************************************************************* + //* Property getters and setters + //******************************************************************************************* + + _setColorAttr: function(color){ + // summary: + // Sets the main color of the gauge + // color: String + // The color + this.color = color ? color : 'black'; + if (this._gaugeBackground && this._gaugeBackground.parent) + this._gaugeBackground.parent.remove(this._gaugeBackground); + + this._gaugeBackground = null; + this.draw(); + }, + + _setMarkerColorAttr: function(color){ + // summary: + // Sets the main color of the marker + // color: String + // The color + this.markerColor = color; + if (this._needle){ + this.removeIndicator(this._needle); + this._needle.color = color; + this._needle.shape = null; + this.addIndicator(this._needle); + } + }, + + _setMajorTicksIntervalAttr: function(interval){ + // summary: + // Sets the interval between major ticks + this.majorTicksInterval = interval; + this._setMajorTicksProperty({ + 'interval': this.majorTicksInterval + }); + }, + + setMajorTicksLength: function(length){ + // summary: + // Sets the size of the major ticks. + this._majorTicksLength = length; + this._layoutGauge(); + return this; + + }, + + getMajorTicksLength: function(){ + // summary: + // Returns the size of the major ticks. + return this._majorTicksLength; + }, + + _setMajorTicksColorAttr: function(color){ + // summary: + // Sets the color of the major ticks. + this.majorTicksColor = color; + this._setMajorTicksProperty({ + 'color': this.majorTicksColor + }); + }, + + _setMajorTicksProperty: function(prop){ + if (this.majorTicks == null){ + return; + } + lang.mixin(this.majorTicks, prop); + this.setMajorTicks(this.majorTicks); + }, + + _setMinorTicksIntervalAttr: function(interval){ + // summary: + // Sets the interval between minor ticks + this.minorTicksInterval = interval; + this._setMinorTicksProperty({ + 'interval': this.minorTicksInterval + }); + }, + + setMinorTicksLength: function(length){ + // summary: + // Sets the size of the minor ticks. + this._minorTicksLength = length; + this._layoutGauge(); + return this; + }, + + getMinorTicksLength: function(){ + // summary: + // Gets the size of the minor ticks. + return this._minorTicksLength; + }, + + _setMinorTicksColorAttr: function(color){ + // summary: + // Sets the color of the minor ticks. + this.minorTicksColor = color; + this._setMinorTicksProperty({ + 'color': this.minorTicksColor + }); + }, + + _setMinorTicksProperty: function(prop){ + if (this.minorTicks == null){ + return; + } + lang.mixin(this.minorTicks, prop); + this.setMinorTicks(this.minorTicks); + }, + + _setMinAttr: function(min){ + this.min = min; + this._computeDataRectangle(); + if (this.majorTicks != null) + this.setMajorTicks(this.majorTicks); + if (this.minorTicks != null) + this.setMinorTicks(this.minorTicks); + this.draw(); + }, + + _setMaxAttr: function(max){ + this.max = max; + this._computeDataRectangle(); + if (this.majorTicks != null) + this.setMajorTicks(this.majorTicks); + if (this.minorTicks != null) + this.setMinorTicks(this.minorTicks); + this.draw(); + }, + + _setValueAttr: function(value){ + // summary: + // Changes the value of the gauge + // value: Number + // The new value for the gauge. + + value = Math.min(this.max, value); + value = Math.max(this.min, value); + this.value = value; + if (this._needle){ + // update will not work if noChange is true. + var noChange = this._needle.noChange; + this._needle.noChange = false; + this._needle.update(value); + this._needle.noChange = noChange; + } + }, + + _setScalePrecisionAttr: function(value){ + // summary: + // Changes precision of the numbers in the scale of the gauge + // value: Number + // The new value + this.scalePrecision = value; + this._layoutGauge(); + }, + + _setNoChangeAttr: function(value){ + // summary: + // Indicates if the value of the gauge can be changed or not + // value: boolean + // true indicates that the gauge's value cannot be changed + this.noChange = value; + if (this._needle) + this._needle.noChange = this.noChange; + }, + + _setTitleAttr: function(value){ + // summary: + // Sets the title displayed by the needle's tooltip . + // value: String + // the title + + this.title = value; + if (this._needle){ + this._needle.title = this.title; + } + }, + + _setFontAttr: function(font){ + // summary: + // Sets the font of the gauge + // summary: + // Sets the font of the gauge + // font: String + // An string representing the font such as 'normal normal normal 10pt Helvetica,Arial,sans-serif' + // + + this.font = font; + this._font = gfx.splitFontString(font); + this._layoutGauge(); + } +}); +}); + |
