[moodle] / contrib / plugins / grade / report / visual / flare_visualization / flare_visualization.as Repository:

Annotation of /contrib/plugins/grade/report/visual/flare_visualization/flare_visualization.as

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (view) (download)

1 : dservos 1.2 ///////////////////////////////////////////////////////////////////////////
2 :     // //
3 :     // NOTICE OF COPYRIGHT //
4 :     // //
5 :     // Moodle - Modular Object-Oriented Dynamic Learning Environment //
6 :     // http://moodle.org //
7 :     // //
8 :     // Copyright (C) 1999 onwards Martin Dougiamas http://moodle.com //
9 :     // //
10 :     // This program is free software; you can redistribute it and/or modify //
11 :     // it under the terms of the GNU General Public License as published by //
12 :     // the Free Software Foundation; either version 2 of the License, or //
13 :     // (at your option) any later version. //
14 :     // //
15 :     // This program is distributed in the hope that it will be useful, //
16 :     // but WITHOUT ANY WARRANTY; without even the implied warranty of //
17 :     // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
18 :     // GNU General Public License for more details: //
19 :     // //
20 :     // http://www.gnu.org/copyleft/gpl.html //
21 :     // //
22 :     ///////////////////////////////////////////////////////////////////////////
23 :    
24 :     /**
25 :     * This is the flex with flare based visualizer for the Moodle 2.x visual
26 :     * grade book plug-in. This should load the grade book data for a given
27 :     * visualization from the report/visual plug-in based on a set of flashvars
28 :     * passed to it from Moodle and display a visual repersenation.
29 :     */
30 : dservos 1.1 package {
31 : dservos 1.2 //Flare imports
32 : dservos 1.1 import flare.animate.Transitioner;
33 :     import flare.data.DataSet;
34 :     import flare.data.DataSource;
35 :     import flare.display.TextSprite;
36 :     import flare.vis.Visualization;
37 :     import flare.vis.controls.HoverControl;
38 :     import flare.vis.data.Data;
39 :     import flare.vis.data.DataSprite;
40 : dservos 1.4 import flare.vis.data.EdgeSprite;
41 :     import flare.vis.data.NodeSprite;
42 : dservos 1.1 import flare.vis.legend.Legend;
43 : dservos 1.2 import flare.vis.legend.LegendItem;
44 : dservos 1.1 import flare.vis.operator.encoder.ColorEncoder;
45 : dservos 1.3 import flare.vis.operator.encoder.Encoder;
46 : dservos 1.1 import flare.vis.operator.encoder.ShapeEncoder;
47 : dservos 1.3 import flare.vis.operator.encoder.SizeEncoder;
48 : dservos 1.1 import flare.vis.operator.layout.AxisLayout;
49 : dservos 1.3 import flare.vis.operator.layout.CircleLayout;
50 :     import flare.vis.operator.layout.DendrogramLayout;
51 :     import flare.vis.operator.layout.ForceDirectedLayout;
52 :     import flare.vis.operator.layout.IndentedTreeLayout;
53 :     import flare.vis.operator.layout.Layout;
54 :     import flare.vis.operator.layout.NodeLinkTreeLayout;
55 :     import flare.vis.operator.layout.PieLayout;
56 :     import flare.vis.operator.layout.RadialTreeLayout;
57 :     import flare.vis.operator.layout.RandomLayout;
58 :     import flare.vis.operator.layout.StackedAreaLayout;
59 :     import flare.vis.operator.layout.TreeMapLayout;
60 :     import flare.vis.scale.Scale;
61 : dservos 1.1 import flare.vis.util.Filters;
62 : dservos 1.4 import flare.vis.util.graphics.Shapes;
63 : dservos 1.1
64 :     import flash.display.DisplayObject;
65 :     import flash.display.DisplayObjectContainer;
66 :     import flash.display.Sprite;
67 : dservos 1.3 import flash.errors.IOError;
68 : dservos 1.1 import flash.events.Event;
69 : dservos 1.3 import flash.events.IOErrorEvent;
70 : dservos 1.1 import flash.events.MouseEvent;
71 :     import flash.filters.GlowFilter;
72 :     import flash.geom.Rectangle;
73 :     import flash.net.URLLoader;
74 : dservos 1.3 import flash.net.URLRequest;
75 :     import flash.text.TextField;
76 : dservos 1.1 import flash.text.TextFormat;
77 : dservos 1.4 import flash.utils.Dictionary;
78 : dservos 1.1
79 :     [SWF(width="800", height="600", backgroundColor="#ffffff", frameRate="30")]
80 : dservos 1.2 /**
81 :     * Main class for handling grade book data and greatating a visualization.
82 :     */
83 : dservos 1.1 public class flare_visualization extends Sprite
84 :     {
85 : dservos 1.2 /**
86 :     * The visualization object to be used in creating the visualization.
87 :     */
88 : dservos 1.1 private var vis:Visualization;
89 : dservos 1.2
90 :     /**
91 :     * A refernce to the currently displayed dialog box. If null no dialog
92 :     * box is currently being displayed.
93 :     */
94 : dservos 1.1 private var lastBox:Sprite = null;
95 : dservos 1.2
96 :     /**
97 :     * A refernce to the data sprite witch contains the data for witch the
98 :     * currently displayed dialog box is based on and a child of.
99 :     */
100 : dservos 1.1 private var lastBoxData:DataSprite = null;
101 : dservos 1.2
102 :     /**
103 :     * A container for the legends witch will be displayed on the righ hand
104 :     * side.
105 :     */
106 :     private var legends:Sprite;
107 :    
108 : dservos 1.4 private var sideBar:Sprite;
109 :    
110 :     private var layout:Layout;
111 :    
112 :     private var encoders:Array;
113 :    
114 :     private var selectors:Sprite;
115 :    
116 :     private var controls:Sprite;
117 :    
118 : dservos 1.2 /**
119 :     * The hover control for the dialog box.
120 :     */
121 :     private var boxhc:HoverControl = new HoverControl();
122 :    
123 : dservos 1.3 private var settings:XML = new XML();
124 :    
125 :     private var dataURL:String;
126 :    
127 :     private var settingsURL:String;
128 :    
129 :     private var loadingMessage:TextSprite;
130 :    
131 : dservos 1.4 private var legendNodes:Dictionary;
132 :     private var legendEdges:Dictionary;
133 :    
134 :     private var invertTransitioner:Transitioner;
135 :     private var legendItemTransitioner:Transitioner;
136 :    
137 : dservos 1.5 private var printVersion:Boolean;
138 : dservos 1.4
139 :     private var nodeSize:int = 1;
140 :    
141 :     private var errors:Sprite = new Sprite();
142 :    
143 :     private var debug:Boolean = false;
144 :    
145 : dservos 1.5 private var debug_sessionid:String = "ad896bf3c1af448c05f292e7b14433e1";
146 :     private var debug_sessiontest:String = "nepQJfZ9pN";
147 : dservos 1.4 private var debug_sessioncookie:String = "";
148 : dservos 1.5 private var debug_visid:String = "grades_vs_items";
149 : dservos 1.4 private var debug_wwwroot:String = "http://localhost/moodle";
150 :     private var debug_courseid:String = "3";
151 :    
152 :    
153 : dservos 1.2 /**
154 :     * The constucter for the flare_visualization class.
155 :     * Calls on harvest_data and sets up the varibles from the flashvars.
156 :     */
157 : dservos 1.1 public function flare_visualization()
158 :     {
159 : dservos 1.3 loadingMessage = new TextSprite("Loading....", new TextFormat("monospace", 20, 0x0000FF, true));
160 :     addChild(loadingMessage);
161 : dservos 1.4 addChild(errors);
162 : dservos 1.3
163 : dservos 1.2 // Call harvest_data, loading needed visualization data from moodle.
164 :     // The Moodle wwwroot, course id, users sessionid, users session cookie
165 :     // and session test data are needed to get the data from moodle are
166 :     // loaded threw flashvars.
167 : dservos 1.3 loaderInfo.addEventListener(Event.COMPLETE, function(evt:Event):void {
168 : dservos 1.4 var wwwroot:String = loaderInfo.parameters['wwwroot'];
169 :     var courseID:String = loaderInfo.parameters['courseid'];
170 :     var sessioncookie:String = loaderInfo.parameters['sessioncookie'];
171 :     var sessionid:String = loaderInfo.parameters['sessionid'];
172 :     var sessiontest:String = loaderInfo.parameters['sessiontest'];
173 :     var visid:String = loaderInfo.parameters['visid'];
174 : dservos 1.5 printVersion = booleanify(loaderInfo.parameters['printerversion']);
175 : dservos 1.4
176 :     if(debug) {
177 :     trace("Debug mode on.");
178 :     wwwroot = debug_wwwroot;
179 :     courseID = debug_courseid;
180 :     sessioncookie = debug_sessioncookie;
181 :     sessionid = debug_sessionid;
182 :     sessiontest = debug_sessiontest;
183 :     visid = debug_visid;
184 :     }
185 :    
186 :     dataURL = wwwroot + '/grade/report/visual/data.php?id=' + escape(courseID) + '&sessioncookie=' + escape(sessioncookie) + '&sessionid=' + escape(sessionid) + '&sessiontest=' + escape(sessiontest) + '&visid=' + escape(visid);
187 :     settingsURL = wwwroot + '/grade/report/visual/visual_settings.php?id=' + escape(courseID) + '&sessioncookie=' + escape(sessioncookie) + '&sessionid=' + escape(sessionid) + '&sessiontest=' + escape(sessiontest) + '&visid=' + escape(visid);
188 :    
189 : dservos 1.3 harvest_data();
190 :     });
191 : dservos 1.1 }
192 :    
193 : dservos 1.2 /**
194 :     * Harvests the data from Moodle and calls on buildVis to build the
195 :     * visualization once the data has been loaded.
196 :     * TODO: Add a loading bar and more feed back about the loading process.
197 :     * @param url The url from witch to load the tab formated data for the visualization.
198 :     */
199 : dservos 1.3 public function harvest_data():void
200 : dservos 1.1 {
201 : dservos 1.3 loadingMessage.text ="Loading Settings....";
202 :     loadingMessage.x = loaderInfo.width/2 - loadingMessage.width/2;
203 :     loadingMessage.y = loaderInfo.height/2 - loadingMessage.height/2;
204 :    
205 :    
206 :     try{
207 :     var ds:DataSource = new DataSource(dataURL, "tab");
208 :     var settingsRequest:URLRequest = new URLRequest(settingsURL);
209 :     var settingsLoader:URLLoader = new URLLoader(settingsRequest);
210 :    
211 :     settingsLoader.addEventListener(IOErrorEvent.IO_ERROR, function(evt:IOErrorEvent):void {
212 :     error("Loading", evt.text);
213 :     });
214 :    
215 :     settingsLoader.addEventListener(Event.COMPLETE, function(evt:Event):void {
216 :     try{
217 :     settings = XML(settingsLoader.data);
218 :     loadingMessage.text = "Loading Data....";
219 : dservos 1.4
220 : dservos 1.5 if(isnull(settings) || settings.length() < 1 || isnull(settings.layout)) {
221 :     error("Loading", "Failed to load settings.");
222 :     return;
223 :     }
224 :    
225 : dservos 1.3 var dataLoader:URLLoader = ds.load();
226 :    
227 :     dataLoader.addEventListener(IOErrorEvent.IO_ERROR, function(evt:IOErrorEvent):void {
228 :     error("Loading", evt.text);
229 :     });
230 :    
231 :     dataLoader.addEventListener(Event.COMPLETE, function(evt:Event):void {
232 : dservos 1.4 removeChild(loadingMessage);
233 : dservos 1.3 var data:DataSet = dataLoader.data as DataSet;
234 :     buildVis(Data.fromDataSet(data));
235 :     });
236 :     } catch(e:Error) {
237 :     error("", e.message);
238 :     }
239 :     });
240 :     } catch(e:IOError) {
241 :     error("IO", e.message);
242 :     } catch(e:Error) {
243 :     error("", e.message)
244 :     }
245 :     }
246 :    
247 : dservos 1.4 public function updateVis(data:Data):void {
248 :     var t:Transitioner = new Transitioner(2);
249 :     makeEdges(data);
250 :     vis.data = data;
251 :     setUpEncoders();
252 :     setDataProperties();
253 :     setUpLegends();
254 :     setUpLayout();
255 :     //for(var i:int = 0; i < legends.numChildren; i++){
256 :     //Legend(legends.getChildAt(i)).update(t);
257 :     //}
258 :     t.$(selectors).y = legends.height;
259 :     t.$(controls).y = legends.height + selectors.height + 10;
260 :     vis.update(t).play();
261 :     }
262 :    
263 :     public function reharvest_data(url:String):void {
264 :     loadingMessage.text ="Loading Data....";
265 :     addChild(loadingMessage);
266 :    
267 :     try{
268 :     var ds:DataSource = new DataSource(url, "tab");
269 :     var dataLoader:URLLoader = ds.load();
270 :    
271 :     dataLoader.addEventListener(IOErrorEvent.IO_ERROR, function(evt:IOErrorEvent):void {
272 :     error("Loading", evt.text);
273 :     });
274 :    
275 :     dataLoader.addEventListener(Event.COMPLETE, function(evt:Event):void {
276 :     removeChild(loadingMessage);
277 :     var data:DataSet = dataLoader.data as DataSet;
278 :     updateVis(Data.fromDataSet(data));
279 :     });
280 :     }catch(e:IOError) {
281 :     error("IO", e.message);
282 :     } catch(e:Error) {
283 :     error("", e.message)
284 :     }
285 :     }
286 :    
287 : dservos 1.3 private function error(type:String = "", text:String = ""):void {
288 :     trace(type + " Error: " + text);
289 :    
290 :     var textfield:TextField = new TextSprite(type + " Error: " + text, new TextFormat("monospace", 12, 0xFF0000, true)).textField;
291 :     textfield.wordWrap = true;
292 : dservos 1.4 textfield.x = 0;
293 :     textfield.y = errors.height;
294 : dservos 1.3
295 : dservos 1.4 errors.addChild(textfield);
296 : dservos 1.1 }
297 :    
298 : dservos 1.2 /**
299 :     * Find the max width between a container and all of it's decendence
300 :     * This dose not find the width of a container but the greatest width
301 :     * of an invdual component in it's decenedences.
302 :     * @param d The display container to find the max width of.
303 :     * @return the max width value of the display objects.
304 :     */
305 : dservos 1.1 private function getMaxWidth(d:DisplayObjectContainer):int {
306 :     var max:int = d.width;
307 :    
308 : dservos 1.2 for(var k:uint = 0; k < d.numChildren; k++ ) {
309 : dservos 1.1 var width:int = 0;
310 :    
311 :     if(d.getChildAt(k) is DisplayObjectContainer) {
312 :     width = getMaxWidth(DisplayObjectContainer(d.getChildAt(k)));
313 :     } else {
314 :     width = d.getChildAt(k).width;
315 :     }
316 :    
317 :     if(width > max) {
318 :     max = width;
319 :     }
320 :     }
321 :    
322 :     return max;
323 :     }
324 :    
325 : dservos 1.2 /**
326 :     * Simple function to retrun the greatest of two ints.
327 :     * @param num1 the first number to test
328 :     * @param num2 the second number to test
329 :     * @return the largest value between num1 and num2.
330 :     */
331 : dservos 1.1 private function max(num1:int, num2:int):int {
332 :     if(num1 > num2) {
333 :     return num1;
334 :     } else {
335 :     return num2;
336 :     }
337 :     }
338 :    
339 : dservos 1.2 /**
340 :     * Find the max height between a container and all of it's decendence
341 :     * This dose not find the width of a container but the greatest height
342 :     * of an invdual component in it's decenedences.
343 :     * @param d The display container to find the max height of.
344 :     * @return the max height value of the display objects.
345 :     */
346 : dservos 1.1 private function getMaxHeight(d:DisplayObjectContainer):int {
347 :     var max:int = d.height;
348 :    
349 : dservos 1.2 for(var k:uint = 0; k < d.numChildren; k++ ) {
350 : dservos 1.1 var height:int = 0;
351 :    
352 :     if(d.getChildAt(k) is DisplayObjectContainer) {
353 :     height = getMaxHeight(DisplayObjectContainer(d.getChildAt(k)));
354 :     } else {
355 :     height = d.getChildAt(k).height;
356 :     }
357 :    
358 :     if(height > max) {
359 :     max = height;
360 :     }
361 :     }
362 :    
363 :     return max;
364 :     }
365 :    
366 : dservos 1.3 private function nullify(o:*):* {
367 :     if(isnull(o)) {
368 :     return null;
369 :     } else {
370 :     return o;
371 :     }
372 :     }
373 :    
374 :     private function isnull(o:*):Boolean {
375 :     if(o == null || o.length == 0 || String(o).length == 0) {
376 :     return true;
377 :     } else {
378 :     return false;
379 :     }
380 :     }
381 :    
382 :     private function booleanify(o:*):* {
383 :     var ob:Object = nullify(o);
384 :    
385 :     if(String(ob).toLocaleLowerCase() == "false") {
386 :     return false;
387 :     } else if (String(ob).toLocaleLowerCase() == "true") {
388 :     return true;
389 :     }
390 :    
391 :     return ob;
392 :     }
393 :    
394 :     private function passSettings(theClass:Class, XMLSettings:XMLList, ... args):* {
395 :     var params:Array = new Array();
396 : dservos 1.4 var cleanParam:*;
397 : dservos 1.3
398 :     for each(var arg:* in args) {
399 :     params.push(arg);
400 :     }
401 :    
402 :     for each(var param:* in XMLSettings) {
403 : dservos 1.4 cleanParam = booleanify(param);
404 : dservos 1.3 if(cleanParam != null) {
405 :     params.push(cleanParam);
406 :     }
407 :     }
408 :    
409 :     switch(params.length) {
410 :     case 1: return new theClass(params[0]);
411 :     case 2: return new theClass(params[0], params[1]);
412 :     case 3: return new theClass(params[0], params[1], params[2]);
413 :     case 4: return new theClass(params[0], params[1], params[2], params[3]);
414 :     case 5: return new theClass(params[0], params[1], params[2], params[3], params[4]);
415 :     case 6: return new theClass(params[0], params[1], params[2], params[3], params[4], params[5]);
416 :     case 7: return new theClass(params[0], params[1], params[2], params[3], params[4], params[5], params[6]);
417 :     case 8: return new theClass(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7]);
418 :     case 9: return new theClass(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7], params[8]);
419 :     case 10: return new theClass(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7], params[8], params[9]);
420 :     default: return new theClass();
421 :     }
422 :     }
423 :    
424 :     private function toStringArray(xmllist:XMLList):Object {
425 :     if(xmllist.length() > 1) {
426 :     var array:Array = new Array;
427 :    
428 :     for each(var element:XML in xmllist) {
429 :     array.push(String(element));
430 :     }
431 :    
432 :     return array;
433 :     } else {
434 :     return String(xmllist);
435 :     }
436 :     }
437 :    
438 :     private function toNumberArray(xmllist:XMLList):Object {
439 :     if(xmllist.length() > 1) {
440 :     var array:Array = new Array;
441 :    
442 :     for each(var element:XML in xmllist) {
443 :     array.push(Number(element));
444 :     }
445 :    
446 :     return array;
447 :     } else {
448 :     return Number(xmllist);
449 :     }
450 :     }
451 : dservos 1.4
452 :     private function makeEdges(data:Data):void {
453 :     if(!isnull(settings.edge)) {
454 : dservos 1.3 for each(var edge:XML in settings.edge) {
455 :     data.createEdges(toStringArray(edge.sortby), toStringArray(edge.groupby));
456 :     }
457 :     }
458 : dservos 1.4 }
459 :    
460 :     private function setDataProperties():void {
461 :     vis.data.nodes.visit(function(d:DataSprite):void {
462 :     if(!isnull(settings.style.nodeshape)) {
463 :     d.shape = settings.style.nodeshape;
464 :     }
465 :    
466 :     if(d.shape == Shapes.HORIZONTAL_BAR || d.shape == Shapes.VERTICAL_BAR) {
467 :     nodeSize = 2;
468 :     }
469 :    
470 :     d.size = nodeSize;
471 :     d.fillColor = 0x018888ff;
472 :     d.fillAlpha = 0.2;
473 :     d.addEventListener(MouseEvent.CLICK, mouseClicked);
474 :     d.lineWidth = 2;
475 :     });
476 :    
477 :     vis.data.edges.visit(function(d:DataSprite):void {
478 :     if(!isnull(settings.style.edgeshape)) {
479 :     d.shape = settings.style.edgeshape;
480 :     }
481 :     d.lineWidth = 2;
482 :     d.fillAlpha = 1;
483 :     });
484 :     }
485 :    
486 :     private function setUpLayout():void {
487 :     vis.operators.remove(layout);
488 :     layout = null;
489 :    
490 : dservos 1.5 if(isnull(settings.layout.type)) {
491 :     error("Bad Settings", "Missing layout type value.");
492 :     return;
493 :     }
494 :    
495 : dservos 1.4 // Set up the layout
496 : dservos 1.3 switch(int(settings.layout.type)) {
497 : dservos 1.5 case 1:
498 :     if(!isnull(settings.layout.xaxis.field) && !isnull(settings.layout.yaxis.field)) {
499 :     layout = passSettings(AxisLayout, settings.layout.setting, settings.layout.xaxis.field, settings.layout.yaxis.field);
500 :     } else {
501 :     error("Bad Settings", "Missing x or y axis feild for AxisLayout");
502 :     return;
503 :     }
504 : dservos 1.3 break;
505 :     case 2: layout = passSettings(CircleLayout, settings.layout.setting);
506 :     break;
507 :     case 3: layout = passSettings(DendrogramLayout, settings.layout.setting);
508 :     break;
509 :     case 4: layout = passSettings(ForceDirectedLayout, settings.layout.setting);
510 :     break;
511 :     case 5: layout = passSettings(IndentedTreeLayout, settings.layout.setting);
512 :     break;
513 :     case 6: layout = passSettings(NodeLinkTreeLayout, settings.layout.setting);
514 :     break;
515 :     case 7: layout = passSettings(PieLayout, settings.layout.setting);
516 :     break;
517 :     case 8: layout = passSettings(RadialTreeLayout, settings.layout.setting);
518 :     break;
519 :     case 9: layout = new RandomLayout();
520 :     break;
521 :     case 10: layout = passSettings(StackedAreaLayout, settings.layout.setting);
522 : dservos 1.5 break;
523 : dservos 1.3 case 11: layout = new TreeMapLayout();
524 : dservos 1.5 break;
525 :     default:
526 :     if(!isnull(settings.layout.xaxis.field) && !isnull(settings.layout.yaxis.field)) {
527 :     layout = passSettings(AxisLayout, settings.layout.setting, settings.layout.xaxis.field, settings.layout.yaxis.field);
528 :     } else {
529 :     error("Bad Settings", "Missing x or y axis feild for AxisLayout");
530 :     return;
531 :     }
532 : dservos 1.3 break;
533 :     }
534 : dservos 1.4
535 : dservos 1.3 vis.operators.add(layout);
536 : dservos 1.4 }
537 :    
538 :     private function setUpEncoders():void {
539 :     var e:Encoder;
540 :    
541 :     for each(var enc:Encoder in encoders) {
542 :     vis.operators.remove(enc);
543 :     }
544 :    
545 :     // Set up the encoders
546 :     encoders = new Array();
547 : dservos 1.3
548 :     for each(var encoder:XML in settings.encoder) {
549 :     switch(int(encoder.type)) {
550 :     case 1: e = passSettings(ColorEncoder, encoder.setting, encoder.datafield);
551 :     break;
552 :     case 2: e = passSettings(ShapeEncoder, encoder.setting, encoder.datafield);
553 :     break;
554 :     case 3: e = passSettings(SizeEncoder, encoder.setting, encoder.datafield);
555 :     break;
556 :     default: e = passSettings(ColorEncoder, encoder.setting, encoder.datafield);
557 :     break;
558 :     }
559 :    
560 :     encoders[encoder.id] = e;
561 :     vis.operators.add(e);
562 :     }
563 : dservos 1.4 }
564 :    
565 :     private function setUpLegends():void {
566 :     var dataName:String;
567 :    
568 :     for(var i:int = 0; i < legends.numChildren; i++){
569 :     for(var k:int = 0; k < Legend(legends.getChildAt(i)).items.numChildren; k++) {
570 :     Legend(legends.getChildAt(i)).items.removeChildAt(k);
571 :     }
572 :     legends.removeChildAt(i);
573 :     }
574 :    
575 :     legendNodes = new Dictionary();
576 :     legendEdges = new Dictionary();
577 :    
578 :     if(!isnull(settings.legend)) {
579 :     var nextLegendY:int = 0;
580 :     for each(var legend:XML in settings.legend) {
581 :     var en:Encoder = encoders[legend.encoderid];
582 :     var l:Legend;
583 :    
584 :     switch(int(settings.encoder.(id == int(legend.encoderid)).type)) {
585 :     case 1: l = new Legend(en.source, en.scale, ColorEncoder(en).colors);
586 :     break;
587 :     case 2: l = new Legend(en.source, en.scale, null, ShapeEncoder(en).shapes);
588 :     break;
589 :     case 3: l = new Legend(en.source, en.scale, null, null, SizeEncoder(en).sizes);
590 :     break;
591 :     default: l = new Legend(en.source, en.scale, ColorEncoder(en).colors);
592 :     break;
593 :     }
594 :    
595 :     l.x = 0;
596 :     l.y = nextLegendY;
597 :     nextLegendY += l.height;
598 :    
599 :     //l.items.addEventListener(MouseEvent.CLICK, legendClick);
600 :    
601 :     var lhc:HoverControl = new HoverControl(l.items);
602 :     lhc.onRollOver = legendRollOver;
603 :     lhc.onRollOut = legendRollOut;
604 :    
605 :     legends.addChild(l);
606 :    
607 :     dataName = l.dataField.substr(l.dataField.lastIndexOf('.') + 1);
608 :     for(var j:int = 0; j < l.items.numChildren; j++) {
609 : dservos 1.5 LegendItem(l.items.getChildAt(j)).addEventListener(MouseEvent.CLICK, legendClick);
610 :     //LegendItem(l.items.getChildAt(j)).label.textMode = TextSprite.DEVICE;
611 :     //LegendItem(l.items.getChildAt(j)).label.textField.y -= 8;
612 : dservos 1.4
613 :     legendNodes[LegendItem(l.items.getChildAt(j))] = new Array();
614 :     legendEdges[LegendItem(l.items.getChildAt(j))] = new Array();
615 :    
616 :     vis.data.nodes.visit(function(n:NodeSprite):void {
617 :     if(n.data.hasOwnProperty(dataName) && LegendItem(l.items.getChildAt(j)).value == n.data[dataName]) {
618 :     (legendNodes[LegendItem(l.items.getChildAt(j))] as Array).push(n);
619 :     }
620 :     });
621 :    
622 :     vis.data.edges.visit(function(e:EdgeSprite):void {
623 :     if(e.data.hasOwnProperty(dataName) && LegendItem(l.items.getChildAt(j)).value == e.data[dataName]) {
624 :     (legendEdges[LegendItem(l.items.getChildAt(j))] as Array).push(e);
625 :     }
626 :     });
627 :    
628 :     if(XMLList(legend.show).length() > 0 && !XMLList(legend.show).contains(LegendItem(l.items.getChildAt(j)).value)) {
629 :     LegendItem(l.items.getChildAt(j)).alpha = 0.4;
630 :     }
631 :     }
632 :     }
633 :    
634 :     removeLegenedItemsNodes();
635 :     }
636 :     }
637 :    
638 :     /**
639 :     * Builds the visualization based on the loaded data.
640 :     * Also sets up the legends, buttons and controls.
641 :     * @param data The data that was loaded in from moodle.
642 :     */
643 :     private function buildVis(data:Data):void
644 :     {
645 :     makeEdges(data);
646 :    
647 :     vis = new Visualization(data);
648 :     legends = new Sprite();
649 :     sideBar = new Sprite();
650 :    
651 :     // Set the functions to be called when a dialog box is hovered over.
652 :     boxhc.onRollOver = boxRollOver;
653 :     boxhc.onRollOut = boxRollOut;
654 : dservos 1.1
655 : dservos 1.4 // Set up the properitys of the data sprites and add a eventlistener to check for
656 :     // clicks on them.
657 :     setDataProperties();
658 :    
659 :     setUpEncoders();
660 :    
661 :     // Set up the legends.
662 :     setUpLegends();
663 :    
664 :     setUpLayout();
665 : dservos 1.1
666 : dservos 1.3 if(!isnull(settings.layout.yaxis.labelformat)) {
667 :     vis.xyAxes.yAxis.labelFormat = settings.layout.yaxis.labelformat;
668 :     } else {
669 :     vis.xyAxes.yAxis.labelFormat = "0";
670 :     }
671 :    
672 :     if(!isnull(settings.layout.xaxis.labelformat)) {
673 :     vis.xyAxes.xAxis.labelFormat = settings.layout.xaxis.labelformat;
674 :     } else {
675 :     vis.xyAxes.xAxis.labelFormat = "0";
676 :     }
677 :    
678 :     if(!isnull(settings.layout.xaxis.min)) {
679 :     vis.xyAxes.xAxis.axisScale.min = settings.layout.xaxis.min;
680 :     vis.xyAxes.xAxis.axisScale.flush = true;
681 :     }
682 :    
683 :     if(!isnull(settings.layout.xaxis.max)) {
684 :     vis.xyAxes.xAxis.axisScale.max = settings.layout.xaxis.max;
685 :     vis.xyAxes.xAxis.axisScale.flush = true;
686 :     }
687 :    
688 :     if(!isnull(settings.layout.yaxis.min)) {
689 :     vis.xyAxes.yAxis.axisScale.min = settings.layout.yaxis.min;
690 :     }
691 :    
692 :     if(!isnull(settings.layout.yaxis.max)) {
693 :     vis.xyAxes.yAxis.axisScale.max = settings.layout.yaxis.max;
694 :     }
695 :    
696 :     if(!isnull(settings.layout.yaxis.yoffset)) {
697 :     vis.xyAxes.yAxis.labelOffsetY = settings.layout.yaxis.yoffset;
698 :     }
699 :    
700 :     if(!isnull(settings.layout.yaxis.xoffset)) {
701 :     vis.xyAxes.yAxis.labelOffsetX = settings.layout.yaxis.xoffset;
702 :     }
703 :    
704 :     if(!isnull(settings.layout.xaxis.yoffset)) {
705 :     vis.xyAxes.xAxis.labelOffsetY = settings.layout.xaxis.yoffset;
706 :     }
707 :    
708 :     if(!isnull(settings.layout.xaxis.xoffset)) {
709 :     vis.xyAxes.xAxis.labelOffsetX = settings.layout.xaxis.xoffset;
710 :     }
711 :    
712 : dservos 1.4 // Set up the layout of the axes.
713 :     vis.xyAxes.xAxis.horizontalAnchor = TextSprite.LEFT;
714 :     vis.xyAxes.xAxis.verticalAnchor = TextSprite.MIDDLE;
715 :     vis.xyAxes.xAxis.labelAngle = Math.PI / 2;
716 :     vis.xyAxes.xAxis.fixLabelOverlap = false;
717 :     vis.xyAxes.yAxis.fixLabelOverlap = false;
718 : dservos 1.5 //vis.xyAxes.yAxis.labelTextMode = TextSprite.DEVICE;
719 : dservos 1.4
720 :    
721 :     // Update the visualization so the widths and other values are correct.
722 : dservos 1.1 vis.update();
723 :    
724 : dservos 1.2 // Initalize the X and Y axis labels and the visualizations title.
725 : dservos 1.3 var labelX:TextSprite = new TextSprite(settings.labels.xaxis, new TextFormat(settings.style.text.font, settings.style.text.size));
726 :     var labelY:TextSprite = new TextSprite(settings.labels.yaxis, new TextFormat(settings.style.text.font, settings.style.text.size));
727 :     var title:TextSprite = new TextSprite(settings.labels.title, new TextFormat(settings.style.text.font, int(settings.style.text.size) + 5));
728 : dservos 1.1
729 : dservos 1.2 // Find the largest width out of the X axis labels so it can used for positing sprites.
730 :     var xLabelsHeight:int = getMaxHeight(vis.xyAxes.xAxis.labels);
731 :     var yLabelsWidth:int = getMaxWidth(vis.xyAxes.yAxis.labels);
732 :    
733 :     // Position the visualization.
734 : dservos 1.1 vis.y = title.height + 10;
735 : dservos 1.2 vis.x = labelY.height + -vis.xyAxes.yAxis.labelOffsetX + yLabelsWidth;
736 : dservos 1.1
737 : dservos 1.4
738 :    
739 :     legendItemTransitioner = new Transitioner(0.5);
740 :     sideBar.addChild(legends);
741 :    
742 :     selectors = new Sprite();
743 :     if(!isnull(settings.selector)) {
744 :     for each(var selector:XML in settings.selector) {
745 :     var selectorSprite:Selector = new Selector(selector.param, selector.option, selectorClick, selector.active, legends.width);
746 :     selectorSprite.x = 0;
747 :     selectorSprite.y = selectors.height;
748 :     selectors.addChild(selectorSprite);
749 :     }
750 : dservos 1.3 }
751 : dservos 1.4 sideBar.addChild(selectors);
752 : dservos 1.3
753 : dservos 1.4 //vis.update();
754 :    
755 : dservos 1.2 // Set the bounds of the visualization based on the hieght and width of the flash application,
756 :     // and the other components so the visualization is takes up the unused space.
757 : dservos 1.4 vis.bounds = new Rectangle(0, 0, loaderInfo.width - (sideBar.width + 15 + vis.x), loaderInfo.height - (vis.y + xLabelsHeight + labelX.height + vis.xyAxes.xAxis.labelOffsetY));
758 : dservos 1.2
759 :     // Add the visualization to the main sprite.
760 : dservos 1.1 addChild(vis);
761 :    
762 : dservos 1.2 // Position the legends.
763 : dservos 1.4 //legends.x = vis.bounds.width + 10;
764 :     legends.x = 0;
765 :     legends.y = 0;
766 :    
767 :     sideBar.x = vis.bounds.width + 10;
768 :     sideBar.y = 0;
769 : dservos 1.2
770 :     // Position and add the labels and title to the axes.
771 : dservos 1.1 labelX.x = vis.bounds.width/2 - labelX.width/2;
772 :     labelX.y = vis.bounds.height + vis.xyAxes.xAxis.labelOffsetY + xLabelsHeight;
773 :     vis.xyAxes.xAxis.addChild(labelX);
774 :    
775 : dservos 1.3 labelY.rotation = -90;
776 : dservos 1.1 labelY.x = -vis.x;
777 : dservos 1.3 labelY.y = (vis.bounds.height/2) + (labelY.height/2);
778 : dservos 1.1 vis.xyAxes.yAxis.addChild(labelY);
779 :    
780 :     title.x = vis.bounds.width/2 - title.width/2;
781 :     title.y = -vis.y;
782 :     vis.xyAxes.addChild(title);
783 :    
784 : dservos 1.2 // Add the legeneds container to the visualization.
785 : dservos 1.4 //vis.addChild(legends);
786 :     vis.addChild(sideBar);
787 :    
788 :     selectors.x = 0;
789 :     selectors.y = legends.y + legends.height;
790 :     //vis.addChild(selectors);
791 : dservos 1.1
792 : dservos 1.2 // Set up the hovercontrol for the marks on the chart
793 : dservos 1.1 var hc:HoverControl = new HoverControl(vis, Filters.isDataSprite);
794 :     hc.onRollOver = rollOver;
795 :     hc.onRollOut = rollOut;
796 :    
797 : dservos 1.2 // Set up the buttons and a container for them.
798 : dservos 1.4 controls = new Sprite();
799 : dservos 1.3 var bInvert:Button = new Button(settings.lang.invertaxes, settings.style.button);
800 :     var bHideAxis:Button = new Button(settings.lang.hide + " " + settings.lang.axes, settings.style.button);
801 :     var bHideXLabel:Button = new Button(settings.lang.hide + " " + settings.lang.xlabels, settings.style.button);
802 :     var bHideYLabel:Button = new Button(settings.lang.hide + " " + settings.lang.ylabels, settings.style.button);
803 : dservos 1.2
804 :     var hideXLabelTransitioner:Transitioner = new Transitioner(2);
805 : dservos 1.4 //hideXLabelTransitioner.onEnd = updateMarkVisiblity;
806 :     //hideXLabelTransitioner.onStart = updateMarkVisiblity;
807 : dservos 1.3
808 : dservos 1.2 bHideXLabel.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
809 :     if(!hideXLabelTransitioner.running) {
810 :     hideXLabelTransitioner.reset();
811 :    
812 : dservos 1.3 if(bHideXLabel.text == settings.lang.show + " " + settings.lang.xlabels) {
813 :     bHideXLabel.text = settings.lang.hide + " " + settings.lang.xlabels;
814 : dservos 1.2 vis.xyAxes.xAxis.showLabels = true;
815 : dservos 1.4 vis.bounds = new Rectangle(0, 0, loaderInfo.width - (sideBar.width + 15 + vis.x), loaderInfo.height - (vis.y + xLabelsHeight + labelX.height + vis.xyAxes.xAxis.labelOffsetY));
816 : dservos 1.2 } else {
817 : dservos 1.3 bHideXLabel.text = settings.lang.show + " " + settings.lang.xlabels;
818 : dservos 1.2 vis.xyAxes.xAxis.showLabels = false;
819 : dservos 1.4 vis.bounds = new Rectangle(0, 0, loaderInfo.width - (sideBar.width + 15 + vis.x), loaderInfo.height - (vis.y + labelX.height));
820 : dservos 1.2 }
821 :    
822 :     hideXLabelTransitioner.$(labelY).x = -vis.x;
823 : dservos 1.4 hideXLabelTransitioner.$(labelY).y = vis.bounds.height/2 + labelY.height/2;
824 : dservos 1.2
825 :     vis.update(hideXLabelTransitioner).play();
826 :     }
827 :     });
828 :    
829 :     var hideYLabelTransitioner:Transitioner = new Transitioner(2);
830 : dservos 1.4 //hideYLabelTransitioner.onEnd = updateMarkVisiblity;
831 :     //hideYLabelTransitioner.onStart = updateMarkVisiblity;
832 : dservos 1.3
833 : dservos 1.2 bHideYLabel.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
834 :     if(!hideYLabelTransitioner.running) {
835 :     var t:Transitioner = new Transitioner(2);
836 :     var newX:int;
837 :    
838 :     hideYLabelTransitioner.reset();
839 :    
840 : dservos 1.3 if(bHideYLabel.text == settings.lang.show + " " + settings.lang.ylabels) {
841 :     bHideYLabel.text = settings.lang.hide + " " + settings.lang.ylabels;
842 : dservos 1.2 vis.xyAxes.yAxis.showLabels = true;
843 :     newX = labelY.width + -vis.xyAxes.yAxis.labelOffsetX + yLabelsWidth;
844 :     } else {
845 : dservos 1.3 bHideYLabel.text = settings.lang.show + " " + settings.lang.ylabels;
846 : dservos 1.2 vis.xyAxes.yAxis.showLabels = false;
847 :     newX = labelY.width;
848 :     }
849 :    
850 :     t.$(vis).x = newX;
851 : dservos 1.4 vis.bounds = new Rectangle(0, 0, loaderInfo.width - (sideBar.width + 15 + newX), loaderInfo.height - (vis.y + xLabelsHeight + labelX.height + vis.xyAxes.xAxis.labelOffsetY));
852 : dservos 1.2
853 :     // Reposition the labels and title.
854 :     t.$(title).x = vis.bounds.width/2 - title.width/2;
855 :     t.$(labelX).x = vis.bounds.width/2 - labelX.width/2;
856 :     t.$(labelX).y = vis.bounds.height + vis.xyAxes.xAxis.labelOffsetY + xLabelsHeight;
857 :     t.$(labelY).x = -newX;
858 : dservos 1.4 t.$(labelY).y = vis.bounds.height/2 + labelY.height/2;
859 : dservos 1.2
860 :     // Keep the legends in there place.
861 : dservos 1.4 t.$(sideBar).x = vis.bounds.width + 10;
862 : dservos 1.2
863 :     t.play();
864 :     vis.update(hideYLabelTransitioner).play();
865 :     }
866 :     });
867 :    
868 :     // Set up the transitioner to be used when inverting the axes
869 : dservos 1.4 invertTransitioner = new Transitioner(2);
870 :     invertTransitioner.onEnd = function():void {
871 :     //updateMarkVisiblity();
872 : dservos 1.2 vis.xyAxes.xAxis.labels.visible = true;
873 :     vis.xyAxes.yAxis.labels.visible = true;
874 :     };
875 : dservos 1.4 invertTransitioner.onStart = function():void {
876 :     //updateMarkVisiblity();
877 : dservos 1.2 vis.xyAxes.xAxis.labels.visible = false;
878 :     vis.xyAxes.yAxis.labels.visible = false;
879 :     }
880 :    
881 :     // The function to invert the axes.
882 : dservos 1.1 bInvert.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
883 : dservos 1.2 // If we are not allready in the process of inverting the axes.
884 : dservos 1.4 if(!invertTransitioner.running && !legendItemTransitioner.running) {
885 : dservos 1.2 var t:Transitioner = new Transitioner(2);
886 :     var tempText:String = labelX.text;
887 :     var tempOffset:int = vis.xyAxes.xAxis.labelOffsetX;
888 :     var tempWidth:uint = vis.bounds.width;
889 : dservos 1.3 var tempLabelFormat:String = vis.xyAxes.xAxis.labelFormat;
890 : dservos 1.2 var tempLabels:int = xLabelsHeight;
891 : dservos 1.3 var tempScale:Scale = vis.xyAxes.xAxis.axisScale;
892 :     var tempLabelOffsetY:Number = vis.xyAxes.xAxis.labelOffsetY;
893 :     var tempLabelOffsetX:Number = vis.xyAxes.xAxis.labelOffsetX;
894 : dservos 1.2 var currentXLabelsHeight:int = getMaxWidth(vis.xyAxes.yAxis.labels);
895 :    
896 :     var tempShowLabels:Boolean = vis.xyAxes.xAxis.showLabels;
897 : dservos 1.1
898 : dservos 1.2 // Rest the transitioner for a clean transition.
899 : dservos 1.5 invertTransitioner.reset();
900 : dservos 1.2
901 : dservos 1.3 vis.xyAxes.xAxis.axisScale = vis.xyAxes.yAxis.axisScale;
902 :     vis.xyAxes.yAxis.axisScale = tempScale;
903 :     vis.xyAxes.yAxis.axisScale.flush = true;
904 :     vis.xyAxes.xAxis.axisScale.flush = true
905 :    
906 : dservos 1.2 // Flip the axis feilds.
907 : dservos 1.3 if(settings.layout.type == 1) {
908 :     AxisLayout(layout).xField = settings.layout.yaxis.field;
909 :     AxisLayout(layout).yField = settings.layout.xaxis.field;
910 :     settings.layout.xaxis.field = AxisLayout(layout).xField;
911 :     settings.layout.yaxis.field = AxisLayout(layout).yField;
912 :    
913 :     var tempStack:Boolean = AxisLayout(layout).xStacked;
914 :     AxisLayout(layout).xStacked = AxisLayout(layout).yStacked;
915 :     AxisLayout(layout).yStacked = tempStack;
916 : dservos 1.4
917 :     if(XMLList(settings.layout.setting).length() >= 2 && !isnull(settings.layout.setting[0]) && !isnull(settings.layout.setting[0])) {
918 :     var tempStackSetting:String = settings.layout.setting[0].toString();
919 :     settings.layout.setting[0] = settings.layout.setting[1].toString();
920 :     settings.layout.setting[1] = tempStackSetting;
921 :     } else if(XMLList(settings.layout.setting).length() == 1 && !isnull(settings.layout.setting[0])) {
922 :     settings.layout.setting[1] = settings.layout.setting[0].toString();
923 :     settings.layout.setting[0] = "false";
924 :    
925 :     }
926 : dservos 1.3 }
927 :    
928 :     vis.xyAxes.xAxis.labelFormat = vis.xyAxes.yAxis.labelFormat;
929 :     vis.xyAxes.yAxis.labelFormat = tempLabelFormat;
930 :    
931 :    
932 :     vis.xyAxes.xAxis.labelOffsetX = vis.xyAxes.yAxis.labelOffsetY * -1;
933 :     vis.xyAxes.yAxis.labelOffsetY = tempLabelOffsetX * -1;
934 :     vis.xyAxes.xAxis.labelOffsetY = vis.xyAxes.yAxis.labelOffsetX * -1;
935 :     vis.xyAxes.yAxis.labelOffsetX = tempLabelOffsetY * -1;
936 :    
937 : dservos 1.2 xLabelsHeight = yLabelsWidth;
938 :     yLabelsWidth = tempLabels;
939 :    
940 : dservos 1.3
941 : dservos 1.2 vis.xyAxes.xAxis.showLabels = vis.xyAxes.yAxis.showLabels;
942 :     vis.xyAxes.yAxis.showLabels = tempShowLabels;
943 :    
944 :     if(vis.xyAxes.yAxis.showLabels) {
945 : dservos 1.3 bHideYLabel.text = settings.lang.hide + " " + settings.lang.ylabels;
946 : dservos 1.2 } else {
947 : dservos 1.3 bHideYLabel.text = settings.lang.show + " " + settings.lang.ylabels;
948 : dservos 1.2 }
949 :    
950 :     if(vis.xyAxes.xAxis.showLabels) {
951 : dservos 1.3 bHideXLabel.text = settings.lang.hide + " " + settings.lang.xlabels;
952 : dservos 1.2 } else {
953 : dservos 1.3 bHideXLabel.text = settings.lang.show + " " + settings.lang.xlabels;
954 : dservos 1.2 }
955 :    
956 :     // Flip the labels
957 :     labelX.text = labelY.text;
958 :     labelY.text = tempText;
959 :    
960 : dservos 1.4 if(settings.style.nodeshape == Shapes.VERTICAL_BAR || settings.style.nodeshape == Shapes.HORIZONTAL_BAR) {
961 :     vis.data.nodes.visit(function(d:NodeSprite):void {
962 :     if(d.shape == Shapes.VERTICAL_BAR) {
963 :     t.$(d).shape = Shapes.HORIZONTAL_BAR;
964 :     } else {
965 :     t.$(d).shape = Shapes.VERTICAL_BAR;
966 :     }
967 :     });
968 :    
969 :     if(settings.style.nodeshape == Shapes.VERTICAL_BAR) {
970 :     settings.style.nodeshape = Shapes.HORIZONTAL_BAR;
971 :     } else {
972 :     settings.style.nodeshape = Shapes.VERTICAL_BAR;
973 :     }
974 :    
975 :    
976 :     for(var li:Object in legendNodes) {
977 :     for each(var node:NodeSprite in legendNodes[LegendItem(li)] as Array) {
978 :     if(node.shape == Shapes.VERTICAL_BAR) {
979 :     node.shape = Shapes.HORIZONTAL_BAR;
980 :     } else {
981 :     node.shape = Shapes.VERTICAL_BAR;
982 :     }
983 :     }
984 :     }
985 :     }
986 :    
987 : dservos 1.2 // Find the new X value for the visualization.
988 :     var newX:int = labelY.width + vis.xyAxes.xAxis.labelOffsetY + getMaxHeight(vis.xyAxes.xAxis.labels);
989 :    
990 :     // Reposition and set the bounds of the visualization.
991 :     t.$(vis).x = newX;
992 : dservos 1.4 vis.bounds = new Rectangle(0, 0, loaderInfo.width - (sideBar.width + 15 + newX), loaderInfo.height - (vis.y + currentXLabelsHeight + labelX.height + vis.xyAxes.xAxis.labelOffsetY));
993 : dservos 1.2
994 :     // Reposition the labels and title.
995 :     t.$(title).x = vis.bounds.width/2 - title.width/2;
996 :     t.$(labelX).x = vis.bounds.width/2 - labelX.width/2;
997 :     t.$(labelX).y = vis.bounds.height + vis.xyAxes.xAxis.labelOffsetY + currentXLabelsHeight;
998 :     t.$(labelY).x = -newX;
999 : dservos 1.3 t.$(labelY).y = vis.bounds.height/2 + labelY.height/2;
1000 : dservos 1.2
1001 :     // Keep the legends in there place.
1002 : dservos 1.4 t.$(sideBar).x = vis.bounds.width + 10;
1003 : dservos 1.2
1004 : dservos 1.4
1005 : dservos 1.2 //Play the transition.
1006 :     t.play();
1007 : dservos 1.4 vis.update(invertTransitioner).play();
1008 : dservos 1.2 }
1009 :     });
1010 :    
1011 :     // Set up the transitioner for the hide axes button.
1012 :     var hideAxisTrans:Transitioner = new Transitioner(1);
1013 :    
1014 :     // Function for hidding the axes.
1015 :     bHideAxis.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
1016 :     // If we are not allready in the process of hidding the axes
1017 :     if(!hideAxisTrans.running) {
1018 :     // Reset the transitoner for a clean transiton.
1019 :     hideAxisTrans.reset();
1020 :    
1021 :     // Hide or show the axes.
1022 : dservos 1.3 if(bHideAxis.text == settings.lang.show + " " + settings.lang.axes) {
1023 :     hideAxisTrans.$(bHideAxis).text = settings.lang.hide + " " + settings.lang.axes;
1024 :     layout.showAxes(hideAxisTrans).play();
1025 : dservos 1.2 } else {
1026 : dservos 1.3 hideAxisTrans.$(bHideAxis).text = settings.lang.show + " " + settings.lang.axes;
1027 :     layout.hideAxes(hideAxisTrans).play();
1028 : dservos 1.2 }
1029 :     }
1030 : dservos 1.1 });
1031 :    
1032 : dservos 1.2 // Position the buttons inside there container.
1033 :     bHideXLabel.x = 0;
1034 :     bHideXLabel.y = 0;
1035 :    
1036 : dservos 1.4 bHideAxis.x = sideBar.width - bHideAxis.width - 5;
1037 : dservos 1.2 bHideAxis.y = bHideXLabel.y;
1038 :    
1039 : dservos 1.4 bInvert.x = sideBar.width - bInvert.width - 5;
1040 : dservos 1.2 bInvert.y = bHideXLabel.y + bHideXLabel.height + 2;
1041 :    
1042 :     bHideYLabel.x = 0;
1043 :     bHideYLabel.y = bHideXLabel.y + bHideXLabel.height + 2;
1044 :    
1045 :     // Poistion the buttons container.
1046 : dservos 1.4 controls.x = 0;
1047 :     controls.y = sideBar.height + 10;
1048 : dservos 1.2
1049 :     // Add the buttons to the container and the container to the main sprite.
1050 :     controls.addChild(bInvert);
1051 :     controls.addChild(bHideAxis);
1052 :     controls.addChild(bHideXLabel);
1053 :     controls.addChild(bHideYLabel);
1054 : dservos 1.5
1055 :     if(!printVersion){
1056 :     sideBar.addChild(controls);
1057 :     }
1058 :    
1059 : dservos 1.2 // Set the marks on the chart to the higest deepth.
1060 :     vis.setChildIndex(vis.marks, vis.numChildren - 1);
1061 :    
1062 :     // Update.
1063 : dservos 1.1 vis.update();
1064 : dservos 1.4 //updateMarkVisiblity();
1065 : dservos 1.1 }
1066 :    
1067 : dservos 1.2 /**
1068 :     * Roll over function witch makes the object 0.5 units bigger and adds a glow filter.
1069 :     * @param ob the object witch was rolled over.
1070 :     */
1071 : dservos 1.1 private function rollOver(ob:Object):void {
1072 :     ob.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)];
1073 : dservos 1.4 ob.size = nodeSize + 0.5;
1074 : dservos 1.1 }
1075 :    
1076 : dservos 1.2 /**
1077 :     * Roll out function witch removes the filters and makes the object 0.5 units smaller.
1078 :     * @param ob the object witch was rolled out of.
1079 :     */
1080 : dservos 1.1 private function rollOut(ob:Object):void {
1081 :     ob.filters = null;
1082 : dservos 1.4 ob.size = nodeSize;
1083 : dservos 1.1 }
1084 :    
1085 : dservos 1.2 /**
1086 :     * Roll over function for the dialog box.
1087 :     * Adds a glow filter to the curently active dialog box.
1088 :     * @param ob a child of the dialog box.
1089 :     */
1090 : dservos 1.1 private function boxRollOver(ob:Object):void {
1091 :     if(lastBoxData != null) {
1092 :     lastBoxData.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)];
1093 :     }
1094 :     }
1095 :    
1096 : dservos 1.2 /**
1097 :     * Roll out function for the dialog box.
1098 :     * Removes filters on the curently active dialog box.
1099 :     * @param ob a child of the dialog box.
1100 :     */
1101 : dservos 1.1 private function boxRollOut(ob:Object):void {
1102 :     if(lastBoxData != null) {
1103 :     lastBoxData.filters = null;
1104 :     }
1105 :     }
1106 :    
1107 : dservos 1.2 /**
1108 :     * Finds the Legend belonging to the LegendItem passed.
1109 :     * TODO: See if this can be replaced by a .parent call.
1110 :     * @param item a LegendItem to find the Legend of.
1111 :     * @return the Legend that contains the passed LegendItem.
1112 :     */
1113 :     private function findLegendByItem(item:LegendItem):Legend {
1114 :     for(var i:uint = 0; i < legends.numChildren; i++ ) {
1115 :     if(Legend(legends.getChildAt(i)).items.contains(item)) {
1116 :     return Legend(legends.getChildAt(i));
1117 :     }
1118 :     }
1119 :    
1120 :     return null;
1121 :     }
1122 :    
1123 :     /**
1124 :     * Roll over function for legends.
1125 :     * Adds a glow filter to the legend's item aswell as all the markers on the chart
1126 :     * that are realted to the legend item and incrases there size by 1 unit.
1127 :     * @param ob the LegendItem being rolled over.
1128 :     */
1129 : dservos 1.5 private function legendRollOver(ob:Object):void {
1130 :     var item:LegendItem;
1131 : dservos 1.2
1132 : dservos 1.5 if(ob is LegendItem) {
1133 :     item = LegendItem(ob);
1134 :     } else if(ob is TextField) {
1135 :     ob.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)];
1136 :     item = LegendItem(TextField(ob).parent.parent);
1137 :     } else {
1138 :     return;
1139 :     }
1140 :    
1141 :     var legend:Legend = Legend(item.parent.parent);
1142 :    
1143 : dservos 1.4 if(legend) {
1144 :     var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);
1145 :    
1146 : dservos 1.5 item.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)];
1147 : dservos 1.4
1148 :     vis.data.visit(function(d:DataSprite):void {
1149 : dservos 1.5 if(d.data.hasOwnProperty(dataName) && item.value == d.data[dataName]) {
1150 : dservos 1.4 d.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)];
1151 :     d.size = nodeSize + 1;
1152 :     }
1153 :     }, 3, Filters.isDataSprite);
1154 :     }
1155 : dservos 1.2 }
1156 :    
1157 :     /**
1158 :     * Roll out function for legends.
1159 :     * Removes filters to the legend's item aswell as all the markers on the chart
1160 :     * that are realted to the legend item and decrases there size by 1 unit.
1161 :     * @param ob the LegendItem being rolled out of.
1162 :     */
1163 : dservos 1.5 private function legendRollOut(ob:Object):void {
1164 :     var item:LegendItem;
1165 :    
1166 :     if(ob is LegendItem) {
1167 :     item = LegendItem(ob);
1168 :     } else if(ob is TextField) {
1169 :     ob.filters = null;
1170 :     item = LegendItem(TextField(ob).parent.parent);
1171 :     } else {
1172 :     return;
1173 :     }
1174 :    
1175 :     var legend:Legend = Legend(item.parent.parent);
1176 : dservos 1.2
1177 : dservos 1.4 if(legend) {
1178 :     var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);
1179 : dservos 1.5
1180 :     item.filters = null;
1181 :    
1182 : dservos 1.4 vis.data.visit(function(d:DataSprite):void {
1183 : dservos 1.5 if(d.data.hasOwnProperty(dataName) && item.value == d.data[dataName]) {
1184 : dservos 1.4 d.filters = null;
1185 :     d.size = nodeSize;
1186 :     }
1187 :     }, 3, Filters.isDataSprite);
1188 :     }
1189 : dservos 1.2 }
1190 :    
1191 :     /**
1192 :     * Creates and returns a dialog box containing information on the passed data sprite.
1193 :     * @param data the DataSprite containing the information to display.
1194 :     * @returns the Sprite containing the dialog box.
1195 :     */
1196 : dservos 1.1 private function dataDialogBox(data:DataSprite):Sprite {
1197 :     var box:Sprite = new Sprite;
1198 :    
1199 :     var backGround:Sprite = new Sprite;
1200 : dservos 1.3 backGround.graphics.beginFill(parseInt(settings.style.popup.bgcolor, 16), settings.style.popup.alpha);
1201 :     backGround.graphics.lineStyle(settings.style.popup.line.size, parseInt(settings.style.popup.line.color, 16), settings.style.popup.line.alpha);
1202 : dservos 1.1
1203 :     var text:Sprite = new Sprite;
1204 : dservos 1.2 var x:int = 5;
1205 :     var y:int = 0;
1206 :    
1207 :     for(var property:Object in data.data) {
1208 : dservos 1.3 var temp:TextSprite = new TextSprite(property.toString() + ": " + data.data[property], new TextFormat(settings.style.popup.text.font, settings.style.popup.text.size, null, true));
1209 : dservos 1.2 temp.x = x;
1210 :     temp.y = y;
1211 :     text.addChild(temp);
1212 :     y += temp.height;
1213 :     }
1214 : dservos 1.1
1215 : dservos 1.2 backGround.graphics.drawRoundRect(0, 0, text.width + 10, text.height, 30, 30);
1216 : dservos 1.1
1217 :     box.addChild(backGround);
1218 :     box.addChild(text);
1219 :    
1220 :     return box;
1221 :     }
1222 :    
1223 : dservos 1.4
1224 :     private function removeLegenedItemsNodes():void {
1225 :     for(var i:int = 0; i < legends.numChildren; i++) {
1226 :     for(var k:int = 0; k < Legend(legends.getChildAt(i)).items.numChildren; k++) {
1227 :     var legendItem:LegendItem = LegendItem(Legend(legends.getChildAt(i)).items.getChildAt(k));
1228 :    
1229 :     if(legendItem.alpha < 1) {
1230 :     removeLegendNodes(legendItem);
1231 :     }
1232 :     }
1233 :     }
1234 :     }
1235 :    
1236 : dservos 1.2 /**
1237 :     * Check if a mark on the chart is visible based on the related LegendItems states.
1238 :     * @param d the DataSprite to check the visiblility of.
1239 :     * @returns true if the mark is visible.
1240 :     */
1241 :     private function markIsVisible(d:DataSprite):Boolean {
1242 :     var items:Array = getLegendItems(d);
1243 :    
1244 :     for each(var item:LegendItem in items) {
1245 :     if(item.alpha != 1) {
1246 :     return false;
1247 :     }
1248 :     }
1249 :    
1250 :     return true;
1251 :     }
1252 :    
1253 :     /**
1254 :     * Gets all LegenedItems realted to a given DataSprite/mark.
1255 :     * @params d the DataSprite on the chart.
1256 :     * @returns Array of LegendItems that are realted to the given DataSprite.
1257 :     */
1258 :     private function getLegendItems(d:DataSprite):Array {
1259 :     var items:Array = new Array();
1260 : dservos 1.4 var legend:Legend;
1261 :     var item:LegendItem;
1262 :     var dataField:String;
1263 : dservos 1.2
1264 :     for(var i:uint = 0; i < legends.numChildren; i++) {
1265 : dservos 1.4 legend = Legend(legends.getChildAt(i));
1266 :     dataField = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);
1267 : dservos 1.2
1268 : dservos 1.4 if(d.data.hasOwnProperty(dataField)) {
1269 :     for(var k:uint = 0; k < legend.items.numChildren; k++) {
1270 :     item = LegendItem(legend.items.getChildAt(k));
1271 :    
1272 :     if(d.data[dataField] == item.value) {
1273 :     items.push(item);
1274 :     break;
1275 :     }
1276 : dservos 1.2 }
1277 : dservos 1.4 }
1278 : dservos 1.2 }
1279 :    
1280 :     return items;
1281 :     }
1282 :    
1283 : dservos 1.4 private function removeLegendNodes(item:LegendItem):void {
1284 :     if(item != null) {
1285 :     var legend:Legend = Legend(item.parent.parent);
1286 :     var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);
1287 :     var nodes:Array = legendNodes[item] as Array;
1288 :    
1289 :     for each(var node:NodeSprite in nodes) {
1290 :     vis.data.removeNode(node);
1291 :     }
1292 :     }
1293 :     }
1294 :    
1295 :     private function removeLegendEdges(item:LegendItem):void {
1296 :     if(item != null) {
1297 :     var legend:Legend = Legend(item.parent.parent);
1298 :     var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);
1299 :     var edges:Array = legendEdges[item] as Array;
1300 : dservos 1.2
1301 : dservos 1.4 for each(var edge:EdgeSprite in edges) {
1302 :     vis.data.removeEdge(edge);
1303 :     }
1304 :     }
1305 :     }
1306 :    
1307 :     private function addLegendNodes(item:LegendItem):void {
1308 : dservos 1.2 if(item != null) {
1309 : dservos 1.4 var nodes:Array = legendNodes[item] as Array;
1310 :    
1311 :     for each(var node:NodeSprite in nodes) {
1312 :     if(markIsVisible(node)) {
1313 :     vis.data.addNode(node);
1314 :     }
1315 :     }
1316 : dservos 1.2 }
1317 : dservos 1.4 }
1318 :    
1319 :     /*private function dirtyEdges():void {
1320 :     vis.data.edges.visit(function(e:EdgeSprite):void{
1321 :     e.dirty();
1322 :     });
1323 :     }*/
1324 :    
1325 :     private function addLegendEdges(item:LegendItem):void {
1326 :     if(item != null) {
1327 :     var edges:Array = legendEdges[item] as Array;
1328 :    
1329 :     for each(var edge:EdgeSprite in edges) {
1330 :     if(markIsVisible(edge)) {
1331 :     edge.source.addOutEdge(edge);
1332 :     edge.target.addInEdge(edge);
1333 :     vis.data.addEdge(edge);
1334 :     }
1335 :     }
1336 :     }
1337 : dservos 1.2 }
1338 :    
1339 :     /**
1340 :     * Function to be called when a LegendItem is clicked.
1341 :     * Changes the legendItems alpah value and updates mark visiblity.
1342 :     * @param evt the mouse event.
1343 :     */
1344 :     private function legendClick(evt:MouseEvent):void {
1345 : dservos 1.5 var ob:Object = evt.target;
1346 :     var item:LegendItem;
1347 :    
1348 :     if(ob is LegendItem) {
1349 :     item = LegendItem(ob);
1350 :     } else if(ob is TextField) {
1351 :     item = LegendItem(TextField(ob).parent.parent);
1352 :     } else {
1353 :     return;
1354 :     }
1355 : dservos 1.4
1356 :     if(item != null && !invertTransitioner.running && !legendItemTransitioner.running) {
1357 :     legendItemTransitioner.reset();
1358 :    
1359 :     if(item.alpha >= 1) {
1360 :     item.alpha = 0.4;
1361 :     //removeLegendEdges(item);
1362 :     removeLegendNodes(item);
1363 :     } else {
1364 :     item.alpha = 1.0;
1365 :     addLegendNodes(item);
1366 :     addLegendEdges(item);
1367 :     }
1368 :    
1369 :     setUpLayout();
1370 :     vis.update(legendItemTransitioner).play();
1371 : dservos 1.2 }
1372 :     }
1373 :    
1374 :     /**
1375 :     * Function called when a click happens on a mark on the chart.
1376 :     * Creates and adds a dialog box for that mark/DataSprite when clicked or removes the dialog box if
1377 :     * the mark allready has one.
1378 :     * @param the mouse event.
1379 :     */
1380 : dservos 1.1 private function mouseClicked(evt:MouseEvent):void {
1381 :     if(DisplayObject(evt.target).parent == vis.marks) {
1382 :     if(lastBox != null && lastBoxData != null) {
1383 :     lastBoxData.removeChild(lastBox);
1384 : dservos 1.2 boxhc.detach();
1385 : dservos 1.1 }
1386 :    
1387 :     if(evt.target != lastBoxData) {
1388 :     lastBox = dataDialogBox(DataSprite(evt.target));
1389 :     lastBoxData = DataSprite(evt.target);
1390 :     Sprite(evt.target).addChild(lastBox);
1391 :     vis.marks.setChildIndex(Sprite(evt.target), vis.marks.numChildren - 1);
1392 : dservos 1.2 boxhc.attach(Sprite(evt.target));
1393 : dservos 1.1 } else {
1394 :     lastBoxData = null;
1395 :     lastBox = null;
1396 :     }
1397 :     }
1398 :     }
1399 : dservos 1.4
1400 :     private function selectorClick(evt:MouseEvent):void {
1401 :     var selectorOption:SelectorOption = SelectorOption(evt.target);
1402 :    
1403 :     if(!selectorOption.active) {
1404 :     reharvest_data(dataURL + "&" + escape(selectorOption.param) + "=" + escape(selectorOption.value));
1405 :     selectorOption.active = true;
1406 :     selectorOption.alpha = 1;
1407 :     Selector(selectorOption.parent).active.active = false;
1408 :     Selector(selectorOption.parent).active.alpha = 0.4;
1409 :     Selector(selectorOption.parent).active = selectorOption;
1410 :     }
1411 :     }
1412 : dservos 1.1 }
1413 :     }

Moodle CVS Admin
ViewVC Help
Powered by ViewVC 1.0.7