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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3, Thu Jul 24 15:31:44 2008 WST revision 1.4, Sat Aug 2 12:19:15 2008 WST

By dservos:

CONTRIB-497 *Added more visualizations *Added selector UI Widget for flex/flare visualization *Refactored some of flex actionscript code. *Added defaults for selected group and items in visualizations. *Improved removal of nodes and edges when an item or group is deselected in a legend. *Fixed a memory leak realting to the removal and addtion of nodes. *Added more options for and control of the flex/flare based visualization from the Moodle back end.

# Line 37  Line 37 
37      import flare.vis.controls.HoverControl;      import flare.vis.controls.HoverControl;
38      import flare.vis.data.Data;      import flare.vis.data.Data;
39      import flare.vis.data.DataSprite;      import flare.vis.data.DataSprite;
40        import flare.vis.data.EdgeSprite;
41        import flare.vis.data.NodeSprite;
42      import flare.vis.legend.Legend;      import flare.vis.legend.Legend;
43      import flare.vis.legend.LegendItem;      import flare.vis.legend.LegendItem;
44      import flare.vis.operator.encoder.ColorEncoder;      import flare.vis.operator.encoder.ColorEncoder;
# Line 57  Line 59 
59      import flare.vis.operator.layout.TreeMapLayout;      import flare.vis.operator.layout.TreeMapLayout;
60      import flare.vis.scale.Scale;      import flare.vis.scale.Scale;
61      import flare.vis.util.Filters;      import flare.vis.util.Filters;
62        import flare.vis.util.graphics.Shapes;
63    
64      import flash.display.DisplayObject;      import flash.display.DisplayObject;
65      import flash.display.DisplayObjectContainer;      import flash.display.DisplayObjectContainer;
# Line 71  Line 74 
74      import flash.net.URLRequest;      import flash.net.URLRequest;
75      import flash.text.TextField;      import flash.text.TextField;
76      import flash.text.TextFormat;      import flash.text.TextFormat;
77        import flash.utils.Dictionary;
78    
79      [SWF(width="800", height="600", backgroundColor="#ffffff", frameRate="30")]      [SWF(width="800", height="600", backgroundColor="#ffffff", frameRate="30")]
80      /**      /**
# Line 101  Line 105 
105           */           */
106          private var legends:Sprite;          private var legends:Sprite;
107    
108            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          /**          /**
119           * The hover control for the dialog box.           * The hover control for the dialog box.
120           */           */
# Line 114  Line 128 
128    
129          private var loadingMessage:TextSprite;          private var loadingMessage:TextSprite;
130    
131            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          /**          /**
153           * The constucter for the flare_visualization class.           * The constucter for the flare_visualization class.
154           * Calls on harvest_data and sets up the varibles from the flashvars.           * Calls on harvest_data and sets up the varibles from the flashvars.
# Line 122  Line 157 
157          {          {
158                  loadingMessage = new TextSprite("Loading....", new TextFormat("monospace", 20, 0x0000FF, true));                  loadingMessage = new TextSprite("Loading....", new TextFormat("monospace", 20, 0x0000FF, true));
159                  addChild(loadingMessage);                  addChild(loadingMessage);
160                    addChild(errors);
161    
162                  // Call harvest_data, loading needed visualization data from moodle.                  // Call harvest_data, loading needed visualization data from moodle.
163                  // The Moodle wwwroot, course id, users sessionid, users session cookie                  // The Moodle wwwroot, course id, users sessionid, users session cookie
164                  // and session test data are needed to get the data from moodle are                  // and session test data are needed to get the data from moodle are
165                  // loaded threw flashvars.                  // loaded threw flashvars.
166                  loaderInfo.addEventListener(Event.COMPLETE, function(evt:Event):void {                  loaderInfo.addEventListener(Event.COMPLETE, function(evt:Event):void {
167                          dataURL = loaderInfo.parameters['wwwroot'] + '/grade/report/visual/data.php?id=' + escape(loaderInfo.parameters['courseid']) + '&sessioncookie=' +  escape(loaderInfo.parameters['sessioncookie']) + '&sessionid=' +  escape(loaderInfo.parameters['sessionid']) + '&sessiontest=' + escape(loaderInfo.parameters['sessiontest']) + '&visid=' + escape(loaderInfo.parameters['visid']);                          var wwwroot:String = loaderInfo.parameters['wwwroot'];
168                          settingsURL = loaderInfo.parameters['wwwroot'] + '/grade/report/visual/visual_settings.php?id=' + escape(loaderInfo.parameters['courseid']) + '&visid=' + escape(loaderInfo.parameters['visid']);                          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 = 'http://localhost/moodle/grade/report/visual/data.php?id=3&sessioncookie=&sessionid=ec7b77fa297d0454fa45367b42761d07&sessiontest=iqw4nC9hc7&visid=grade_distribution';                          dataURL = wwwroot + '/grade/report/visual/data.php?id=' + escape(courseID) + '&sessioncookie=' +  escape(sessioncookie) + '&sessionid=' +  escape(sessionid) + '&sessiontest=' + escape(sessiontest) + '&visid=' + escape(visid);
185                          //settingsURL = 'http://localhost/moodle/grade/report/visual/visual_settings.php?id=3&visid=grade_distribution';                          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                          harvest_data();                          harvest_data();
188                  });                  });
# Line 172  Line 222 
222                                  });                                  });
223    
224                                  dataLoader.addEventListener(Event.COMPLETE, function(evt:Event):void {                                  dataLoader.addEventListener(Event.COMPLETE, function(evt:Event):void {
225                                          removeChild(addChild(loadingMessage));                                          removeChild(loadingMessage);
226                                          var data:DataSet = dataLoader.data as DataSet;                                          var data:DataSet = dataLoader.data as DataSet;
227                                          buildVis(Data.fromDataSet(data));                                          buildVis(Data.fromDataSet(data));
228                                  });                                  });
# Line 187  Line 237 
237                          }                          }
238                  }                  }
239    
240            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          private function error(type:String = "", text:String = ""):void {          private function error(type:String = "", text:String = ""):void {
281                  trace(type + " Error: " + text);                  trace(type + " Error: " + text);
282    
283                  var textfield:TextField = new TextSprite(type + " Error: " + text, new TextFormat("monospace", 12, 0xFF0000, true)).textField;                  var textfield:TextField = new TextSprite(type + " Error: " + text, new TextFormat("monospace", 12, 0xFF0000, true)).textField;
284                  textfield.wordWrap = true;                  textfield.wordWrap = true;
285                    textfield.x = 0;
286                    textfield.y = errors.height;
287    
288                  addChild(textfield);                  errors.addChild(textfield);
289          }          }
290    
291          /**          /**
# Line 294  Line 386 
386    
387          private function passSettings(theClass:Class, XMLSettings:XMLList, ... args):* {          private function passSettings(theClass:Class, XMLSettings:XMLList, ... args):* {
388                  var params:Array = new Array();                  var params:Array = new Array();
389                    var cleanParam:*;
390    
391                  for each(var arg:* in args) {                  for each(var arg:* in args) {
392                          params.push(arg);                          params.push(arg);
393                  }                  }
394    
395                  for each(var param:* in XMLSettings) {                  for each(var param:* in XMLSettings) {
396                          var cleanParam:* = booleanify(param);                          cleanParam = booleanify(param);
397                          if(cleanParam != null) {                          if(cleanParam != null) {
398                                  params.push(cleanParam);                                  params.push(cleanParam);
399                          }                          }
# Line 349  Line 442 
442                  }                  }
443          }          }
444    
445          /**          private function makeEdges(data:Data):void {
          * Builds the visualization based on the loaded data.  
          * Also sets up the legends, buttons and controls.  
          * @param data The data that was loaded in from moodle.  
          */  
         private function buildVis(data:Data):void  
         {  
446              if(!isnull(settings.edge)) {              if(!isnull(settings.edge)) {
447                  for each(var edge:XML in settings.edge) {                  for each(var edge:XML in settings.edge) {
448                          data.createEdges(toStringArray(edge.sortby), toStringArray(edge.groupby));                          data.createEdges(toStringArray(edge.sortby), toStringArray(edge.groupby));
449                  }                  }
450              }              }
451            }
452    
453              vis = new Visualization(data);          private function setDataProperties():void {
454              legends = new Sprite();                  vis.data.nodes.visit(function(d:DataSprite):void {
455                    if(!isnull(settings.style.nodeshape)) {
456                            d.shape = settings.style.nodeshape;
457                    }
458    
459              // Set the functions to be called when a dialog box is hovered over.                                  if(d.shape == Shapes.HORIZONTAL_BAR || d.shape == Shapes.VERTICAL_BAR) {
460              boxhc.onRollOver = boxRollOver;                                          nodeSize = 2;
461                          boxhc.onRollOut = boxRollOut;                                  }
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                          // Set up the layout
                         var layout:Layout = new AxisLayout(settings.layout.xaxis.field, settings.layout.yaxis.field);  
484                          switch(int(settings.layout.type)) {                          switch(int(settings.layout.type)) {
485                                  case 1: layout = passSettings(AxisLayout, settings.layout.setting, settings.layout.xaxis.field, settings.layout.yaxis.field);                                  case 1: layout = passSettings(AxisLayout, settings.layout.setting, settings.layout.xaxis.field, settings.layout.yaxis.field);
486                                                  break;                                                  break;
# Line 397  Line 507 
507                                  default: layout = passSettings(AxisLayout, settings.layout.setting, settings.layout.xaxis.field, settings.layout.yaxis.field);                                  default: layout = passSettings(AxisLayout, settings.layout.setting, settings.layout.xaxis.field, settings.layout.yaxis.field);
508                                                  break;                                                  break;
509                          }                          }
510    
511                          vis.operators.add(layout);                          vis.operators.add(layout);
512            }
513    
514                          // Set up the encoders          private function setUpEncoders():void {
                         var encoders:Array = new Array(settings.encoder.length);  
                         for each(var encoder:XML in settings.encoder) {  
515                                  var e:Encoder;                                  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    
524                            for each(var encoder:XML in settings.encoder) {
525                                  switch(int(encoder.type)) {                                  switch(int(encoder.type)) {
526                                          case 1: e = passSettings(ColorEncoder, encoder.setting, encoder.datafield);                                          case 1: e = passSettings(ColorEncoder, encoder.setting, encoder.datafield);
527                                                          break;                                                          break;
# Line 418  Line 536 
536                                  encoders[encoder.id] = e;                                  encoders[encoder.id] = e;
537                                  vis.operators.add(e);                                  vis.operators.add(e);
538                          }                          }
539            }
540    
541              // Set up the layout of the axes.          private function setUpLegends():void {
542              vis.xyAxes.xAxis.horizontalAnchor = TextSprite.LEFT;                  var dataName:String;
543                          vis.xyAxes.xAxis.verticalAnchor = TextSprite.MIDDLE;  
544                          vis.xyAxes.xAxis.labelAngle = Math.PI / 2;                  for(var i:int = 0; i < legends.numChildren; i++){
545                          vis.xyAxes.xAxis.fixLabelOverlap = false;                          for(var k:int = 0; k < Legend(legends.getChildAt(i)).items.numChildren; k++) {
546                          vis.xyAxes.yAxis.fixLabelOverlap = false;                                  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    
630                            // 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    
641                          if(!isnull(settings.layout.yaxis.labelformat)) {                          if(!isnull(settings.layout.yaxis.labelformat)) {
642                                  vis.xyAxes.yAxis.labelFormat = settings.layout.yaxis.labelformat;                                  vis.xyAxes.yAxis.labelFormat = settings.layout.yaxis.labelformat;
# Line 472  Line 684 
684                                  vis.xyAxes.xAxis.labelOffsetX = settings.layout.xaxis.xoffset;                                  vis.xyAxes.xAxis.labelOffsetX = settings.layout.xaxis.xoffset;
685                          }                          }
686    
687                            // 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.              // Update the visualization so the widths and other values are correct.
696              vis.update();              vis.update();
# Line 489  Line 708 
708                          vis.y = title.height + 10;                          vis.y = title.height + 10;
709              vis.x = labelY.height + -vis.xyAxes.yAxis.labelOffsetX + yLabelsWidth;              vis.x = labelY.height + -vis.xyAxes.yAxis.labelOffsetX + yLabelsWidth;
710    
                         // Set up the legends.  
                         var nextLegendY:int = 0;  
                         for each(var legend:XML in settings.legend) {  
                                 var en:Encoder = encoders[legend.encoderid];  
                                 var l:Legend;  
   
                                 switch(int(settings.encoder.(id == int(legend.encoderid)).type)) {  
                                         case 1: l = new Legend(en.source, en.scale, ColorEncoder(en).colors);  
                                                         break;  
                                         case 2: l = new Legend(en.source, en.scale, null, ShapeEncoder(en).shapes);  
                                                         break;  
                                         case 3: l = new Legend(en.source, en.scale, null, null, SizeEncoder(en).sizes);  
                                                         break;  
                                         default: l = new Legend(en.source, en.scale, ColorEncoder(en).colors);  
                                                         break;  
                                 }  
   
                                 l.x = 0;  
                                 l.y = nextLegendY;  
                                 nextLegendY += l.height;  
711    
                                 l.items.addEventListener(MouseEvent.CLICK, legendClick);  
712    
713                                  var lhc:HoverControl = new HoverControl(l.items);                          legendItemTransitioner = new Transitioner(0.5);
714                  lhc.onRollOver = legendRollOver;                          sideBar.addChild(legends);
                                 lhc.onRollOut = legendRollOut;  
715    
716                                  legends.addChild(l);                          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                          }                          }
725                            sideBar.addChild(selectors);
726    
727                            //vis.update();
728    
729              // Set the bounds of the visualization based on the hieght and width of the flash application,              // 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.              // and the other components so the visualization is takes up the unused space.
731              vis.bounds = new Rectangle(0, 0, loaderInfo.width - (legends.width + 15 + vis.x), loaderInfo.height - (vis.y + xLabelsHeight + labelX.height + vis.xyAxes.xAxis.labelOffsetY));              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    
733              // Add the visualization to the main sprite.              // Add the visualization to the main sprite.
734              addChild(vis);              addChild(vis);
735    
             // Set up the properitys of the data sprites and add a eventlistener to check for  
             // clicks on them.  
             vis.data.nodes.visit(function(d:DataSprite):void {  
                 if(!isnull(settings.style.nodeshape)) {  
                         d.shape = settings.style.nodeshape;  
                 }  
                                 d.fillColor = 0x018888ff;  
                                 d.fillAlpha = 0.2;  
                                 d.lineWidth = 2;  
                                 d.addEventListener(MouseEvent.CLICK, mouseClicked);  
   
                         });  
   
                         vis.data.edges.visit(function(d:DataSprite):void {  
                                 if(!isnull(settings.style.edgeshape)) {  
                                         d.shape = settings.style.edgeshape;  
                                 }  
                                 d.lineWidth = 2;  
                                 d.fillAlpha = 1;  
                         });  
   
736              // Position the legends.              // Position the legends.
737              legends.x = vis.bounds.width + 10;              //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    
744              // Position and add the labels and title to the axes.              // Position and add the labels and title to the axes.
745                          labelX.x = vis.bounds.width/2 - labelX.width/2;                          labelX.x = vis.bounds.width/2 - labelX.width/2;
# Line 565  Line 756 
756                          vis.xyAxes.addChild(title);                          vis.xyAxes.addChild(title);
757    
758                  // Add the legeneds container to the visualization.                  // Add the legeneds container to the visualization.
759              vis.addChild(legends);              //vis.addChild(legends);
760                vis.addChild(sideBar);
761    
762                selectors.x = 0;
763                            selectors.y = legends.y + legends.height;
764                            //vis.addChild(selectors);
765    
766              // Set up the hovercontrol for the marks on the chart              // Set up the hovercontrol for the marks on the chart
767              var hc:HoverControl = new HoverControl(vis, Filters.isDataSprite);              var hc:HoverControl = new HoverControl(vis, Filters.isDataSprite);
# Line 573  Line 769 
769                          hc.onRollOut = rollOut;                          hc.onRollOut = rollOut;
770    
771                          // Set up the buttons and a container for them.                          // Set up the buttons and a container for them.
772                          var controls:Sprite = new Sprite();                          controls = new Sprite();
773                          var bInvert:Button = new Button(settings.lang.invertaxes, settings.style.button);                          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);                          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);                          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);                          var bHideYLabel:Button = new Button(settings.lang.hide + " " + settings.lang.ylabels, settings.style.button);
777    
778                          var hideXLabelTransitioner:Transitioner = new Transitioner(2);                          var hideXLabelTransitioner:Transitioner = new Transitioner(2);
779                          hideXLabelTransitioner.onEnd = updateMarkVisiblity;                          //hideXLabelTransitioner.onEnd = updateMarkVisiblity;
780                          hideXLabelTransitioner.onStart = updateMarkVisiblity;                          //hideXLabelTransitioner.onStart = updateMarkVisiblity;
781    
782                          bHideXLabel.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {                          bHideXLabel.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
783                                  if(!hideXLabelTransitioner.running) {                                  if(!hideXLabelTransitioner.running) {
# Line 590  Line 786 
786                                          if(bHideXLabel.text == settings.lang.show + " " +  settings.lang.xlabels) {                                          if(bHideXLabel.text == settings.lang.show + " " +  settings.lang.xlabels) {
787                                                  bHideXLabel.text = settings.lang.hide + " " + settings.lang.xlabels;                                                  bHideXLabel.text = settings.lang.hide + " " + settings.lang.xlabels;
788                                                  vis.xyAxes.xAxis.showLabels = true;                                                  vis.xyAxes.xAxis.showLabels = true;
789                                                  vis.bounds = new Rectangle(0, 0, loaderInfo.width - (legends.width + 15 + vis.x), loaderInfo.height - (vis.y + xLabelsHeight + labelX.height + vis.xyAxes.xAxis.labelOffsetY));                                                  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                                          } else {                                          } else {
791                                                  bHideXLabel.text = settings.lang.show + " " +  settings.lang.xlabels;                                                  bHideXLabel.text = settings.lang.show + " " +  settings.lang.xlabels;
792                                                  vis.xyAxes.xAxis.showLabels = false;                                                  vis.xyAxes.xAxis.showLabels = false;
793                                                  vis.bounds = new Rectangle(0, 0, loaderInfo.width - (legends.width + 15 + vis.x), loaderInfo.height - (vis.y + labelX.height));                                                  vis.bounds = new Rectangle(0, 0, loaderInfo.width - (sideBar.width + 15 + vis.x), loaderInfo.height - (vis.y + labelX.height));
794                                          }                                          }
795    
796                                          hideXLabelTransitioner.$(labelY).x = -vis.x;                                          hideXLabelTransitioner.$(labelY).x = -vis.x;
797                                          hideXLabelTransitioner.$(labelY).y = vis.bounds.height/2 - labelY.height/2;                                          hideXLabelTransitioner.$(labelY).y = vis.bounds.height/2 + labelY.height/2;
798    
799                                          vis.update(hideXLabelTransitioner).play();                                          vis.update(hideXLabelTransitioner).play();
800                                  }                                  }
801                          });                          });
802    
803                          var hideYLabelTransitioner:Transitioner = new Transitioner(2);                          var hideYLabelTransitioner:Transitioner = new Transitioner(2);
804                          hideYLabelTransitioner.onEnd = updateMarkVisiblity;                          //hideYLabelTransitioner.onEnd = updateMarkVisiblity;
805                          hideYLabelTransitioner.onStart = updateMarkVisiblity;                          //hideYLabelTransitioner.onStart = updateMarkVisiblity;
806    
807                          bHideYLabel.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {                          bHideYLabel.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
808                                  if(!hideYLabelTransitioner.running) {                                  if(!hideYLabelTransitioner.running) {
# Line 626  Line 822 
822                                          }                                          }
823    
824                                          t.$(vis).x = newX;                                          t.$(vis).x = newX;
825                                          vis.bounds = new Rectangle(0, 0, loaderInfo.width - (legends.width + 15 + newX), loaderInfo.height - (vis.y + xLabelsHeight + labelX.height + vis.xyAxes.xAxis.labelOffsetY));                                          vis.bounds = new Rectangle(0, 0, loaderInfo.width - (sideBar.width + 15 + newX), loaderInfo.height - (vis.y + xLabelsHeight + labelX.height + vis.xyAxes.xAxis.labelOffsetY));
826    
827                                          // Reposition the labels and title.                                          // Reposition the labels and title.
828                                          t.$(title).x = vis.bounds.width/2 - title.width/2;                                          t.$(title).x = vis.bounds.width/2 - title.width/2;
829                                          t.$(labelX).x = vis.bounds.width/2 - labelX.width/2;                                          t.$(labelX).x = vis.bounds.width/2 - labelX.width/2;
830                                          t.$(labelX).y = vis.bounds.height + vis.xyAxes.xAxis.labelOffsetY + xLabelsHeight;                                          t.$(labelX).y = vis.bounds.height + vis.xyAxes.xAxis.labelOffsetY + xLabelsHeight;
831                                          t.$(labelY).x = -newX;                                          t.$(labelY).x = -newX;
832                                          t.$(labelY).y = vis.bounds.height/2 - labelY.height/2;                                          t.$(labelY).y = vis.bounds.height/2 + labelY.height/2;
833    
834                                          // Keep the legends in there place.                                          // Keep the legends in there place.
835                                          t.$(legends).x = vis.bounds.width + 10;                                          t.$(sideBar).x = vis.bounds.width + 10;
836    
837                                          t.play();                                          t.play();
838                                          vis.update(hideYLabelTransitioner).play();                                          vis.update(hideYLabelTransitioner).play();
# Line 644  Line 840 
840                          });                          });
841    
842                          // Set up the transitioner to be used when inverting the axes                          // Set up the transitioner to be used when inverting the axes
843                          var updateTransitioner:Transitioner = new Transitioner(2);                          invertTransitioner = new Transitioner(2);
844                          updateTransitioner.onEnd = function():void {                          invertTransitioner.onEnd = function():void {
845                                  updateMarkVisiblity();                                  //updateMarkVisiblity();
846                                  vis.xyAxes.xAxis.labels.visible = true;                                  vis.xyAxes.xAxis.labels.visible = true;
847                                  vis.xyAxes.yAxis.labels.visible = true;                                  vis.xyAxes.yAxis.labels.visible = true;
848                          };                          };
849              updateTransitioner.onStart = function():void {              invertTransitioner.onStart = function():void {
850                  updateMarkVisiblity();                  //updateMarkVisiblity();
851                  vis.xyAxes.xAxis.labels.visible = false;                  vis.xyAxes.xAxis.labels.visible = false;
852                                  vis.xyAxes.yAxis.labels.visible = false;                                  vis.xyAxes.yAxis.labels.visible = false;
853              }              }
# Line 659  Line 855 
855                          // The function to invert the axes.                          // The function to invert the axes.
856                          bInvert.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {                          bInvert.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
857                                  // If we are not allready in the process of inverting the axes.                                  // If we are not allready in the process of inverting the axes.
858                                  if(!updateTransitioner.running) {                                  if(!invertTransitioner.running && !legendItemTransitioner.running) {
859                                          var t:Transitioner = new Transitioner(2);                                          var t:Transitioner = new Transitioner(2);
860                                          var tempText:String = labelX.text;                                          var tempText:String = labelX.text;
861                                          var tempOffset:int = vis.xyAxes.xAxis.labelOffsetX;                                          var tempOffset:int = vis.xyAxes.xAxis.labelOffsetX;
# Line 674  Line 870 
870                                          var tempShowLabels:Boolean = vis.xyAxes.xAxis.showLabels;                                          var tempShowLabels:Boolean = vis.xyAxes.xAxis.showLabels;
871    
872                                          // Rest the transitioner for a clean transition.                                          // Rest the transitioner for a clean transition.
873                                          updateTransitioner.reset();                                          invertTransitioner.reset();
874    
875                                          vis.xyAxes.xAxis.axisScale = vis.xyAxes.yAxis.axisScale;                                          vis.xyAxes.xAxis.axisScale = vis.xyAxes.yAxis.axisScale;
876                                          vis.xyAxes.yAxis.axisScale = tempScale;                                          vis.xyAxes.yAxis.axisScale = tempScale;
# Line 691  Line 887 
887                                                  var tempStack:Boolean = AxisLayout(layout).xStacked;                                                  var tempStack:Boolean = AxisLayout(layout).xStacked;
888                                                  AxisLayout(layout).xStacked = AxisLayout(layout).yStacked;                                                  AxisLayout(layout).xStacked = AxisLayout(layout).yStacked;
889                                                  AxisLayout(layout).yStacked = tempStack;                                                  AxisLayout(layout).yStacked = tempStack;
890    
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                                          }                                          }
901    
902                                          vis.xyAxes.xAxis.labelFormat = vis.xyAxes.yAxis.labelFormat;                                          vis.xyAxes.xAxis.labelFormat = vis.xyAxes.yAxis.labelFormat;
# Line 726  Line 932 
932                                          labelX.text = labelY.text;                                          labelX.text = labelY.text;
933                                          labelY.text = tempText;                                          labelY.text = tempText;
934    
935                                            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                                          // Find the new X value for the visualization.                                          // Find the new X value for the visualization.
963                                          var newX:int = labelY.width + vis.xyAxes.xAxis.labelOffsetY + getMaxHeight(vis.xyAxes.xAxis.labels);                                          var newX:int = labelY.width + vis.xyAxes.xAxis.labelOffsetY + getMaxHeight(vis.xyAxes.xAxis.labels);
964    
965                                          // Reposition and set the bounds of the visualization.                                          // Reposition and set the bounds of the visualization.
966                                          t.$(vis).x = newX;                                          t.$(vis).x = newX;
967                                          vis.bounds = new Rectangle(0, 0, loaderInfo.width - (legends.width + 15 + newX), loaderInfo.height - (vis.y + currentXLabelsHeight + labelX.height + vis.xyAxes.xAxis.labelOffsetY));                                          vis.bounds = new Rectangle(0, 0, loaderInfo.width - (sideBar.width + 15 + newX), loaderInfo.height - (vis.y + currentXLabelsHeight + labelX.height + vis.xyAxes.xAxis.labelOffsetY));
968    
969                                          // Reposition the labels and title.                                          // Reposition the labels and title.
970                                          t.$(title).x = vis.bounds.width/2 - title.width/2;                                          t.$(title).x = vis.bounds.width/2 - title.width/2;
# Line 741  Line 974 
974                                          t.$(labelY).y = vis.bounds.height/2 + labelY.height/2;                                          t.$(labelY).y = vis.bounds.height/2 + labelY.height/2;
975    
976                                          // Keep the legends in there place.                                          // Keep the legends in there place.
977                                          t.$(legends).x = vis.bounds.width + 10;                                          t.$(sideBar).x = vis.bounds.width + 10;
978    
979    
980                                          //Play the transition.                                          //Play the transition.
981                          t.play();                          t.play();
982                          vis.update(updateTransitioner).play();                          vis.update(invertTransitioner).play();
983                          }                          }
984                          });                          });
985    
# Line 774  Line 1008 
1008                          bHideXLabel.x = 0;                          bHideXLabel.x = 0;
1009                          bHideXLabel.y = 0;                          bHideXLabel.y = 0;
1010    
1011                          bHideAxis.x = legends.width - bHideAxis.width - 5;                          bHideAxis.x = sideBar.width - bHideAxis.width - 5;
1012                          bHideAxis.y = bHideXLabel.y;                          bHideAxis.y = bHideXLabel.y;
1013    
1014                          bInvert.x = legends.width - bInvert.width - 5;                          bInvert.x = sideBar.width - bInvert.width - 5;
1015                          bInvert.y = bHideXLabel.y + bHideXLabel.height + 2;                          bInvert.y = bHideXLabel.y + bHideXLabel.height + 2;
1016    
1017                          bHideYLabel.x = 0;                          bHideYLabel.x = 0;
1018                          bHideYLabel.y = bHideXLabel.y + bHideXLabel.height + 2;                          bHideYLabel.y = bHideXLabel.y + bHideXLabel.height + 2;
1019    
1020                          // Poistion the buttons container.                          // Poistion the buttons container.
1021                          controls.x = legends.x + vis.x;                          controls.x = 0;
1022                          controls.y = legends.y + legends.height + vis.y + 20;                          controls.y = sideBar.height + 10;
1023    
1024                          // Add the buttons to the container and the container to the main sprite.                          // Add the buttons to the container and the container to the main sprite.
1025                          controls.addChild(bInvert);                          controls.addChild(bInvert);
1026                          controls.addChild(bHideAxis);                          controls.addChild(bHideAxis);
1027                          controls.addChild(bHideXLabel);                          controls.addChild(bHideXLabel);
1028                          controls.addChild(bHideYLabel);                          controls.addChild(bHideYLabel);
1029                          addChild(controls);                          sideBar.addChild(controls);
1030    
1031                          // Set the marks on the chart to the higest deepth.                          // Set the marks on the chart to the higest deepth.
1032              vis.setChildIndex(vis.marks, vis.numChildren - 1);              vis.setChildIndex(vis.marks, vis.numChildren - 1);
1033    
1034                          // Update.                          // Update.
1035                          vis.update();                          vis.update();
1036                          updateMarkVisiblity();                          //updateMarkVisiblity();
1037          }          }
1038    
1039          /**          /**
# Line 808  Line 1042 
1042          */          */
1043          private function rollOver(ob:Object):void {          private function rollOver(ob:Object):void {
1044                  ob.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)];                  ob.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)];
1045                  ob.size += 0.5;                  ob.size = nodeSize + 0.5;
1046          }          }
1047    
1048          /**          /**
# Line 817  Line 1051 
1051          */          */
1052          private function rollOut(ob:Object):void {          private function rollOut(ob:Object):void {
1053                  ob.filters = null;                  ob.filters = null;
1054                  ob.size -= 0.5;                  ob.size = nodeSize;
1055          }          }
1056    
1057          /**          /**
# Line 865  Line 1099 
1099          * @param ob the LegendItem being rolled over.          * @param ob the LegendItem being rolled over.
1100          */          */
1101          private function legendRollOver(ob:LegendItem):void {          private function legendRollOver(ob:LegendItem):void {
1102                  var legend:Legend = findLegendByItem(ob);                  var legend:Legend = Legend(ob.parent.parent);
1103    
1104                    if(legend) {
1105                  var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);                  var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);
1106    
1107                  ob.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)];                  ob.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)];
# Line 873  Line 1109 
1109                  vis.data.visit(function(d:DataSprite):void {                  vis.data.visit(function(d:DataSprite):void {
1110                                  if(d.data.hasOwnProperty(dataName) && ob.value == d.data[dataName]) {                                  if(d.data.hasOwnProperty(dataName) && ob.value == d.data[dataName]) {
1111                                          d.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)];                                          d.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)];
1112                                          d.size += 1;                                                  d.size = nodeSize + 1;
1113                                  }                                  }
1114                          }, 3, Filters.isDataSprite);                          }, 3, Filters.isDataSprite);
1115          }          }
1116            }
1117    
1118          /**          /**
1119          * Roll out function for legends.          * Roll out function for legends.
# Line 885  Line 1122 
1122          * @param ob the LegendItem being rolled out of.          * @param ob the LegendItem being rolled out of.
1123          */          */
1124          private function legendRollOut(ob:LegendItem):void {          private function legendRollOut(ob:LegendItem):void {
1125                  var legend:Legend = findLegendByItem(ob);                  var legend:Legend = Legend(ob.parent.parent);
1126    
1127                    if(legend) {
1128                  var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);                  var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);
1129    
1130                  ob.filters = null;                  ob.filters = null;
# Line 893  Line 1132 
1132                  vis.data.visit(function(d:DataSprite):void {                  vis.data.visit(function(d:DataSprite):void {
1133                                  if(d.data.hasOwnProperty(dataName) && ob.value == d.data[dataName]) {                                  if(d.data.hasOwnProperty(dataName) && ob.value == d.data[dataName]) {
1134                                          d.filters = null;                                          d.filters = null;
1135                                          d.size -= 1;                                                  d.size = nodeSize;
1136                                  }                                  }
1137                          }, 3, Filters.isDataSprite);                          }, 3, Filters.isDataSprite);
1138          }          }
1139            }
1140    
1141          /**          /**
1142          * Creates and returns a dialog box containing information on the passed data sprite.          * Creates and returns a dialog box containing information on the passed data sprite.
# Line 930  Line 1170 
1170                  return box;                  return box;
1171          }          }
1172    
1173    
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          /**          /**
1187          * Check if a mark on the chart is visible based on the related LegendItems states.          * 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.          * @param d the DataSprite to check the visiblility of.
# Line 954  Line 1207 
1207          */          */
1208          private function getLegendItems(d:DataSprite):Array {          private function getLegendItems(d:DataSprite):Array {
1209                  var items:Array = new Array();                  var items:Array = new Array();
1210                    var legend:Legend;
1211                    var item:LegendItem;
1212                    var dataField:String;
1213    
1214                  for(var i:uint = 0; i < legends.numChildren; i++) {                  for(var i:uint = 0; i < legends.numChildren; i++) {
1215                          var legend:Legend = Legend(legends.getChildAt(i));                          legend = Legend(legends.getChildAt(i));
1216                                    dataField = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);
1217    
1218                                    if(d.data.hasOwnProperty(dataField)) {
1219                          for(var k:uint = 0; k < legend.items.numChildren; k++) {                          for(var k:uint = 0; k < legend.items.numChildren; k++) {
1220                                  var item:LegendItem = LegendItem(legend.items.getChildAt(k));                                          item = LegendItem(legend.items.getChildAt(k));
1221    
1222                                  if(d.data[legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1)] == item.value) {                                          if(d.data[dataField] == item.value) {
1223                                          items.push(item);                                          items.push(item);
1224                                          break;                                          break;
1225                                  }                                  }
1226                          }                          }
1227                  }                  }
1228                    }
1229    
1230                  return items;                  return items;
1231          }          }
1232    
1233          /**          private function removeLegendNodes(item:LegendItem):void {
1234          * Sets the visible atrubute of the marks/DataSprites based on the status of the LegendItems realted to it.                  if(item != null) {
1235          * @param item if set, only updates marks for that LegendItem. Otherwise updates all marks.                          var legend:Legend = Legend(item.parent.parent);
1236          */                          var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);
1237          private function updateMarkVisiblity(item:LegendItem=null):void {                          var nodes:Array = legendNodes[item] as Array;
                 var legend:Legend;  
                 var dataName:String;  
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) {                  if(item != null) {
1247                          legend = findLegendByItem(item);                          var legend:Legend = Legend(item.parent.parent);
1248                          dataName = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);                          var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1);
1249                            var edges:Array = legendEdges[item] as Array;
1250    
1251                            for each(var edge:EdgeSprite in edges) {
1252                                    vis.data.removeEdge(edge);
1253                            }
1254                    }
1255                  }                  }
1256    
1257                  vis.data.visit(function(d:DataSprite):void {          private function addLegendNodes(item:LegendItem):void {
1258                                  if(item == null || (d.data.hasOwnProperty(dataName) && item.value == d.data[dataName])) {                  if(item != null) {
1259                                          if(markIsVisible(d)) {                          var nodes:Array = legendNodes[item] as Array;
1260                                                  //d.alpha = 1.0;  
1261                                                  d.visible = true;                          for each(var node:NodeSprite in nodes) {
1262                                          } else {                                  if(markIsVisible(node)) {
1263                                                  //d.alpha = 0.0;                                          vis.data.addNode(node);
1264                                                  d.visible = false;                                  }
1265                            }
1266                    }
1267            }
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                                  }                                  }
                         }, 3, Filters.isDataSprite);  
