|
By dservos:
CONTRIB-497
* Added flare libbary to repo as it is needed to build the flash front end. Lib is located at /grade/report/visual/flare_visualization/flare/. For more information see http://flare.prefuse.org/
* Added more visualizations.
* Added settings/preferences page for the report.
* Added printable version.
* Added more documentation.
* Added README.txt
* Cleaned up code.
* Fixed a bunch of small bugs.
|
| 134 |
private var invertTransitioner:Transitioner; |
private var invertTransitioner:Transitioner; |
| 135 |
private var legendItemTransitioner:Transitioner; |
private var legendItemTransitioner:Transitioner; |
| 136 |
|
|
| 137 |
|
private var printVersion:Boolean; |
| 138 |
|
|
| 139 |
private var nodeSize:int = 1; |
private var nodeSize:int = 1; |
| 140 |
|
|
| 142 |
|
|
| 143 |
private var debug:Boolean = false; |
private var debug:Boolean = false; |
| 144 |
|
|
| 145 |
private var debug_sessionid:String = "efd5b947db79fc51197b70da3b3a3c5d"; |
private var debug_sessionid:String = "ad896bf3c1af448c05f292e7b14433e1"; |
| 146 |
private var debug_sessiontest:String = "bw8XexZ32g"; |
private var debug_sessiontest:String = "nepQJfZ9pN"; |
| 147 |
private var debug_sessioncookie:String = ""; |
private var debug_sessioncookie:String = ""; |
| 148 |
private var debug_visid:String = "grades_vs_students"; |
private var debug_visid:String = "grades_vs_items"; |
| 149 |
private var debug_wwwroot:String = "http://localhost/moodle"; |
private var debug_wwwroot:String = "http://localhost/moodle"; |
| 150 |
private var debug_courseid:String = "3"; |
private var debug_courseid:String = "3"; |
| 151 |
|
|
| 171 |
var sessionid:String = loaderInfo.parameters['sessionid']; |
var sessionid:String = loaderInfo.parameters['sessionid']; |
| 172 |
var sessiontest:String = loaderInfo.parameters['sessiontest']; |
var sessiontest:String = loaderInfo.parameters['sessiontest']; |
| 173 |
var visid:String = loaderInfo.parameters['visid']; |
var visid:String = loaderInfo.parameters['visid']; |
| 174 |
|
printVersion = booleanify(loaderInfo.parameters['printerversion']); |
| 175 |
|
|
| 176 |
if(debug) { |
if(debug) { |
| 177 |
trace("Debug mode on."); |
trace("Debug mode on."); |
| 217 |
settings = XML(settingsLoader.data); |
settings = XML(settingsLoader.data); |
| 218 |
loadingMessage.text = "Loading Data...."; |
loadingMessage.text = "Loading Data...."; |
| 219 |
|
|
| 220 |
|
if(isnull(settings) || settings.length() < 1 || isnull(settings.layout)) { |
| 221 |
|
error("Loading", "Failed to load settings."); |
| 222 |
|
return; |
| 223 |
|
} |
| 224 |
|
|
| 225 |
var dataLoader:URLLoader = ds.load(); |
var dataLoader:URLLoader = ds.load(); |
| 226 |
|
|
| 227 |
dataLoader.addEventListener(IOErrorEvent.IO_ERROR, function(evt:IOErrorEvent):void { |
dataLoader.addEventListener(IOErrorEvent.IO_ERROR, function(evt:IOErrorEvent):void { |
| 487 |
vis.operators.remove(layout); |
vis.operators.remove(layout); |
| 488 |
layout = null; |
layout = null; |
| 489 |
|
|
| 490 |
|
if(isnull(settings.layout.type)) { |
| 491 |
|
error("Bad Settings", "Missing layout type value."); |
| 492 |
|
return; |
| 493 |
|
} |
| 494 |
|
|
| 495 |
// Set up the layout |
// Set up the layout |
| 496 |
switch(int(settings.layout.type)) { |
switch(int(settings.layout.type)) { |
| 497 |
case 1: layout = passSettings(AxisLayout, settings.layout.setting, settings.layout.xaxis.field, settings.layout.yaxis.field); |
case 1: |
| 498 |
|
if(!isnull(settings.layout.xaxis.field) && !isnull(settings.layout.yaxis.field)) { |
| 499 |
|
layout = passSettings(AxisLayout, settings.layout.setting, settings.layout.xaxis.field, settings.layout.yaxis.field); |
| 500 |
|
} else { |
| 501 |
|
error("Bad Settings", "Missing x or y axis feild for AxisLayout"); |
| 502 |
|
return; |
| 503 |
|
} |
| 504 |
break; |
break; |
| 505 |
case 2: layout = passSettings(CircleLayout, settings.layout.setting); |
case 2: layout = passSettings(CircleLayout, settings.layout.setting); |
| 506 |
break; |
break; |
| 522 |
break; |
break; |
| 523 |
case 11: layout = new TreeMapLayout(); |
case 11: layout = new TreeMapLayout(); |
| 524 |
break; |
break; |
| 525 |
default: layout = passSettings(AxisLayout, settings.layout.setting, settings.layout.xaxis.field, settings.layout.yaxis.field); |
default: |
| 526 |
|
if(!isnull(settings.layout.xaxis.field) && !isnull(settings.layout.yaxis.field)) { |
| 527 |
|
layout = passSettings(AxisLayout, settings.layout.setting, settings.layout.xaxis.field, settings.layout.yaxis.field); |
| 528 |
|
} else { |
| 529 |
|
error("Bad Settings", "Missing x or y axis feild for AxisLayout"); |
| 530 |
|
return; |
| 531 |
|
} |
| 532 |
break; |
break; |
| 533 |
} |
} |
| 534 |
|
|
| 606 |
|
|
| 607 |
dataName = l.dataField.substr(l.dataField.lastIndexOf('.') + 1); |
dataName = l.dataField.substr(l.dataField.lastIndexOf('.') + 1); |
| 608 |
for(var j:int = 0; j < l.items.numChildren; j++) { |
for(var j:int = 0; j < l.items.numChildren; j++) { |
| 609 |
l.items.getChildAt(j).addEventListener(MouseEvent.CLICK, legendClick); |
LegendItem(l.items.getChildAt(j)).addEventListener(MouseEvent.CLICK, legendClick); |
| 610 |
|
//LegendItem(l.items.getChildAt(j)).label.textMode = TextSprite.DEVICE; |
| 611 |
|
//LegendItem(l.items.getChildAt(j)).label.textField.y -= 8; |
| 612 |
|
|
| 613 |
legendNodes[LegendItem(l.items.getChildAt(j))] = new Array(); |
legendNodes[LegendItem(l.items.getChildAt(j))] = new Array(); |
| 614 |
legendEdges[LegendItem(l.items.getChildAt(j))] = new Array(); |
legendEdges[LegendItem(l.items.getChildAt(j))] = new Array(); |
| 631 |
} |
} |
| 632 |
} |
} |
| 633 |
|
|
|
|
|
| 634 |
removeLegenedItemsNodes(); |
removeLegenedItemsNodes(); |
| 635 |
} |
} |
| 636 |
} |
} |
| 715 |
vis.xyAxes.xAxis.labelAngle = Math.PI / 2; |
vis.xyAxes.xAxis.labelAngle = Math.PI / 2; |
| 716 |
vis.xyAxes.xAxis.fixLabelOverlap = false; |
vis.xyAxes.xAxis.fixLabelOverlap = false; |
| 717 |
vis.xyAxes.yAxis.fixLabelOverlap = false; |
vis.xyAxes.yAxis.fixLabelOverlap = false; |
| 718 |
|
//vis.xyAxes.yAxis.labelTextMode = TextSprite.DEVICE; |
| 719 |
|
|
| 720 |
|
|
| 721 |
// Update the visualization so the widths and other values are correct. |
// Update the visualization so the widths and other values are correct. |
| 934 |
vis.xyAxes.xAxis.labelOffsetY = vis.xyAxes.yAxis.labelOffsetX * -1; |
vis.xyAxes.xAxis.labelOffsetY = vis.xyAxes.yAxis.labelOffsetX * -1; |
| 935 |
vis.xyAxes.yAxis.labelOffsetX = tempLabelOffsetY * -1; |
vis.xyAxes.yAxis.labelOffsetX = tempLabelOffsetY * -1; |
| 936 |
|
|
|
|
|
| 937 |
xLabelsHeight = yLabelsWidth; |
xLabelsHeight = yLabelsWidth; |
| 938 |
yLabelsWidth = tempLabels; |
yLabelsWidth = tempLabels; |
| 939 |
|
|
| 1051 |
controls.addChild(bHideAxis); |
controls.addChild(bHideAxis); |
| 1052 |
controls.addChild(bHideXLabel); |
controls.addChild(bHideXLabel); |
| 1053 |
controls.addChild(bHideYLabel); |
controls.addChild(bHideYLabel); |
| 1054 |
|
|
| 1055 |
|
if(!printVersion){ |
| 1056 |
sideBar.addChild(controls); |
sideBar.addChild(controls); |
| 1057 |
|
} |
| 1058 |
|
|
| 1059 |
// Set the marks on the chart to the higest deepth. |
// Set the marks on the chart to the higest deepth. |
| 1060 |
vis.setChildIndex(vis.marks, vis.numChildren - 1); |
vis.setChildIndex(vis.marks, vis.numChildren - 1); |
| 1126 |
* that are realted to the legend item and incrases there size by 1 unit. |
* that are realted to the legend item and incrases there size by 1 unit. |
| 1127 |
* @param ob the LegendItem being rolled over. |
* @param ob the LegendItem being rolled over. |
| 1128 |
*/ |
*/ |
| 1129 |
private function legendRollOver(ob:LegendItem):void { |
private function legendRollOver(ob:Object):void { |
| 1130 |
var legend:Legend = Legend(ob.parent.parent); |
var item:LegendItem; |
| 1131 |
|
|
| 1132 |
|
if(ob is LegendItem) { |
| 1133 |
|
item = LegendItem(ob); |
| 1134 |
|
} else if(ob is TextField) { |
| 1135 |
|
ob.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)]; |
| 1136 |
|
item = LegendItem(TextField(ob).parent.parent); |
| 1137 |
|
} else { |
| 1138 |
|
return; |
| 1139 |
|
} |
| 1140 |
|
|
| 1141 |
|
var legend:Legend = Legend(item.parent.parent); |
| 1142 |
|
|
| 1143 |
if(legend) { |
if(legend) { |
| 1144 |
var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1); |
var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1); |
| 1145 |
|
|
| 1146 |
ob.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)]; |
item.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)]; |
| 1147 |
|
|
| 1148 |
vis.data.visit(function(d:DataSprite):void { |
vis.data.visit(function(d:DataSprite):void { |
| 1149 |
if(d.data.hasOwnProperty(dataName) && ob.value == d.data[dataName]) { |
if(d.data.hasOwnProperty(dataName) && item.value == d.data[dataName]) { |
| 1150 |
d.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)]; |
d.filters = [new GlowFilter(0xFFFF55, 0.8, 6, 6, 10)]; |
| 1151 |
d.size = nodeSize + 1; |
d.size = nodeSize + 1; |
| 1152 |
} |
} |
| 1160 |
* that are realted to the legend item and decrases there size by 1 unit. |
* that are realted to the legend item and decrases there size by 1 unit. |
| 1161 |
* @param ob the LegendItem being rolled out of. |
* @param ob the LegendItem being rolled out of. |
| 1162 |
*/ |
*/ |
| 1163 |
private function legendRollOut(ob:LegendItem):void { |
private function legendRollOut(ob:Object):void { |
| 1164 |
var legend:Legend = Legend(ob.parent.parent); |
var item:LegendItem; |
| 1165 |
|
|
| 1166 |
|
if(ob is LegendItem) { |
| 1167 |
|
item = LegendItem(ob); |
| 1168 |
|
} else if(ob is TextField) { |
| 1169 |
|
ob.filters = null; |
| 1170 |
|
item = LegendItem(TextField(ob).parent.parent); |
| 1171 |
|
} else { |
| 1172 |
|
return; |
| 1173 |
|
} |
| 1174 |
|
|
| 1175 |
|
var legend:Legend = Legend(item.parent.parent); |
| 1176 |
|
|
| 1177 |
if(legend) { |
if(legend) { |
| 1178 |
var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1); |
var dataName:String = legend.dataField.substr(legend.dataField.lastIndexOf('.') + 1); |
| 1179 |
|
|
| 1180 |
ob.filters = null; |
item.filters = null; |
| 1181 |
|
|
| 1182 |
vis.data.visit(function(d:DataSprite):void { |
vis.data.visit(function(d:DataSprite):void { |
| 1183 |
if(d.data.hasOwnProperty(dataName) && ob.value == d.data[dataName]) { |
if(d.data.hasOwnProperty(dataName) && item.value == d.data[dataName]) { |
| 1184 |
d.filters = null; |
d.filters = null; |
| 1185 |
d.size = nodeSize; |
d.size = nodeSize; |
| 1186 |
} |
} |
| 1342 |
* @param evt the mouse event. |
* @param evt the mouse event. |
| 1343 |
*/ |
*/ |
| 1344 |
private function legendClick(evt:MouseEvent):void { |
private function legendClick(evt:MouseEvent):void { |
| 1345 |
var item:LegendItem = LegendItem(evt.target); |
var ob:Object = evt.target; |
| 1346 |
|
var item:LegendItem; |
| 1347 |
|
|
| 1348 |
|
if(ob is LegendItem) { |
| 1349 |
|
item = LegendItem(ob); |
| 1350 |
|
} else if(ob is TextField) { |
| 1351 |
|
item = LegendItem(TextField(ob).parent.parent); |
| 1352 |
|
} else { |
| 1353 |
|
return; |
| 1354 |
|
} |
| 1355 |
|
|
| 1356 |
if(item != null && !invertTransitioner.running && !legendItemTransitioner.running) { |
if(item != null && !invertTransitioner.running && !legendItemTransitioner.running) { |
| 1357 |
legendItemTransitioner.reset(); |
legendItemTransitioner.reset(); |