source: code/Website/open-flash-chart/charts/LineBase.as@ 7849

Last change on this file since 7849 was 7849, checked in by dennisw, 15 years ago
File size: 6.2 KB
Line 
1package charts {
2
3 import charts.series.Element;
4 import charts.series.dots.PointDotBase;
5 import flash.display.Graphics;
6 import flash.display.Sprite;
7 import flash.display.BlendMode;
8 import string.Utils;
9 // import charts.series.dots.PointDot;
10 import charts.series.dots.dot_factory;
11
12
13 public class LineBase extends Base
14 {
15 // JSON style:
16 protected var style:Object;
17
18
19 public function LineBase() {}
20
21 //
22 // called from the BaseLine object
23 //
24 protected override function get_element( index:Number, value:Object ): Element {
25
26// var s:Object = this.merge_us_with_value_object( value );
27 //
28 // the width of the hollow circle is the same as the width of the line
29 //
30
31 var tmp:Properties;
32 if( value is Number )
33 tmp = new Properties( { value:value }, this.style['--dot-style']);
34 else
35 tmp = new Properties( value, this.style['--dot-style']);
36
37 return dot_factory.make( index, tmp );
38 }
39
40
41 // Draw lines...
42 public override function resize( sc:ScreenCoordsBase ): void {
43 this.x = this.y = 0;
44
45 this.graphics.clear();
46 this.graphics.lineStyle( this.style.width, this.style.colour );
47
48 if( this.style['line-style'].style != 'solid' )
49 this.dash_line(sc);
50 else
51 this.solid_line(sc);
52
53 }
54
55 public function solid_line( sc:ScreenCoordsBase ): void {
56
57 var first:Boolean = true;
58 var i:Number;
59 var tmp:Sprite;
60 var x:Number;
61 var y:Number;
62
63 for ( i=0; i < this.numChildren; i++ ) {
64
65 tmp = this.getChildAt(i) as Sprite;
66
67 //
68 // filter out the line masks
69 //
70 if( tmp is Element )
71 {
72 var e:Element = tmp as Element;
73
74 // tell the point where it is on the screen
75 // we will use this info to place the tooltip
76 e.resize( sc );
77 if( first )
78 {
79 this.graphics.moveTo(e.x, e.y);
80 x = e.x;
81 y = e.y;
82 first = false;
83 }
84 else
85 this.graphics.lineTo(e.x, e.y);
86 }
87 }
88
89 if ( this.style.loop ) {
90 // close the line loop (radar charts)
91 this.graphics.lineTo(x, y);
92 }
93 }
94
95 // Dashed lines by Arseni
96 public function dash_line( sc:ScreenCoordsBase ): void {
97
98 var first:Boolean = true;
99
100 var prev_x:int = 0;
101 var prev_y:int = 0;
102 var on_len_left:Number = 0;
103 var off_len_left:Number = 0;
104 var on_len:Number = this.style['line-style'].on; //Stroke Length
105 var off_len:Number = this.style['line-style'].off; //Space Length
106 var now_on:Boolean = true;
107
108 for ( var i:Number = 0; i < this.numChildren; i++ ) {
109 var tmp:Sprite = this.getChildAt(i) as Sprite;
110 //
111 // filter out the line masks
112 //
113 if( tmp is Element )
114 {
115 var e:Element = tmp as Element;
116
117 // tell the point where it is on the screen
118 // we will use this info to place the tooltip
119 e.resize( sc );
120 if( first )
121 {
122 this.graphics.moveTo(e.x, e.y);
123 on_len_left = on_len;
124 off_len_left = off_len;
125 now_on = true;
126 first = false;
127 prev_x = e.x;
128 prev_y = e.y;
129 var x_tmp_1:Number = prev_x;
130 var x_tmp_2:Number;
131 var y_tmp_1:Number = prev_y;
132 var y_tmp_2:Number;
133 }
134 else {
135 var part_len:Number = Math.sqrt((e.x - prev_x) * (e.x - prev_x) + (e.y - prev_y) * (e.y - prev_y) );
136 var sinus:Number = ((e.y - prev_y) / part_len);
137 var cosinus:Number = ((e.x - prev_x) / part_len);
138 var part_len_left:Number = part_len;
139 var inside_part:Boolean = true;
140
141 while (inside_part) {
142 //Draw Lines And spaces one by one in loop
143 if ( now_on ) {
144 //Draw line
145 //If whole stroke fits
146 if ( on_len_left < part_len_left ) {
147 //Fits - draw whole stroke
148 x_tmp_2 = x_tmp_1 + on_len_left * cosinus;
149 y_tmp_2 = y_tmp_1 + on_len_left * sinus;
150 x_tmp_1 = x_tmp_2;
151 y_tmp_1 = y_tmp_2;
152 part_len_left = part_len_left - on_len_left;
153 now_on = false;
154 off_len_left = off_len;
155 } else {
156 //Does not fit - draw part of the stroke
157 x_tmp_2 = e.x;
158 y_tmp_2 = e.y;
159 x_tmp_1 = x_tmp_2;
160 y_tmp_1 = y_tmp_2;
161 on_len_left = on_len_left - part_len_left;
162 inside_part = false;
163 }
164 this.graphics.lineTo(x_tmp_2, y_tmp_2);
165 } else {
166 //Draw space
167 //If whole space fits
168 if ( off_len_left < part_len_left ) {
169 //Fits - draw whole space
170 x_tmp_2 = x_tmp_1 + off_len_left * cosinus;
171 y_tmp_2 = y_tmp_1 + off_len_left * sinus;
172 x_tmp_1 = x_tmp_2;
173 y_tmp_1 = y_tmp_2;
174 part_len_left = part_len_left - off_len_left;
175 now_on = true;
176 on_len_left = on_len;
177 } else {
178 //Does not fit - draw part of the space
179 x_tmp_2 = e.x;
180 y_tmp_2 = e.y;
181 x_tmp_1 = x_tmp_2;
182 y_tmp_1 = y_tmp_2;
183 off_len_left = off_len_left - part_len_left;
184 inside_part = false;
185 }
186 this.graphics.moveTo(x_tmp_2, y_tmp_2);
187 }
188 }
189 }
190 prev_x = e.x;
191 prev_y = e.y;
192 }
193 }
194 }
195
196 protected function merge_us_with_value_object( value:Object ): Object {
197
198 var default_style:Object = {
199 'dot-size': this.style['dot-size'],
200 colour: this.style.colour,
201 'halo-size': this.style['halo-size'],
202 tip: this.style.tip,
203 'on-click': this.style['on-click'],
204 'axis': this.style.axis
205 }
206
207 if( value is Number )
208 default_style.value = value;
209 else
210 object_helper.merge_2( value, default_style );
211
212 // our parent colour is a number, but
213 // we may have our own colour:
214 if( default_style.colour is String )
215 default_style.colour = Utils.get_colour( default_style.colour );
216
217 // Minor hack, replace all #key# with this LINEs key text:
218 default_style.tip = default_style.tip.replace('#key#', this.style.text);
219
220 return default_style;
221 }
222
223 public override function get_colour(): Number {
224 return this.style.colour;
225 }
226 }
227}
Note: See TracBrowser for help on using the repository browser.