define("dojox/dgauges/RectangularGauge", ["dojo/_base/declare", "./GaugeBase", "dojox/gfx/matrix"], function(declare, GaugeBase, matrix){ return declare("dojox.dgauges.RectangularGauge", GaugeBase, { // summary: // The base class for rectangular gauges. // You can create custom horizontal or vertical gauges by extending this class. // See dojox/dgauges/components/default/HorinzontalLinearGauge.js for an example of rectangular gauge. // orientation: "horizontal"|"vertical" // The orientation of the gauge. Default is "horizontal". orientation: "horizontal", // leading, middle and trailing graphical parts _middleParts: null, _leadingParts: null, _trailingParts: null, _baseParts: null, _classParts: null, _layoutInfos: {}, constructor: function(){ this.orientation = "horizontal"; this._middleParts = []; this._leadingParts = []; this._trailingParts = []; this._baseParts = []; this._classParts = []; this._layoutInfos = { leading: { x: 0, y: 0, w: 0, h: 0 }, middle: { x: 0, y: 0, w: 0, h: 0 }, trailing: { x: 0, y: 0, w: 0, h: 0 } }; this.addInvalidatingProperties(["orientation"]); }, addElement: function(name, element, location){ // summary: // Adds a element to the gauge. // name: String // The name of the element to be added. // element: Object // This parameter can be: // - A function which takes on argument of type GFX Group and return null or a // GFX element retrievable using the getElementRenderer() method. // - A Scale instance, i.e. CircularScale or RectangularScale. // - A TextIndicator instance. // location: String // The area to place the element. Valid values are "leading"|"middle"|"trailing". Leading and trailing areas are fixed size. The // middle area use the remaining size. If not specified, the element's refreshRendering // is called with the whole gauge size as argument. this.inherited(arguments); var obj = this._elements[this._elements.length - 1]; if(location == "middle"){ this._middleParts.push(obj); }else if(location == "leading"){ this._leadingParts.push(obj); }else if(location == "trailing"){ this._trailingParts.push(obj); }else{ if(obj._isGFX){ this._baseParts.push(obj); }else{ this._classParts.push(obj); } } }, removeElement: function(name){ // summary: // Remove the element defined by name from the gauge. // name: String // The name of the element as defined using addElement. // returns: Object // A reference to the removed element. var obj = this.getElement(name); if(obj){ if(this._middleParts && this._middleParts.indexOf(obj) >= 0){ this._middleParts.splice(this._middleParts.indexOf(obj), 1); }else if(this._leadingParts && this._leadingParts.indexOf(obj) >= 0){ this._leadingParts.splice(this._leadingParts.indexOf(obj), 1); }else if(this._trailingParts && this._trailingParts.indexOf(obj) >= 0){ this._trailingParts.splice(this._trailingParts.indexOf(obj), 1); }else if(this._baseParts && this._baseParts.indexOf(obj) >= 0){ this._baseParts.splice(this._baseParts.indexOf(obj), 1); }else if(this._classParts && this._classParts.indexOf(obj) >= 0){ this._classParts.splice(this._classParts.indexOf(obj), 1); } } this.inherited(arguments); }, _computeArrayBoundingBox: function(elements){ // summary: // Internal method. // tags: // private if(elements.length == 0){ return { x: 0, y: 0, w: 0, h: 0 }; } var res = { x: -Infinity, y: -Infinity, w: 0, h: 0 }; var bbox = null; for(var i = 0; i < elements.length; i++){ bbox = this._computeBoundingBox(elements[i]._gfxGroup); if(!bbox){ continue; } if(res.x < bbox.x){ res.x = bbox.x; } if(res.w < bbox.width){ res.w = bbox.width; } if(res.y < bbox.y){ res.y = bbox.y; } if(res.h < bbox.height){ res.h = bbox.height; } } if(res.x == -Infinity){ res.x = 0; } if(res.y == -Infinity){ res.y = 0; } return res; }, refreshRendering: function(){ if(this._widgetBox.w <= 0 || this._widgetBox.h <= 0){ return; } var i; if(this._baseParts){ for(i = 0; i < this._baseParts.length; i++){ this._baseParts[i].width = this._widgetBox.w; this._baseParts[i].height = this._widgetBox.h; this._elementsRenderers[this._baseParts[i]._name] = this._baseParts[i].refreshRendering(); } } if(this._leadingParts){ for(i = 0; i < this._leadingParts.length; i++){ this._elementsRenderers[this._leadingParts[i]._name] = this._leadingParts[i].refreshRendering(); } } if(this._trailingParts){ for(i = 0; i < this._trailingParts.length; i++){ this._elementsRenderers[this._trailingParts[i]._name] = this._trailingParts[i].refreshRendering(); } } var leadingBoundingBox = this._computeArrayBoundingBox(this._leadingParts); var trailingBoundingBox = this._computeArrayBoundingBox(this._trailingParts); var middleBoundingBox = {}; if(this.orientation == "horizontal"){ middleBoundingBox.x = leadingBoundingBox.x + leadingBoundingBox.w; middleBoundingBox.y = 0; middleBoundingBox.w = this._widgetBox.w - leadingBoundingBox.w - trailingBoundingBox.w; middleBoundingBox.h = this._widgetBox.h; }else{ middleBoundingBox.x = 0; middleBoundingBox.y = leadingBoundingBox.y + leadingBoundingBox.h; middleBoundingBox.w = this._widgetBox.w; middleBoundingBox.h = this._widgetBox.h - leadingBoundingBox.h - trailingBoundingBox.h; } this._layoutInfos = { leading: leadingBoundingBox, middle: middleBoundingBox, trailing: trailingBoundingBox }; // translates middle part for(i = 0; i < this._middleParts.length; i++){ this._middleParts[i]._gfxGroup.setTransform([matrix.translate(middleBoundingBox.x, middleBoundingBox.y)]); } // translates trailing part if(this._trailingParts){ for(i = 0; i < this._trailingParts.length; i++){ this._trailingParts[i]._gfxGroup.setTransform(matrix.translate(this._widgetBox.w - trailingBoundingBox.w, 0)); } } // Render remaining elements (scales, ...) for(i = 0; i < this._classParts.length; i++){ this._elementsRenderers[this._classParts[i]._name] = this._classParts[i].refreshRendering(); } } }) });