123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- /*
- Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
- */
- if(!dojo._hasResource["dojox.widget.BarGauge"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
- dojo._hasResource["dojox.widget.BarGauge"] = true;
- dojo.provide("dojox.widget.BarGauge");
- dojo.require("dojox.gfx");
- dojo.require("dojox.widget.gauge._Gauge");
- dojo.experimental("dojox.widget.BarGauge");
- dojo.declare("dojox.widget.gauge.BarLineIndicator",[dojox.widget.gauge._Indicator],{
- width: 1,
- _getShapes: function(){
- // summary:
- // Private function for generating the shapes for this indicator. An indicator that behaves the
- // same might override this one and simply replace the shapes (such as BarIndicator).
- if(!this._gauge){
- return null;
- }
- var v = this.value;
- if(v < this._gauge.min){v = this._gauge.min;}
- if(v > this._gauge.max){v = this._gauge.max;}
- var pos = this._gauge._getPosition(v);
- var shapes = [];
- if(this.width > 1){
- shapes[0] = this._gauge.surface.createRect({
- x:pos,
- y:this._gauge.dataY + this.offset,
- width:this.width,
- height:this.length
- });
- shapes[0].setStroke({color: this.color});
- shapes[0].setFill(this.color);
- }else{
- shapes[0] = this._gauge.surface.createLine({
- x1:pos,
- y1:this._gauge.dataY + this.offset,
- x2:pos,
- y2:this._gauge.dataY + this.offset + this.length
- });
- shapes[0].setStroke({color: this.color});
- }
- return shapes;
- },
- draw: function(/*Boolean?*/ dontAnimate){
- // summary:
- // Override of dojox.widget.gauge._Indicator.draw
- // dontAnimate: Boolean
- // Indicates if the drawing should not be animated (vs. the default of doing an animation)
- var i;
- if(this.shapes){
- this._move(dontAnimate);
- }else{
- if(this.shapes){
- for(i=0; i<this.shapes.length; i++){
- this._gauge.surface.remove(this.shapes[i]);
- }
- this.shapes = null;
- }
- if(this.text){
- this._gauge.surface.rawNode.removeChild(this.text);
- this.text = null;
- }
-
- this.color = this.color || '#000000';
- this.length = this.length || this._gauge.dataHeight;
- this.width = this.width || 3;
- this.offset = this.offset || 0;
- this.highlight = this.highlight || '#4D4D4D';
- this.highlight2 = this.highlight2 || '#A3A3A3';
-
- this.shapes = this._getShapes(this._gauge, this);
- if(this.label){
- var v = this.value;
- if(v < this._gauge.min){v = this._gauge.min;}
- if(v > this._gauge.max){v = this._gauge.max;}
- var pos = this._gauge._getPosition(v);
- this.text = this._gauge.drawText(''+this.label, pos, this._gauge.dataY + this.offset - 5, 'middle','top', this.color, this.font);
- }
-
- for(i=0; i<this.shapes.length; i++){
- if(this.hover){
- this.shapes[i].getEventSource().setAttribute('hover',this.hover);
- }
- if(this.onDragMove && !this.noChange){
- this._gauge.connect(this.shapes[i].getEventSource(), 'onmousedown', this._gauge.handleMouseDown);
- this.shapes[i].getEventSource().style.cursor = 'pointer';
- }
- }
- this.currentValue = this.value;
- }
- },
- _move: function(/*Boolean?*/ dontAnimate){
- // summary:
- // Moves this indicator (since it's already been drawn once)
- // dontAnimate: Boolean
- // Indicates if the drawing should not be animated (vs. the default of doing an animation)
- var v = this.value ;
- if(v < this.min){v = this.min;}
- if(v > this.max){v = this.max;}
- var c = this._gauge._getPosition(this.currentValue);
- this.currentValue = v;
- v = this._gauge._getPosition(v)-this._gauge.dataX;
- if(dontAnimate){
- this.shapes[0].applyTransform(dojox.gfx.matrix.translate(v-(this.shapes[0].matrix?this.shapes[0].matrix.dx:0),0));
- }else{
- var anim = new dojo.Animation({curve: [c, v], duration: this.duration, easing: this.easing});
- dojo.connect(anim, "onAnimate", dojo.hitch(this, function(jump){
- this.shapes[0].applyTransform(dojox.gfx.matrix.translate(jump-(this.shapes[0].matrix?this.shapes[0].matrix.dx:0),0));
- }));
- anim.play();
- }
- }
- });
- dojo.declare("dojox.widget.BarGauge",dojox.widget.gauge._Gauge,{
- // summary:
- // a bar graph built using the dojox.gfx package.
- //
- // description:
- // using dojo.gfx (and thus either SVG or VML based on what is supported), this widget
- // builds a bar graph component, used to display numerical data in a familiar format.
- //
- // usage:
- // <script type="text/javascript">
- // dojo.require("dojox.widget.BarGauge");
- // dojo.require("dijit.util.parser");
- // </script>
- // ...
- // <div dojoType="dojox.widget.BarGauge"
- // id="testBarGauge"
- // barGaugeHeight="55"
- // dataY="25"
- // dataHeight="25"
- // dataWidth="225">
- // </div>
- // dataX: Number
- // x position of data area (default 5)
- dataX: 5,
- // dataY: Number
- // y position of data area (default 5)
- dataY: 5,
- // dataWidth: Number
- // width of data area (default is bar graph width - 10)
- dataWidth: 0,
- // dataHeight: Number
- // height of data area (default is bar graph width - 10)
- dataHeight: 0,
- // _defaultIndicator: override of dojox.widget._Gauge._defaultIndicator
- _defaultIndicator: dojox.widget.gauge.BarLineIndicator,
- startup: function(){
- // handle settings from HTML by making sure all the options are
- // converted correctly to numbers
- //
- // also connects mouse handling events
- if(this.getChildren){
- dojo.forEach(this.getChildren(), function(child){ child.startup(); });
- }
- if(!this.dataWidth){this.dataWidth = this.gaugeWidth - 10;}
- if(!this.dataHeight){this.dataHeight = this.gaugeHeight - 10;}
- this.inherited(arguments);
- },
- _getPosition: function(/*Number*/value){
- // summary:
- // This is a helper function used to determine the position that represents
- // a given value on the bar graph
- // value: Number
- // A value to be converted to a position for this bar graph.
- return this.dataX + Math.floor((value - this.min)/(this.max - this.min)*this.dataWidth);
- },
- _getValueForPosition: function(/*Number*/pos){
- // summary:
- // This is a helper function used to determine the value represented by
- // a position on the bar graph
- // pos: Number
- // A position to be converted to a value.
- return (pos - this.dataX)*(this.max - this.min)/this.dataWidth + this.min;
- },
- draw: function(){
- // summary:
- // This function is used to draw (or redraw) the bar graph
- // description:
- // Draws the bar graph by drawing the surface, the ranges, and the indicators.
- if(!this.surface){this.createSurface();}
- var i;
- if(this._rangeData){
- for(i=0; i<this._rangeData.length; i++){
- this.drawRange(this._rangeData[i]);
- }
- if(this._img && this.image.overlay){
- this._img.moveToFront();
- }
- }
- if(this._indicatorData){
- for(i=0; i<this._indicatorData.length; i++){
- this._indicatorData[i].draw();
- }
- }
- },
- drawRange: function(/*Object*/range){
- // summary:
- // This function is used to draw (or redraw) a range
- // description:
- // Draws a range (colored area on the background of the gauge)
- // based on the given arguments.
- // range:
- // A range is either a dojox.widget.gauge.Range or an object
- // with similar parameters (low, high, hover, etc.).
- if(range.shape){
- this.surface.remove(range.shape);
- range.shape = null;
- }
- var x1 = this._getPosition(range.low);
- var x2 = this._getPosition(range.high);
- var path = this.surface.createRect({x:x1,
- y:this.dataY,
- width:x2-x1,
- height:this.dataHeight});
- if(dojo.isArray(range.color) || dojo.isString(range.color)){
- path.setStroke({color: range.color});
- path.setFill(range.color);
- }else if(range.color.type){
- // Color is a gradient
- var y = this.dataY + this.dataHeight/2;
- range.color.x1 = x1;
- range.color.x2 = x2;
- range.color.y1 = y;
- range.color.y2 = y;
- path.setFill(range.color);
- path.setStroke({color: range.color.colors[0].color});
- }else{
- // We've defined a style rather than an explicit color
- path.setStroke({color: "green"}); // Arbitrary color, just have to indicate
- path.setFill("green"); // that we want it filled
- path.getEventSource().setAttribute("class", range.color.style);
- }
- if(range.hover){
- path.getEventSource().setAttribute('hover',range.hover);
- }
- range.shape = path;
- },
- getRangeUnderMouse: function(/*Object*/event){
- // summary:
- // Determines which range the mouse is currently over
- // event: Object
- // The event object as received by the mouse handling functions below.
- var range = null;
- var pos = dojo.coords(this.gaugeContent);
- var x = event.clientX - pos.x;
- var value = this._getValueForPosition(x);
- if(this._rangeData){
- for(var i=0; (i<this._rangeData.length) && !range; i++){
- if((Number(this._rangeData[i].low) <= value) && (Number(this._rangeData[i].high) >= value)){
- range = this._rangeData[i];
- }
- }
- }
- return range;
- },
- _dragIndicator: function(/*Object*/ widget, /*Object*/ event){
- // summary:
- // Handles the dragging of an indicator, including moving/re-drawing
- // get new value based on mouse position
- var pos = dojo.coords(widget.gaugeContent);
- var x = event.clientX - pos.x;
- var value = widget._getValueForPosition(x);
- if(value < widget.min){value = widget.min;}
- if(value > widget.max){value = widget.max;}
- // update the indicator
- widget._drag.value = value;
- // callback
- widget._drag.onDragMove(widget._drag);
- // redraw/move indicator(s)
- widget._drag.draw(true);
- dojo.stopEvent(event);
- }
- });
- }
|