blob: f8591346e810a205b781840eb3d181698c7f8a76 [file] [log] [blame]
/*
Copyright (c) 2004-2009, 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.charting.plot2d.Pie"]){
dojo._hasResource["dojox.charting.plot2d.Pie"]=true;
dojo.provide("dojox.charting.plot2d.Pie");
dojo.require("dojox.charting.Element");
dojo.require("dojox.charting.axis2d.common");
dojo.require("dojox.charting.plot2d.common");
dojo.require("dojox.lang.functional");
dojo.require("dojox.gfx");
(function(){
var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,da=dojox.charting.axis2d.common,g=dojox.gfx;
dojo.declare("dojox.charting.plot2d.Pie",dojox.charting.Element,{defaultParams:{labels:true,ticks:false,fixed:true,precision:1,labelOffset:20,labelStyle:"default",htmlLabels:true},optionalParams:{font:"",fontColor:"",radius:0},constructor:function(_1,_2){
this.opt=dojo.clone(this.defaultParams);
du.updateWithObject(this.opt,_2);
du.updateWithPattern(this.opt,_2,this.optionalParams);
this.run=null;
this.dyn=[];
},destroy:function(){
this.resetEvents();
this.inherited(arguments);
},clear:function(){
this.dirty=true;
this.dyn=[];
this.run=null;
return this;
},setAxis:function(_3){
return this;
},addSeries:function(_4){
this.run=_4;
return this;
},calculateAxes:function(_5){
return this;
},getRequiredColors:function(){
return this.run?this.run.data.length:0;
},plotEvent:function(o){
},connect:function(_6,_7){
this.dirty=true;
return dojo.connect(this,"plotEvent",_6,_7);
},events:function(){
var ls=this.plotEvent._listeners;
if(!ls||!ls.length){
return false;
}
for(var i in ls){
if(!(i in Array.prototype)){
return true;
}
}
return false;
},resetEvents:function(){
this.plotEvent({type:"onplotreset",plot:this});
},_connectEvents:function(_8,o){
_8.connect("onmouseover",this,function(e){
o.type="onmouseover";
o.event=e;
this.plotEvent(o);
});
_8.connect("onmouseout",this,function(e){
o.type="onmouseout";
o.event=e;
this.plotEvent(o);
});
_8.connect("onclick",this,function(e){
o.type="onclick";
o.event=e;
this.plotEvent(o);
});
},render:function(_9,_a){
if(!this.dirty){
return this;
}
this.dirty=false;
this.cleanGroup();
var s=this.group,_b,t=this.chart.theme;
this.resetEvents();
if(!this.run||!this.run.data.length){
return this;
}
var rx=(_9.width-_a.l-_a.r)/2,ry=(_9.height-_a.t-_a.b)/2,r=Math.min(rx,ry),_c="font" in this.opt?this.opt.font:t.axis.font,_d=_c?g.normalizedLength(g.splitFontString(_c).size):0,_e="fontColor" in this.opt?this.opt.fontColor:t.axis.fontColor,_f=0,_10,_11,_12,_13,_14,_15,run=this.run.data,_16=this.events();
if(typeof run[0]=="number"){
_11=df.map(run,"Math.max(x, 0)");
if(df.every(_11,"<= 0")){
return this;
}
_12=df.map(_11,"/this",df.foldl(_11,"+",0));
if(this.opt.labels){
_13=dojo.map(_12,function(x){
return x>0?this._getLabel(x*100)+"%":"";
},this);
}
}else{
_11=df.map(run,"Math.max(x.y, 0)");
if(df.every(_11,"<= 0")){
return this;
}
_12=df.map(_11,"/this",df.foldl(_11,"+",0));
if(this.opt.labels){
_13=dojo.map(_12,function(x,i){
if(x<=0){
return "";
}
var v=run[i];
return "text" in v?v.text:this._getLabel(x*100)+"%";
},this);
}
}
if(this.opt.labels){
_14=df.foldl1(df.map(_13,function(_17){
return dojox.gfx._base._getTextBox(_17,{font:_c}).w;
},this),"Math.max(a, b)")/2;
if(this.opt.labelOffset<0){
r=Math.min(rx-2*_14,ry-_d)+this.opt.labelOffset;
}
_15=r-this.opt.labelOffset;
}
if("radius" in this.opt){
r=this.opt.radius;
_15=r-this.opt.labelOffset;
}
var _18={cx:_a.l+rx,cy:_a.t+ry,r:r};
this.dyn=[];
dojo.some(_12,function(_19,i){
if(_19<=0){
return false;
}
var v=run[i];
if(_19>=1){
var _1a,_1b,_1c;
if(typeof v=="object"){
_1a="color" in v?v.color:new dojo.Color(t.next("color"));
_1b="fill" in v?v.fill:dc.augmentFill(t.series.fill,_1a);
_1c="stroke" in v?v.stroke:dc.augmentStroke(t.series.stroke,_1a);
}else{
_1a=new dojo.Color(t.next("color"));
_1b=dc.augmentFill(t.series.fill,_1a);
_1c=dc.augmentStroke(t.series.stroke,_1a);
}
var _1d=s.createCircle(_18).setFill(_1b).setStroke(_1c);
this.dyn.push({color:_1a,fill:_1b,stroke:_1c});
if(_16){
var o={element:"slice",index:i,run:this.run,plot:this,shape:_1d,x:i,y:typeof v=="number"?v:v.y,cx:_18.cx,cy:_18.cy,cr:r};
this._connectEvents(_1d,o);
}
return true;
}
var end=_f+_19*2*Math.PI;
if(i+1==_12.length){
end=2*Math.PI;
}
var _1e=end-_f,x1=_18.cx+r*Math.cos(_f),y1=_18.cy+r*Math.sin(_f),x2=_18.cx+r*Math.cos(end),y2=_18.cy+r*Math.sin(end);
var _1a,_1b,_1c;
if(typeof v=="object"){
_1a="color" in v?v.color:new dojo.Color(t.next("color"));
_1b="fill" in v?v.fill:dc.augmentFill(t.series.fill,_1a);
_1c="stroke" in v?v.stroke:dc.augmentStroke(t.series.stroke,_1a);
}else{
_1a=new dojo.Color(t.next("color"));
_1b=dc.augmentFill(t.series.fill,_1a);
_1c=dc.augmentStroke(t.series.stroke,_1a);
}
var _1d=s.createPath({}).moveTo(_18.cx,_18.cy).lineTo(x1,y1).arcTo(r,r,0,_1e>Math.PI,true,x2,y2).lineTo(_18.cx,_18.cy).closePath().setFill(_1b).setStroke(_1c);
this.dyn.push({color:_1a,fill:_1b,stroke:_1c});
if(_16){
var o={element:"slice",index:i,run:this.run,plot:this,shape:_1d,x:i,y:typeof v=="number"?v:v.y,cx:_18.cx,cy:_18.cy,cr:r};
this._connectEvents(_1d,o);
}
_f=end;
return false;
},this);
if(this.opt.labels){
_f=0;
dojo.some(_12,function(_1f,i){
if(_1f<=0){
return false;
}
if(_1f>=1){
var v=run[i],_20=da.createText[this.opt.htmlLabels&&dojox.gfx.renderer!="vml"?"html":"gfx"](this.chart,s,_18.cx,_18.cy+_d/2,"middle",_13[i],_c,(typeof v=="object"&&"fontColor" in v)?v.fontColor:_e);
if(this.opt.htmlLabels){
this.htmlElements.push(_20);
}
return true;
}
var end=_f+_1f*2*Math.PI,v=run[i];
if(i+1==_12.length){
end=2*Math.PI;
}
var _21=(_f+end)/2,x=_18.cx+_15*Math.cos(_21),y=_18.cy+_15*Math.sin(_21)+_d/2;
var _20=da.createText[this.opt.htmlLabels&&dojox.gfx.renderer!="vml"?"html":"gfx"](this.chart,s,x,y,"middle",_13[i],_c,(typeof v=="object"&&"fontColor" in v)?v.fontColor:_e);
if(this.opt.htmlLabels){
this.htmlElements.push(_20);
}
_f=end;
return false;
},this);
}
return this;
},_getLabel:function(_22){
return this.opt.fixed?_22.toFixed(this.opt.precision):_22.toString();
}});
})();
}