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(); } } }