package data.trees { import data.Tree; import mx.collections.IViewCursor; import mx.collections.XMLListCollection; import mx.events.CollectionEvent; public class AdminTree extends Tree { private function collectionChanged(event:CollectionEvent, elementGroupName:Object, elementName:Object) : void { var admin:XML = XML(collection.getItemAt(0)); var group:XML = admin.child(elementGroupName)[0]; switch(event.kind) { case "add": for each(var obj:Object in event.items) { var ref:XML = getRef(obj as XML); var collection:XMLListCollection = new XMLListCollection(); collection.source = group.children(); var cursor:IViewCursor = collection.createCursor(); while(!cursor.afterLast) { if(titleCompare(cursor.current, ref) > 0) { cursor.insert(ref); return; } cursor.moveNext(); } if(cursor.afterLast) { group.appendChild(getRef(XML(obj))); } } return; case "remove": for each(obj in event.items) { var item:XML = XML(obj); group.setChildren(group.child(elementName).(!(@id == item.@id && @clientId == item.@clientId))); } return; case "update": for each(obj in event.items) { if(obj.property == "@useCount") { item = obj.source as XML; var list:XMLList = group.children().(@id == item.@id && @clientId == item.@clientId); if(list.length() > 0) { if(list[0].@useCount != item.@useCount) { list[0].@useCount = item.@useCount; } } } } } } protected override function getRef(item:XML) : XML { var ref:XML = super.getRef(item); if(item.attribute("useCount").length() > 0) { ref.@useCount = item.@useCount; } return ref; } protected override function mapsChanged(event:CollectionEvent) : void { collectionChanged(event, "Maps", "Map"); } protected override function layersChanged(event:CollectionEvent) : void { collectionChanged(event, "Layers", "Layer"); } protected override function queryAspectsChanged(event:CollectionEvent) : void { collectionChanged(event, "QueryAspects", "QueryAspect"); } protected override function templatesChanged(event:CollectionEvent) : void { collectionChanged(event, "Templates", "Template"); } protected override function serversChanged(event:CollectionEvent) : void { collectionChanged(event, "Servers", "Server"); } protected override function reportsChanged(event:CollectionEvent) : void { collectionChanged(event, "Reports", "Report"); } public override function buildTree() : void { super.buildTree(); var admin:XML = ; admin.appendChild(); var maps:Array = new Array(); for each(var map:XML in dataSource.maps) { maps.push(getRef(map)); } maps.sort(titleCompare); for each(map in maps) { admin.Maps.appendChild(map); } admin.appendChild(); var layers:Array = new Array(); for each(var layer:XML in dataSource.layers) { layers.push(getRef(layer)); } layers.sort(titleCompare); for each(layer in layers) { admin.Layers.appendChild(layer); } admin.appendChild(); var queryAspects:Array = new Array(); for each(var queryAspect:XML in dataSource.queryAspects) { queryAspects.push(getRef(queryAspect)); } queryAspects.sort(titleCompare); for each(queryAspect in queryAspects) { admin.QueryAspects.appendChild(queryAspect); } admin.appendChild(); var templates:Array = new Array(); for each(var template:XML in dataSource.templates) { templates.push(getRef(template)); } templates.sort(titleCompare); for each(template in templates) { admin.Templates.appendChild(template); } admin.appendChild(); var servers:Array = new Array(); for each(var server:XML in dataSource.servers) { servers.push(getRef(server)); } servers.sort(titleCompare); for each(server in servers) { admin.Servers.appendChild(server); } admin.appendChild(); var reports:Array = new Array(); for each(var report:XML in dataSource.reports) { reports.push(getRef(report)); } reports.sort(titleCompare); for each(report in reports) { admin.Reports.appendChild(report); } collection.addItem(admin); } } }