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

Moodle CVS Admin
ViewVC Help
Powered by ViewVC 1.0.7