1287          }          }
1288    
1289          /**          /**
# Line 1005  Line 1294 
1294          private function legendClick(evt:MouseEvent):void {          private function legendClick(evt:MouseEvent):void {
1295                  var item:LegendItem = LegendItem(evt.target);                  var item:LegendItem = LegendItem(evt.target);
1296    
1297                  if(item.alpha == 1) {                  if(item != null && !invertTransitioner.running && !legendItemTransitioner.running) {
1298                            legendItemTransitioner.reset();
1299    
1300                            if(item.alpha >= 1) {
1301                          item.alpha = 0.4;                          item.alpha = 0.4;
1302                                    //removeLegendEdges(item);
1303                                    removeLegendNodes(item);
1304                  } else {                  } else {
1305                          item.alpha = 1.0;                          item.alpha = 1.0;
1306                                    addLegendNodes(item);
1307                                    addLegendEdges(item);
1308                  }                  }
1309    
1310                  updateMarkVisiblity(item);                          setUpLayout();
1311                  vis.update();                          vis.update(legendItemTransitioner).play();
1312                    }
1313          }          }
1314    
1315          /**          /**
# Line 1040  Line 1337 
1337                          }                          }
1338                  }                  }
1339          }          }
1340    
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      }      }
1354  }  }

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4

Moodle CVS Admin
ViewVC Help
Powered by ViewVC 1.0.7