|
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.
|
| 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; |
| 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; |
| 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 |
/** |
/** |
| 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 |
*/ |
*/ |
| 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. |
| 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 |
}); |
}); |
| 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 |
}); |
}); |
| 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 |
/** |
/** |
| 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 |
} |
} |
| 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; |
| 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; |
| 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; |
| 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(); |
| 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; |
| 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); |
| 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) { |
| 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) { |
| 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(); |
| 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 |
} |
} |
| 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; |
| 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; |
| 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; |
| 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; |
| 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 |
|
|
| 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 |
/** |
/** |
| 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 |
/** |
/** |
| 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 |
/** |
/** |
| 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)]; |
| 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. |
| 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; |
| 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. |
| 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. |
| 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 |
/** |
/** |
| 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 |
/** |
/** |
| 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 |
} |
} |