package data.trees
{
import data.Tree;
import mx.events.CollectionEvent;
import mx.events.PropertyChangeEvent;
public class ContextTree extends Tree
{
private var contextArray:Array = new Array();
private function compareContexts(a:Object, b:Object) : int {
var nameA:String = dataSource.getProps(XML(a)).Name.toString();
var nameB:String = dataSource.getProps(XML(b)).Name.toString();
return nameA.localeCompare(nameB);
}
protected override function getRef(item:XML) : XML {
var ref:XML = super.getRef(item);
var localName:String = ref.localName();
switch(localName) {
case "Context":
ref.appendChild();
var contextProps:XML = dataSource.getProps(item);
for each(var map:XML in contextProps.Maps.Map) {
ref.Maps.appendChild(getRef(map));
}
break;
case "Layer":
var layerProps:XML = dataSource.getProps(item)
for each(var subLayer:XML in layerProps.Layers.Layer) {
ref.appendChild(getRef(subLayer));
}
break;
case "Map":
var mapProps:XML = dataSource.getProps(item);
ref.appendChild();
ref.appendChild();
ref.appendChild();
ref.appendChild();
for each(var layer:XML in mapProps.Layers.Layer) {
ref.Layers.appendChild(getRef(layer));
}
for each(var queryAspect:XML in mapProps.QueryAspects.QueryAspect) {
ref.QueryAspects.appendChild(getRef(queryAspect));
}
for each(var report:XML in mapProps.Reports.Report) {
ref.Reports.appendChild(getRef(report));
}
for each(var template:XML in mapProps.Templates.Template) {
ref.Templates.appendChild(getRef(template));
}
}
return ref;
}
protected override function contextsChanged(event:CollectionEvent) : void {
switch(event.kind) {
case "add":
for each(var obj:Object in event.items) {
if(obj is XML) {
contextArray.push(getRef(XML(obj)));
}
}
var contexts:XML = XML(collection.getItemAt(0));
contexts.setChildren(new XMLList());
contextArray.sort(compareContexts);
for(var i:uint = 0;i < contextArray.length; i++) {
contexts.appendChild(contextArray[i]);
}
break;
case "remove":
for each(obj in event.items) {
if(obj is XML) {
var removedItem:XML = XML(obj);
for(i = 0; i < contextArray.length; i++) {
if(contextArray[i].@id == removedItem.@id &&
contextArray[i].@clientId == removedItem.@clientId) {
contextArray.splice(i, 1);
i--;
}
}
}
}
contexts = XML(collection.getItemAt(0));
contexts.setChildren(new XMLList());
for(i = 0;i < contextArray.length; i++) {
contexts.appendChild(contextArray[i]);
}
break;
case "update":
var changeEvent:PropertyChangeEvent = PropertyChangeEvent(event.items[0]);
var contextProps:XML = XML(changeEvent.source);
var contextRef:XMLList = collection.source.Context;
contextRef = contextRef.(@id == contextProps.@id && @clientId == contextProps.@clientId);
updateRefs(contextProps.Maps.Map, contextRef.Maps[0]);
}
}
protected override function mapsChanged(event:CollectionEvent) : void {
if(event.kind == "update") {
var changeEvent:PropertyChangeEvent = PropertyChangeEvent(event.items[0]);
var mapProps:XML = XML(changeEvent.source);
var mapRefs:XMLList = collection.source..Map;
mapRefs = mapRefs.(@id == mapProps.@id && @clientId == mapProps.@clientId);
for each(var mapRef:XML in mapRefs) {
updateRefs(mapProps.Layers.Layer, mapRef.Layers[0]);
updateRefs(mapProps.QueryAspects.QueryAspect, mapRef.QueryAspects[0]);
updateRefs(mapProps.Reports.Report, mapRef.Reports[0]);
updateRefs(mapProps.Templates.Template, mapRef.Templates[0]);
}
}
}
protected override function layersChanged(event:CollectionEvent) : void {
if(event.kind == "update") {
var changeEvent:PropertyChangeEvent = PropertyChangeEvent(event.items[0]);
var layerProps:XML = XML(changeEvent.source);
if(layerProps.Type.children().toString() != "Group") {
return;
}
var layerRefs:XMLList = collection.source..Layer;
layerRefs = layerRefs.(@id == layerProps.@id && @clientId == layerProps.@clientId);
for each(var layerRef:XML in layerRefs) {
updateRefs(layerProps.Layers.Layer, layerRef);
}
}
}
public override function buildTree() : void {
super.buildTree();
var contexts:XML =
for each(var context:XML in dataSource.contexts.source) {
contextArray.push(getRef(context));
}
contextArray.sort(compareContexts);
for(var i:uint = 0;i < contextArray.length; i++) {
contexts.appendChild(contextArray[i]);
}
collection.addItem(contexts);
}
public override function cleanup() : void {
super.cleanup();
contextArray = new Array();
}
}
}