source: code/Website/open-flash-chart/elements/axis/YAxisLabelsBase.as@ 7849

Last change on this file since 7849 was 7849, checked in by dennisw, 15 years ago
File size: 7.0 KB
Line 
1package elements.axis {
2 import flash.display.Sprite;
3 import elements.axis.YTextField;
4 import flash.text.TextFormat;
5 import org.flashdevelop.utils.FlashConnect;
6 import br.com.stimuli.string.printf;
7 import string.Utils;
8
9 public class YAxisLabelsBase extends Sprite {
10
11 private var steps:Number;
12 private var right:Boolean;
13 protected var style:Object;
14 public var i_need_labels:Boolean;
15 protected var lblText:String;
16 public var y_max:Number;
17
18 public function YAxisLabelsBase(json:Object, axis_name:String) {
19 var i:Number;
20 var s:String;
21 var values:Array;
22 var steps:Number;
23
24 // TODO: calculate Y max from the data
25 this.y_max = 10;
26
27 if( json[axis_name] )
28 {
29 //
30 // Old crufty JSON, refactor out at some point,
31 //
32 //
33 if( json[axis_name].labels is Array )
34 {
35 values = [];
36
37 // use passed in min if provided else zero
38 i = (json[axis_name] && json[axis_name].min) ? json[axis_name].min : 0;
39 for each( s in json[axis_name].labels )
40 {
41 values.push( { val:s, pos:i } );
42 i++;
43 }
44 //
45 // alter the MinMax object:
46 //
47 // use passed in max if provided else the number of values less 1
48 this.y_max = (json[axis_name] && json[axis_name].max) ? json[axis_name].max : values.length - 1;
49 this.i_need_labels = false;
50 }
51 }
52
53 //
54 // an object, that contains an array of objects:
55 //
56 if( json[axis_name] )
57 {
58 if ( json[axis_name].labels is Object )
59 {
60 if ( json[axis_name].labels.text is String )
61 this.lblText = json[axis_name].labels.text;
62
63 var visibleSteps:Number = 1;
64 if( json[axis_name].steps is Number )
65 visibleSteps = json[axis_name].steps;
66
67 if( json[axis_name].labels.steps is Number )
68 visibleSteps = json[axis_name].labels.steps;
69
70 if ( json[axis_name].labels.labels is Array )
71 {
72 values = [];
73 // use passed in min if provided else zero
74 var label_pos:Number = (json[axis_name] && json[axis_name].min) ? json[axis_name].min : 0;
75
76 for each( var obj:Object in json[axis_name].labels.labels )
77 {
78 if(obj is Number)
79 {
80 values.push( { val:lblText, pos:obj } );
81 //i = (obj > i) ? obj as Number : i;
82 }
83 else if(obj is String)
84 {
85 values.push( {
86 val: obj,
87 pos: label_pos,
88 visible: ((label_pos % visibleSteps) == 0)
89 } );
90 //i = (obj > i) ? obj as Number : i;
91 }
92 else if (obj.y is Number)
93 {
94 s = (obj.text is String) ? obj.text : lblText;
95 var style:Object = { val:s, pos:obj.y }
96 if (obj.colour != null)
97 style.colour = obj.colour;
98
99 if (obj.size != null)
100 style.size = obj.size;
101
102 if (obj.rotate != null)
103 style.rotate = obj.rotate;
104
105 values.push( style );
106 //i = (obj.y > i) ? obj.y : i;
107 }
108
109 label_pos++;
110 }
111 this.i_need_labels = false;
112 }
113 }
114 }
115
116 this.steps = steps;
117
118 var lblStyle:YLabelStyle = new YLabelStyle(json, name);
119 this.style = lblStyle.style;
120
121 //
122 // TODO: hack, if the user has not defined either left or right
123 // by default set left axis to show and right to hide.
124 //
125 if ( !json[axis_name] && axis_name!='y_axis' )
126 this.style.show_labels = false;
127 //
128 //
129
130 // Default to using "rotate" from the y_axis level
131 if ( json[axis_name] && json[axis_name].rotate ) {
132 this.style.rotate = json[axis_name].rotate;
133 }
134
135 // Next override with any values at the y_axis.labels level
136 if (( json[axis_name] != null ) &&
137 ( json[axis_name].labels != null ) ) {
138 object_helper.merge_2( json[axis_name].labels, this.style );
139 }
140
141 this.add_labels(values);
142 }
143
144 private function add_labels(values:Array): void {
145
146 // are the Y Labels visible?
147 if( !this.style.show_labels )
148 return;
149
150 // labels
151 var pos:Number = 0;
152
153 for each ( var v:Object in values )
154 {
155 var lblStyle:Object = { };
156 object_helper.merge_2( this.style, lblStyle );
157 object_helper.merge_2( v, lblStyle );
158
159 if ( lblStyle.visible )
160 {
161 var tmp:YTextField = this.make_label( lblStyle );
162 tmp.y_val = v.pos;
163 this.addChild(tmp);
164
165 pos++;
166 }
167 }
168 }
169
170 /**
171 * This is called from the init function, because it is only after the Sprite
172 * is added to the stagethat we know the size of the flash window and know
173 * how many ticks/labelswe auto generate
174 */
175 public function make_labels(min:Number, max:Number, steps:Number): void {
176
177 tr.aces('make_labels', this.i_need_labels, min, max, false, steps, this.lblText);
178 tr.aces(this.style.show_labels);
179
180 if ( !this.i_need_labels )
181 return;
182
183 this.i_need_labels = false;
184 this.make_labels_(min, max, false, steps, this.lblText);
185 }
186
187 //
188 // use Y Min, Y Max and Y Steps to create an array of
189 // Y labels:
190 //
191 protected function make_labels_(min:Number, max:Number, right:Boolean, steps:Number, lblText:String):void {
192 var values:Array = [];
193
194 var min_:Number = Math.min( min, max );
195 var max_:Number = Math.max( min, max );
196
197 // hack: hack: http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_13989&sliceId=1
198 max_ += 0.000004;
199
200 var eek:Number = 0;
201 for( var i:Number = min_; i <= max_; i+=steps ) {
202 values.push( { val:lblText, pos:i } );
203
204 // make sure we don't generate too many labels:
205 if( eek++ > 250 ) break;
206 }
207
208 this.add_labels(values);
209 }
210
211 private function make_label( lblStyle:Object ):YTextField
212 {
213
214 lblStyle.colour = string.Utils.get_colour(lblStyle.colour);
215
216 var tf:YTextField = new YTextField();
217 //tf.border = true;
218 tf.text = this.replace_magic_values(lblStyle.val, lblStyle.pos);
219 var fmt:TextFormat = new TextFormat();
220 fmt.color = lblStyle.colour;
221 fmt.font = lblStyle.rotate == "vertical" ? "spArial" : "Verdana";
222 fmt.size = lblStyle.size;
223 fmt.align = "right";
224 tf.setTextFormat(fmt);
225 tf.autoSize = "right";
226 if (lblStyle.rotate == "vertical")
227 {
228 tf.rotation = 270;
229 tf.embedFonts = true;
230 tf.antiAliasType = flash.text.AntiAliasType.ADVANCED;
231 }
232 return tf;
233 }
234
235 // move y axis labels to the correct x pos
236 public function resize( left:Number, sc:ScreenCoords ):void
237 {
238 }
239
240
241 public function get_width():Number{
242 var max:Number = 0;
243 for( var i:Number=0; i<this.numChildren; i++ )
244 {
245 var tf:YTextField = this.getChildAt(i) as YTextField;
246 max = Math.max( max, tf.width );
247 }
248 return max;
249 }
250
251 public function die(): void {
252
253 while ( this.numChildren > 0 )
254 this.removeChildAt(0);
255 }
256
257 private function replace_magic_values(labelText:String, yVal:Number):String {
258 labelText = labelText.replace('#val#', NumberUtils.formatNumber(yVal));
259 return labelText;
260 }
261 }
262}
Note: See TracBrowser for help on using the repository browser.