package forms.queryAspect
{
import core.AbstractModel;
import flash.events.Event;
import mx.collections.XMLListCollection;
import mx.events.CollectionEvent;
[Event(name="queryTypePropertyChange")]
public class QueryAspectModel extends AbstractModel
{
namespace wfs = "http://www.opengis.net/wfs";
namespace xsd = "http://www.w3.org/2001/XMLSchema";
use namespace wfs;
use namespace xsd;
private var _serverLayers:XMLListCollection;
private var _queryColumns:XMLListCollection;
private var _actions:XML =
ZoomByFilter
FilterAndZoom
SelectAndZoom
SelectFeaturesByFilter
FilterFeatures
ClearSelection
ClearFilter
;
protected override function refresh(event:Event = null) : void {
getServerLayers();
getQueryColumns();
super.refresh(event);
}
private function getServerLayers() : void {
if(_dataSource && _node) {
var newServerLayers:XMLListCollection = _dataSource.serverInfo.getFeatureTypes(server, false, false);
if(newServerLayers != _serverLayers) {
if(_serverLayers) {
_serverLayers.removeEventListener(CollectionEvent.COLLECTION_CHANGE, refresh);
}
_serverLayers = newServerLayers;
if(_serverLayers) {
_serverLayers.addEventListener(CollectionEvent.COLLECTION_CHANGE, refresh);
}
dispatchEvent(new Event("serverLayersChange"));
}
}
}
private function getQueryColumns() : void {
if(_dataSource && _node) {
var newServerLayers:XMLListCollection = _dataSource.serverInfo.getFeatureTypeAttributes(server,
serverLayer);
if(newServerLayers != _serverLayers) {
if(_queryColumns) {
_queryColumns.removeEventListener(CollectionEvent.COLLECTION_CHANGE, refresh);
}
_queryColumns = newServerLayers;
if(_queryColumns) {
_queryColumns.addEventListener(CollectionEvent.COLLECTION_CHANGE, refresh);
}
dispatchEvent(new Event("queryColumnsChange"));
}
}
}
public function get name() : String {
return _node.Name;
}
[Bindable(event="namePropertyChange")]
[Bindable(event="nodeChange")]
public function set name(newName:String) : void {
_node.Name = newName;
dispatchEvent(new Event("namePropertyChange"));
}
[Bindable(event="titlesPropertyChange")]
[Bindable(event="nodeChange")]
public function get titles() : Array {
return getTitles(_node.Titles);
}
public function addToTitles(title:Object) : void {
doAddToTitles(title, _node.Titles);
dispatchEvent(new Event("titlesPropertyChange"));
}
[Bindable(event="nodeChange")]
public function get owner() : String {
return _node.Owner;
}
public function get scope() : String {
return _node.Scope;
}
[Bindable(event="scopePropertyChange")]
[Bindable(event="nodeChange")]
public function set scope(newScope:String) : void {
_node.Scope = newScope;
dispatchEvent(new Event("scopePropertyChange"));
}
public function get validScopes() : Array {
return ['public', 'private'];
}
public function get server() : XML {
return getListItem(validServers.(@id == _node.Server.@id &&
@clientId == _node.Server.@clientId));
}
[Bindable(event="serverPropertyChange")]
[Bindable(event="nodeChange")]
public function set server(newServer:XML) : void {
_node.Server.@id = newServer.@id;
_node.Server.@clientId = newServer.@clientId;
getServerLayers();
dispatchEvent(new Event("serverPropertyChange"));
}
[Bindable(event="dataSourceChange")]
public function get validServers() : XMLList {
return _dataSource.queryServers.source.copy();
}
[Bindable(event="serverLayersChange")]
public function get validServerLayers() : XMLList {
return _serverLayers.source.copy();
}
public function get serverLayer() : XML {
var nspace:String = _node.Namespace;
var layerName:String = _node.Layername;
for each(var item:Object in validServerLayers) {
var name:XMLList = item.child("Name");
if(name.length() == 0) {
name = item.child(new QName("http://www.opengis.net/wfs", "Name"));
}
var currentName:String;
if(name.length() == 0) {
currentName = item.toString();
} else {
currentName = name[0].toString();
}
var currentNspace:String = "";
if(currentName.indexOf(":") != -1) {
var splitted:Array = currentName.split(":");
currentName = splitted[1];
var ns:Object = item.namespace(splitted[0]);
if(ns) {
currentNspace = ns.toString();
}
}
if(nspace == currentNspace && layerName == currentName) {
return item as XML;
}
}
return null;
}
[Bindable(event="serverLayerPropertyChange")]
[Bindable(event="nodeChange")]
public function set serverLayer(newServerLayer:XML) : void {
if(newServerLayer) {
var name:XMLList = newServerLayer.child("Name");
if(name.length() == 0) {
name = newServerLayer.child(new QName("http://www.opengis.net/wfs", "Name"));
}
var currentName:String;
if(name.length() == 0) {
currentName = newServerLayer.toString();
} else {
currentName = name[0].toString();
}
var currentNspace:String = "";
if(currentName.indexOf(":") != -1) {
var splitted:Array = currentName.split(":");
currentName = splitted[1];
var ns:Object = newServerLayer.namespace(splitted[0]);
if(ns) {
currentNspace = ns.toString();
}
}
_node.Namespace = currentNspace;
_node.Layername = currentName;
} else {
_node.Namespace = "";
_node.Layername = "";
}
getQueryColumns();
dispatchEvent(new Event("serverLayerPropertyChange"));
}
public function get queryType() : String {
return _node.Querytype;
}
[Bindable(event="queryTypePropertyChange")]
[Bindable(event="nodeChange")]
public function set queryType(newQueryType:String) : void {
_node.Querytype = newQueryType;
dispatchEvent(new Event("queryTypePropertyChange"));
}
[Bindable(event="serverPropertyChange")]
[Bindable(event="nodeChange")]
public function get validQueryTypes() : Array {
var retval:Array = ["simple"];
if(server.Service == "GI") {
retval.push("advanced");
}
return retval;
}
public function get validActions() : XMLList {
return _actions.Action.copy();
}
[Bindable(event="serverPropertyChange")]
[Bindable(event="nodeChange")]
public function get supportsAdvanced() : Boolean {
if(server) {
return server.Service == "GI";
} else {
return false;
}
}
[Bindable(event="actionsPropertyChange")]
[Bindable(event="nodeChange")]
public function get actions() : XMLList {
return _node.Actions.Action.copy();
}
public function addToActions(item:XML) : void {
if(_node.child("Actions").length() == 0) {
_node.appendChild();
}
_node.Actions[0].appendChild({item.children().toString()});
dispatchEvent(new Event("actionsPropertyChange"));
}
public function removeFromActions(item:Object) : void {
var allChildren:XMLList = _node.Actions.Action;
allChildren = allChildren.(children() != item.children());
_node.Actions[0].setChildren(allChildren);
dispatchEvent(new Event("actionsPropertyChange"));
}
[Bindable(event="queryColumnsPropertyChange")]
[Bindable(event="nodeChange")]
public function get queryColumns() : XMLList {
var all:XMLList = allQueryColumns;
if(_node) {
var retval:XMLList = new XMLList();
for each(var item:XML in _node.FeatureTypeProperties.FeatureTypeProperty) {
var ftqueryfield:String = item.Ftqueryfield;
if(ftqueryfield.indexOf(":") != -1) {
ftqueryfield = ftqueryfield.split(":")[1];
}
retval += all.(@name == ftqueryfield);
}
return retval;
} else {
return null;
}
}
[Bindable(event="queryColumnsChange")]
private function get allQueryColumns() : XMLList {
return _queryColumns.source.copy();
}
[Bindable(event="queryColumnsChange")]
[Bindable(event="queryColumnsPropertyChange")]
[Bindable(event="nodeChange")]
public function get validQueryColumns() : XMLList {
var all:XMLList = allQueryColumns;
for each(var item:XML in queryColumns) {
all = all.(valueOf() != item);
}
return all;
}
private function get serverLayerName() : String {
var name:XMLList = serverLayer.child("Name");
if(name.length() == 0) {
name = serverLayer.child(new QName("http://www.opengis.net/wfs", "Name"));
}
var currentName:String;
if(name.length() == 0) {
currentName = serverLayer.toString();
} else {
currentName = name[0].toString();
}
return currentName;
}
private function getFtqueryfield(item:XML) : String {
var ftqueryfield:String = item.@name;
var ftName:String = serverLayerName;
if(ftName.indexOf(":") != -1) {
ftqueryfield = ftName.split(":")[0] + ":" + ftqueryfield;
}
return ftqueryfield;
}
public function removeFromQueryColumns(item:XML) : void {
var ftqueryfield:String = getFtqueryfield(item);
var list:XMLList = _node.FeatureTypeProperties.FeatureTypeProperty.(Ftqueryfield != ftqueryfield);
_node.FeatureTypeProperties[0].setChildren(list);
dispatchEvent(new Event("queryColumnsPropertyChange"));
}
public function addToQueryColumns(item:XML) : void {
_node.FeatureTypeProperties[0].appendChild(
{getFtqueryfield(item)}
{serverLayerName}
{getFtqueryfield(item)}
{getFtqueryfield(item)}
ComboBox
);
dispatchEvent(new Event("queryColumnsPropertyChange"));
}
[Bindable(event="nodeChange")]
[Bindable(event="queryColumnsPropertyChange")]
public function getQueryColumn(item:XML) : XML {
return getListItem(_node.FeatureTypeProperties
.FeatureTypeProperty.(Ftqueryfield == getFtqueryfield(item)));
}
public function get description() : String {
return _node.Description;
}
[Bindable(event="descriptionPropertyChange")]
[Bindable(event="nodeChange")]
public function set description(newDescription:String) : void {
_node.Description = newDescription;
}
}
}