root / trunk / web / dojo / dojox / charting / plot2d / Pie.js @ 13
History | View | Annotate | Download (6.71 KB)
1 |
/*
|
---|---|
2 |
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
3 |
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
4 |
see: http://dojotoolkit.org/license for details
|
5 |
*/
|
6 |
|
7 |
|
8 |
if(!dojo._hasResource["dojox.charting.plot2d.Pie"]){ |
9 |
dojo._hasResource["dojox.charting.plot2d.Pie"]=true; |
10 |
dojo.provide("dojox.charting.plot2d.Pie");
|
11 |
dojo.require("dojox.charting.Element");
|
12 |
dojo.require("dojox.charting.axis2d.common");
|
13 |
dojo.require("dojox.charting.plot2d.common");
|
14 |
dojo.require("dojox.charting.plot2d._PlotEvents");
|
15 |
dojo.require("dojox.lang.functional");
|
16 |
dojo.require("dojox.lang.utils");
|
17 |
dojo.require("dojox.gfx");
|
18 |
dojo.require("dojo.number");
|
19 |
(function(){
|
20 |
var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,da=dojox.charting.axis2d.common,g=dojox.gfx,m=g.matrix,_1=0.2; |
21 |
dojo.declare("dojox.charting.plot2d.Pie",[dojox.charting.Element,dojox.charting.plot2d._PlotEvents],{defaultParams:{labels:true,ticks:false,fixed:true,precision:1,labelOffset:20,labelStyle:"default",htmlLabels:true,radGrad:"native",fanSize:5,startAngle:0},optionalParams:{radius:0,stroke:{},outline:{},shadow:{},fill:{},font:"",fontColor:""},constructor:function(_2,_3){ |
22 |
this.opt=dojo.clone(this.defaultParams); |
23 |
du.updateWithObject(this.opt,_3);
|
24 |
du.updateWithPattern(this.opt,_3,this.optionalParams); |
25 |
this.run=null; |
26 |
this.dyn=[];
|
27 |
},clear:function(){ |
28 |
this.dirty=true; |
29 |
this.dyn=[];
|
30 |
this.run=null; |
31 |
return this; |
32 |
},setAxis:function(_4){ |
33 |
return this; |
34 |
},addSeries:function(_5){ |
35 |
this.run=_5;
|
36 |
return this; |
37 |
},getSeriesStats:function(){ |
38 |
return dojo.delegate(dc.defaultStats);
|
39 |
},initializeScalers:function(){ |
40 |
return this; |
41 |
},getRequiredColors:function(){ |
42 |
return this.run?this.run.data.length:0; |
43 |
},render:function(_6,_7){ |
44 |
if(!this.dirty){ |
45 |
return this; |
46 |
} |
47 |
this.resetEvents();
|
48 |
this.dirty=false; |
49 |
this._eventSeries={};
|
50 |
this.cleanGroup();
|
51 |
var s=this.group,t=this.chart.theme; |
52 |
if(!this.run||!this.run.data.length){ |
53 |
return this; |
54 |
} |
55 |
var rx=(_6.width-_7.l-_7.r)/2,ry=(_6.height-_7.t-_7.b)/2,r=Math.min(rx,ry),_8="font" in this.opt?this.opt.font:t.axis.font,_9=_8?g.normalizedLength(g.splitFontString(_8).size):0,_a="fontColor" in this.opt?this.opt.fontColor:t.axis.fontColor,_b=m._degToRad(this.opt.startAngle),_c=_b,_d,_e,_f,_10,_11,_12,run=this.run.data,_13=this.events(); |
56 |
if(typeof run[0]=="number"){ |
57 |
_e=df.map(run,"x ? Math.max(x, 0) : 0");
|
58 |
if(df.every(_e,"<= 0")){ |
59 |
return this; |
60 |
} |
61 |
_f=df.map(_e,"/this",df.foldl(_e,"+",0)); |
62 |
if(this.opt.labels){ |
63 |
_10=dojo.map(_f,function(x){
|
64 |
return x>0?this._getLabel(x*100)+"%":""; |
65 |
},this);
|
66 |
} |
67 |
}else{
|
68 |
_e=df.map(run,"x ? Math.max(x.y, 0) : 0");
|
69 |
if(df.every(_e,"<= 0")){ |
70 |
return this; |
71 |
} |
72 |
_f=df.map(_e,"/this",df.foldl(_e,"+",0)); |
73 |
if(this.opt.labels){ |
74 |
_10=dojo.map(_f,function(x,i){
|
75 |
if(x<=0){ |
76 |
return ""; |
77 |
} |
78 |
var v=run[i];
|
79 |
return "text" in v?v.text:this._getLabel(x*100)+"%"; |
80 |
},this);
|
81 |
} |
82 |
} |
83 |
var _14=df.map(run,function(v,i){ |
84 |
if(v===null||typeof v=="number"){ |
85 |
return t.next("slice",[this.opt,this.run],true); |
86 |
} |
87 |
return t.next("slice",[this.opt,this.run,v],true); |
88 |
},this);
|
89 |
if(this.opt.labels){ |
90 |
_11=df.foldl1(df.map(_10,function(_15,i){
|
91 |
var _16=_14[i].series.font;
|
92 |
return dojox.gfx._base._getTextBox(_15,{font:_16}).w; |
93 |
},this),"Math.max(a, b)")/2; |
94 |
if(this.opt.labelOffset<0){ |
95 |
r=Math.min(rx-2*_11,ry-_9)+this.opt.labelOffset; |
96 |
} |
97 |
_12=r-this.opt.labelOffset;
|
98 |
} |
99 |
if("radius" in this.opt){ |
100 |
r=this.opt.radius;
|
101 |
_12=r-this.opt.labelOffset;
|
102 |
} |
103 |
var _17={cx:_7.l+rx,cy:_7.t+ry,r:r}; |
104 |
this.dyn=[];
|
105 |
var _18=new Array(_f.length); |
106 |
dojo.some(_f,function(_19,i){
|
107 |
if(_19<=0){ |
108 |
return false; |
109 |
} |
110 |
var v=run[i],_1a=_14[i],_1b;
|
111 |
if(_19>=1){ |
112 |
_1b=this._plotFill(_1a.series.fill,_6,_7);
|
113 |
_1b=this._shapeFill(_1b,{x:_17.cx-_17.r,y:_17.cy-_17.r,width:2*_17.r,height:2*_17.r}); |
114 |
_1b=this._pseudoRadialFill(_1b,{x:_17.cx,y:_17.cy},_17.r); |
115 |
var _1c=s.createCircle(_17).setFill(_1b).setStroke(_1a.series.stroke);
|
116 |
this.dyn.push({fill:_1b,stroke:_1a.series.stroke}); |
117 |
if(_13){
|
118 |
var o={element:"slice",index:i,run:this.run,shape:_1c,x:i,y:typeof v=="number"?v:v.y,cx:_17.cx,cy:_17.cy,cr:r}; |
119 |
this._connectEvents(o);
|
120 |
_18[i]=o; |
121 |
} |
122 |
return true; |
123 |
} |
124 |
var end=_c+_19*2*Math.PI; |
125 |
if(i+1==_f.length){ |
126 |
end=_b+2*Math.PI;
|
127 |
} |
128 |
var _1d=end-_c,x1=_17.cx+r*Math.cos(_c),y1=_17.cy+r*Math.sin(_c),x2=_17.cx+r*Math.cos(end),y2=_17.cy+r*Math.sin(end);
|
129 |
var _1e=m._degToRad(this.opt.fanSize); |
130 |
if(_1a.series.fill&&_1a.series.fill.type==="radial"&&this.opt.radGrad==="fan"&&_1d>_1e){ |
131 |
var _1f=s.createGroup(),_20=Math.ceil(_1d/_1e),_21=_1d/_20;
|
132 |
_1b=this._shapeFill(_1a.series.fill,{x:_17.cx-_17.r,y:_17.cy-_17.r,width:2*_17.r,height:2*_17.r}); |
133 |
for(var j=0;j<_20;++j){ |
134 |
var _22=j==0?x1:_17.cx+r*Math.cos(_c+(j-_1)*_21),_23=j==0?y1:_17.cy+r*Math.sin(_c+(j-_1)*_21),_24=j==_20-1?x2:_17.cx+r*Math.cos(_c+(j+1+_1)*_21),_25=j==_20-1?y2:_17.cy+r*Math.sin(_c+(j+1+_1)*_21),fan=_1f.createPath({}).moveTo(_17.cx,_17.cy).lineTo(_22,_23).arcTo(r,r,0,_21>Math.PI,true,_24,_25).lineTo(_17.cx,_17.cy).closePath().setFill(this._pseudoRadialFill(_1b,{x:_17.cx,y:_17.cy},r,_c+(j+0.5)*_21,_c+(j+0.5)*_21)); |
135 |
} |
136 |
_1f.createPath({}).moveTo(_17.cx,_17.cy).lineTo(x1,y1).arcTo(r,r,0,_1d>Math.PI,true,x2,y2).lineTo(_17.cx,_17.cy).closePath().setStroke(_1a.series.stroke); |
137 |
_1c=_1f; |
138 |
}else{
|
139 |
_1c=s.createPath({}).moveTo(_17.cx,_17.cy).lineTo(x1,y1).arcTo(r,r,0,_1d>Math.PI,true,x2,y2).lineTo(_17.cx,_17.cy).closePath().setStroke(_1a.series.stroke); |
140 |
var _1b=_1a.series.fill;
|
141 |
if(_1b&&_1b.type==="radial"){ |
142 |
_1b=this._shapeFill(_1b,{x:_17.cx-_17.r,y:_17.cy-_17.r,width:2*_17.r,height:2*_17.r}); |
143 |
if(this.opt.radGrad==="linear"){ |
144 |
_1b=this._pseudoRadialFill(_1b,{x:_17.cx,y:_17.cy},r,_c,end); |
145 |
} |
146 |
}else{
|
147 |
if(_1b&&_1b.type==="linear"){ |
148 |
_1b=this._plotFill(_1b,_6,_7);
|
149 |
_1b=this._shapeFill(_1b,_1c.getBoundingBox());
|
150 |
} |
151 |
} |
152 |
_1c.setFill(_1b); |
153 |
} |
154 |
this.dyn.push({fill:_1b,stroke:_1a.series.stroke}); |
155 |
if(_13){
|
156 |
var o={element:"slice",index:i,run:this.run,shape:_1c,x:i,y:typeof v=="number"?v:v.y,cx:_17.cx,cy:_17.cy,cr:r}; |
157 |
this._connectEvents(o);
|
158 |
_18[i]=o; |
159 |
} |
160 |
_c=end; |
161 |
return false; |
162 |
},this);
|
163 |
if(this.opt.labels){ |
164 |
_c=_b; |
165 |
dojo.some(_f,function(_26,i){
|
166 |
if(_26<=0){ |
167 |
return false; |
168 |
} |
169 |
var _27=_14[i];
|
170 |
if(_26>=1){ |
171 |
var v=run[i],_28=da.createText[this.opt.htmlLabels&&dojox.gfx.renderer!="vml"?"html":"gfx"](this.chart,s,_17.cx,_17.cy+_9/2,"middle",_10[i],_27.series.font,_27.series.fontColor); |
172 |
if(this.opt.htmlLabels){ |
173 |
this.htmlElements.push(_28);
|
174 |
} |
175 |
return true; |
176 |
} |
177 |
var end=_c+_26*2*Math.PI,v=run[i]; |
178 |
if(i+1==_f.length){ |
179 |
end=_b+2*Math.PI;
|
180 |
} |
181 |
var _29=(_c+end)/2,x=_17.cx+_12*Math.cos(_29),y=_17.cy+_12*Math.sin(_29)+_9/2; |
182 |
var _28=da.createText[this.opt.htmlLabels&&dojox.gfx.renderer!="vml"?"html":"gfx"](this.chart,s,x,y,"middle",_10[i],_27.series.font,_27.series.fontColor); |
183 |
if(this.opt.htmlLabels){ |
184 |
this.htmlElements.push(_28);
|
185 |
} |
186 |
_c=end; |
187 |
return false; |
188 |
},this);
|
189 |
} |
190 |
var esi=0; |
191 |
this._eventSeries[this.run.name]=df.map(run,function(v){ |
192 |
return v<=0?null:_18[esi++]; |
193 |
}); |
194 |
return this; |
195 |
},_getLabel:function(_2a){ |
196 |
return this.opt.fixed?dojo.number.format(_2a,{places:this.opt.precision}):_2a.toString(); |
197 |
}}); |
198 |
})(); |
199 |
} |