1 if(!dojo._hasResource["dojox.charting.plot2d.Stacked"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
2 dojo._hasResource["dojox.charting.plot2d.Stacked"] = true;
3 dojo.provide("dojox.charting.plot2d.Stacked");
5 dojo.require("dojox.charting.plot2d.common");
6 dojo.require("dojox.charting.plot2d.Default");
8 dojo.require("dojox.lang.functional");
9 dojo.require("dojox.lang.functional.sequence");
10 dojo.require("dojox.lang.functional.reversed");
13 var df = dojox.lang.functional, dc = dojox.charting.plot2d.common,
14 purgeGroup = df.lambda("item.purgeGroup()");
16 dojo.declare("dojox.charting.plot2d.Stacked", dojox.charting.plot2d.Default, {
17 calculateAxes: function(dim){
18 var stats = dc.collectStackedStats(this.series);
19 this._maxRunLength = stats.hmax;
20 this._calc(dim, stats);
23 render: function(dim, offsets){
25 var acc = df.repeat(this._maxRunLength, "-> 0", 0);
26 for(var i = 0; i < this.series.length; ++i){
27 var run = this.series[i];
28 for(var j = 0; j < run.data.length; ++j){
30 if(isNaN(v)){ v = 0; }
34 // draw runs in backwards
36 dojo.forEach(this.series, purgeGroup);
39 df.forEachRev(this.series, function(item){ item.cleanGroup(s); });
42 // inner function for translating polylines to curves with tension
43 function curve(arr, tension){
44 var p=dojo.map(arr, function(item, i){
45 if(i==0){ return "M" + item.x + "," + item.y; }
46 var dx=item.x-arr[i-1].x, dy=arr[i-1].y;
47 return "C"+(item.x-(tension-1)*(dx/tension))+","+dy+" "+(item.x-(dx/tension))+","+item.y+" "+item.x+","+item.y;
52 var t = this.chart.theme, stroke, outline, color, marker;
53 for(var i = this.series.length - 1; i >= 0; --i){
54 var run = this.series[i];
55 if(!this.dirty && !run.dirty){ continue; }
58 lpoly = dojo.map(acc, function(v, i){
60 x: this._hScaler.scale * (i + 1 - this._hScaler.bounds.lower) + offsets.l,
61 y: dim.height - offsets.b - this._vScaler.scale * (v - this._vScaler.bounds.lower)
64 if(!run.fill || !run.stroke){
65 // need autogenerated color
66 color = new dojo.Color(t.next("color"));
71 lpath=curve(lpoly, this.opt.tension);
75 var apoly = dojo.clone(lpoly);
76 var fill = run.fill ? run.fill : dc.augmentFill(t.series.fill, color);
78 var p=curve(apoly, this.opt.tension);
79 p += " L" + lpoly[lpoly.length-1].x + "," + (dim.height - offsets.b) + " "
80 + "L" + lpoly[0].x + "," + (dim.height - offsets.b) + " "
81 + "L" + lpoly[0].x + "," + lpoly[0].y;
82 s.createPath(p).setFill(fill);
84 apoly.push({x: lpoly[lpoly.length - 1].x, y: dim.height - offsets.b});
85 apoly.push({x: lpoly[0].x, y: dim.height - offsets.b});
87 s.createPolyline(apoly).setFill(fill);
90 if(this.opt.lines || this.opt.markers){
92 stroke = run.stroke ? dc.makeStroke(run.stroke) : dc.augmentStroke(t.series.stroke, color);
93 if(run.outline || t.series.outline){
94 outline = dc.makeStroke(run.outline ? run.outline : t.series.outline);
95 outline.width = 2 * outline.width + stroke.width;
100 marker = run.marker ? run.marker : t.next("marker");
102 if(this.opt.shadows && stroke){
103 var sh = this.opt.shadows, shadowColor = new dojo.Color([0, 0, 0, 0.3]),
104 spoly = dojo.map(lpoly, function(c){
105 return {x: c.x + sh.dx, y: c.y + sh.dy};
107 shadowStroke = dojo.clone(outline ? outline : stroke);
108 shadowStroke.color = shadowColor;
109 shadowStroke.width += sh.dw ? sh.dw : 0;
111 if(this.opt.tension){
112 s.createPath(curve(spoly, this.opt.tension)).setStroke(shadowStroke);
114 s.createPolyline(spoly).setStroke(shadowStroke);
117 if(this.opt.markers){
118 dojo.forEach(spoly, function(c){
119 s.createPath("M" + c.x + " " + c.y + " " + marker).setStroke(shadowStroke).setFill(shadowColor);
125 if(this.opt.tension){
126 s.createPath(lpath).setStroke(outline);
128 s.createPolyline(lpoly).setStroke(outline);
131 if(this.opt.tension){
132 s.createPath(lpath).setStroke(stroke);
134 s.createPolyline(lpoly).setStroke(stroke);
137 if(this.opt.markers){
138 dojo.forEach(lpoly, function(c){
139 var path = "M" + c.x + " " + c.y + " " + marker;
141 s.createPath(path).setStroke(outline);
143 s.createPath(path).setStroke(stroke).setFill(stroke.color);
147 // update the accumulator
148 for(var j = 0; j < run.data.length; ++j){
150 if(isNaN(v)){ v = 0; }