//>>built define("dojox/gauges/_Gauge", ["dojo/_base/declare","dojo/_base/lang","dojo/_base/html","dojo/_base/array","dojo/_base/event", "dojo/_base/connect","dojo/dom-construct", "dijit/_Widget", "dojox/gfx", "./Range", "dojo/fx/easing"], function(declare, lang, html, arr, event, connect, dom, Widget, gfx, Range) { var _tooltipModule = 0; var _numberModule = 0; /*===== Widget = dijit._Widget; =====*/ return declare("dojox.gauges._Gauge",[Widget],{ // summary: // The abstract base class for gauges. // // description: // using dojo.gfx (and thus either SVG or VML based on what is supported), this widget // builds a gauge component, used to display numerical data in a familiar format. // This widget is not to be used alone. it is meant to be subclassed, such as // dojox.gauges.BarGauge or dojox.gauges.AnalogGauge // width: Number // The width of the gauge (default is 300) width: 0, // height: Number // The height of the gauge (default is 200) height: 0, // background: Object // The color of the background. This must be an object of one of two forms: // {'color': 'color-name'} // OR // (for a gradient:) // {'type': 'linear', 'x1': 0, 'x2': 0, 'y1': 0, 'y2': 200, 'colors': [{offset: 0, color:'#C0C0C0'}, {offset: 1, color: '#E0E0E0'}] } background: null, // image: String // Background image for gauge (default is no image) image: null, // useRangeStyles: Number // Indicates whether to use given css classes (dojoxGaugeRangeXX) // to determine the color (and other style attributes?) of the ranges // this value should be the number of dojoxGaugeRange classes that are // defined, starting at dojoxGaugeRange1 (0 indicates falling to default // hardcoded colors) useRangeStyles: 0, // useTooltip: Boolean // Indicates whether tooltips should be displayed for ranges, indicators, etc. useTooltip: true, // majorTicks: Object // An object representing the tick marks that should be added to the gauge. Major tick marks have a text label // indicating the value. The object can have the following attributes (required are marked with a *): // - offset: the distance from the 'center' of the gauge. Used differently for Analog vs. Bar // - width: The width of the mark // - length: The length of the mark // - interval: The interval the ticks should be added on // - color: The color of the mark and text // - font: an object with any/all of the following parameters: // {family: "Helvetica", style: "italic", variant: 'small-caps', weight: 'bold', size: "18pt"} majorTicks: null, // minorTicks: Object // An object of the same format as majorTicks, indicating where the minor (label-less) marks should be placed // The font parameter is ignored if provided since minor tick marks have no text label. minorTicks: null, // _defaultIndicator: Object // Should be overridden by any extending classes and used to indicate what the 'default' indicator is. // This object is used as the indicator when creating tick marks or when an anonymous object is passed into // addIndicator. _defaultIndicator: null, // defaultColors: Array // Set of default colors to color ranges with. defaultColors: [[0x00,0x54,0xAA,1], [0x44,0x77,0xBB,1], [0x66,0x99,0xCC,1], [0x99,0xBB,0xEE,1], [0x99,0xCC,0xFF,1], [0xCC,0xEE,0xFF,1], [0xDD,0xEE,0xFF,1]], // min: Number // The minimum value of the gauge. Normally not set explicitly, as it will be determined by // the ranges that are added. min: null, // max: Number // The maximum value of the gauge. Normally not set explicitly, as it will be determined by // the ranges that are added. max: null, // surface: Object // The GFX surface that the shapes are drawn on. Can be accessed/used by indicators to draw themselves surface: null, // hideValues: Boolean // Indicates whether the text boxes showing the value of the indicator (as text // content) should be hidden or shown. Default is not hidden, aka shown. hideValues: false, // internal data gaugeContent: undefined, _backgroundDefault: {color: '#E0E0E0'}, _rangeData: null, _indicatorData: null, _drag: null, _img: null, _overOverlay: false, _lastHover: '', startup: function(){ // handle settings from HTML by making sure all the options are // converted correctly to numbers and that we calculate defaults // for cx, cy and radius if(this.image === null){ this.image={}; } this.connect(this.gaugeContent, 'onmousedown', this.handleMouseDown); this.connect(this.gaugeContent, 'onmousemove', this.handleMouseMove); this.connect(this.gaugeContent, 'onmouseover', this.handleMouseOver); this.connect(this.gaugeContent, 'onmouseout', this.handleMouseOut); this.connect(this.gaugeContent, 'touchstart', this.handleTouchStart); this.connect(this.gaugeContent, 'touchend', this.handleTouchEnd); this.connect(this.gaugeContent, 'touchmove', this.handleTouchMove); if(!lang.isArray(this.ranges)){ this.ranges = []; } if(!lang.isArray(this.indicators)){ this.indicators = []; } var ranges = [], indicators = []; var i; if(this.hasChildren()){ var children = this.getChildren(); for(i=0; i 0; // Boolean }, buildRendering: function(){ // summary: // Overrides _Widget.buildRendering var n = this.domNode = this.srcNodeRef ? this.srcNodeRef: dom.create("div"); this.gaugeContent = dom.create("div", { className: "dojoxGaugeContent" }); this.containerNode = dom.create("div"); this.mouseNode = dom.create("div"); while(n.hasChildNodes()){ this.containerNode.appendChild(n.firstChild); } dom.place(this.gaugeContent, n); dom.place(this.containerNode, n); dom.place(this.mouseNode, n); }, _setTicks: function(/*Object*/ oldTicks, /*Object*/ newTicks, /*Boolean*/ major){ // summary: // internal method used to clear existing tick marks, then add new ones var i; if (oldTicks && lang.isArray(oldTicks._ticks)){ for (i = 0; i < oldTicks._ticks.length; i++){ this._removeScaleTick(oldTicks._ticks[i]); } } var t = { length: newTicks.length, offset: newTicks.offset, noChange: true }; if (newTicks.color){ t.color = newTicks.color; } if (newTicks.font){ t.font = newTicks.font; } if (newTicks.labelPlacement){ t.direction = newTicks.labelPlacement; } newTicks._ticks = []; for (i=this.min;i<=this.max;i+=newTicks.interval){ if (i==this.max&&this._isScaleCircular()) continue; // do not draw last tick on fully circular gauges t.value=i; if (major){ var NumberUtils = this._getNumberModule(); if (NumberUtils){ // use internationalization if loaded t.label = (newTicks.fixedPrecision && newTicks.precision) ? NumberUtils.format(i, { places: newTicks.precision }): NumberUtils.format(i); }else{ t.label = (newTicks.fixedPrecision && newTicks.precision) ? i.toFixed(newTicks.precision): i.toString(); } } newTicks._ticks.push(this._addScaleTick(t, major)); } return newTicks; }, _isScaleCircular: function(){ // summary: // Internal method to check if the scale is fully circular return false; }, setMinorTicks: function(/*Object*/ ticks){ // summary: // Creates and draws the minor tick marks based on the passed object (expecting the same format // as the minorTicks object documented above) this.minorTicks = this._setTicks(this.minorTicks, ticks, false); }, setMajorTicks: function(/*Object*/ ticks){ // summary: // Creates and draws the major tick marks based on the passed object (expecting the same format // as the majorTicks object documented above) this.majorTicks = this._setTicks(this.majorTicks, ticks, true); }, postCreate: function(){ if(this.hideValues){ html.style(this.containerNode, "display", "none"); } html.style(this.mouseNode, 'width', '0'); html.style(this.mouseNode, 'height', '0'); html.style(this.mouseNode, 'position', 'absolute'); html.style(this.mouseNode, 'z-index', '100'); if(this.useTooltip){ require(["dijit/Tooltip"], dojo.hitch(this, function(Tooltip){ Tooltip.show('test', this.mouseNode, !this.isLeftToRight()); Tooltip.hide(this.mouseNode); })); } }, _getNumberModule :function() { // summary: // Tests is AMD dojo/number is loaded if (_numberModule == 0) { try { _numberModule = require("dojo/number"); } catch (e) { _numberModule = null; } } return _numberModule; }, createSurface: function(){ // summary: // Internal method used by the gauge to create the graphics surface area this.gaugeContent.style.width = this.width + 'px'; this.gaugeContent.style.height = this.height + 'px'; this.surface = gfx.createSurface(this.gaugeContent, this.width, this.height); // create several groups where various gauge elements will be created. this._backgroundGroup = this.surface.createGroup(); this._rangeGroup = this.surface.createGroup(); this._minorTicksGroup = this.surface.createGroup(); this._majorTicksGroup = this.surface.createGroup(); this._overlayGroup = this.surface.createGroup(); this._indicatorsGroup = this.surface.createGroup(); this._foregroundGroup = this.surface.createGroup(); this._background = this._backgroundGroup.createRect({x: 0, y: 0, width: this.width, height: this.height }); this._background.setFill(this.background); if(this.image.url){ var imageGroup = this._backgroundGroup; if (this.image.overlay) imageGroup = this._overlayGroup; this._img = imageGroup.createImage({width: this.image.width || this.width, height: this.image.height || this.height, src: this.image.url}); if(this.image.x || this.image.y){ this._img.setTransform({dx: this.image.x || 0, dy: this.image.y || 0}); } } }, draw: function(){ // summary: // This function is used to draw (or redraw) the gauge. // description: // Draws the gauge by drawing the surface, the ranges, and the indicators. var i; if (!this.surface)return; this.drawBackground(this._backgroundGroup); if(this._rangeData){ for(i=0; i this.max)){this.max = range.high;} if(!range.color){ var colorIndex = this._rangeData.length % this.defaultColors.length; if(gfx.svg && this.useRangeStyles > 0){ colorIndex = (this._rangeData.length % this.useRangeStyles)+1; range.color = {style: "dojoxGaugeRange"+colorIndex}; }else{ colorIndex = this._rangeData.length % this.defaultColors.length; range.color = this.defaultColors[colorIndex]; } } this._rangeData[this._rangeData.length] = range; } this.draw(); }, _addScaleTick: function(/*Object*/indicator, /*Boolean*/ major){ // summary: // Adds a scale ticks, that is an indicator. // description: // This method adds a tick mark to the gauge // indicator: dojox.gauges._Indicator // A dojox.gauges._Indicator or an object with similar parameters // (value, color, offset, etc.). if(!indicator.declaredClass){// !== 'dojox.gauges.Indicator'){ // We were passed a plain object, need to make an indicator out of it. indicator = new this._defaultIndicator(indicator); } indicator._gauge = this; if (major){ if (!this._majorTicksData){ this._majorTicksData = []; } this._majorTicksData[this._majorTicksData.length] = indicator; indicator.draw(this._majorTicksGroup); } else { if (!this._minorTicksData){ this._minorTicksData = []; } this._minorTicksData[this._minorTicksData.length] = indicator; indicator.draw(this._minorTicksGroup); } return indicator; }, _removeScaleTick: function(/*Object*/indicator){ // summary: // Removes the given scale tick from the gauge by calling it's remove function // and removing it from the local cache. var i; if (this._majorTicksData) for (i = 0; i < this._majorTicksData.length; i++){ if (this._majorTicksData[i] === indicator){ this._majorTicksData.splice(i, 1); indicator.remove(); return; } } if (this._minorTicksData) for (i = 0; i < this._minorTicksData.length; i++){ if (this._minorTicksData[i] === indicator){ this._minorTicksData.splice(i, 1); indicator.remove(); return; } } }, addIndicator: function(/*Object*/indicator){ // summary: // This method is used to add an indicator to the gauge. // description: // This method adds an indicator, such as a t needle, // to the gauge. // indicator: dojox.gauges._Indicator // A dojox.gauges._Indicator or an object with similar parameters // (value, color, offset, etc.). if(!indicator.declaredClass){// !== 'dojox.gauges.Indicator'){ // We were passed a plain object, need to make an indicator out of it. indicator = new this._defaultIndicator(indicator); } indicator._gauge = this; if(!indicator.hideValue){ this.containerNode.appendChild(indicator.domNode); } if(!this._indicatorData){this._indicatorData = [];} this._indicatorData[this._indicatorData.length] = indicator; indicator.draw(this._indicatorsGroup); return indicator; }, removeIndicator: function(/*Object*/indicator){ // summary: // Removes the given indicator from the gauge by calling it's remove function // and removing it from the local cache. // indicator: dojox.gauges._Indicator // The indicator to remove. for(var i=0; i