/*---------------- FILE HEADER --------------------------------------- This file is part of Geoide. Copyright (C) 2005-2006 by: IDgis B.V. http://www.idgis.nl This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Herman Assink IDgis bv P.O. Box 15 7450 AA Holten The Netherlands E-Mail: herman.assink@idgis.nl * @version 1.4.0 * @author IDgis team * ------------------------------------------------------------------------*/ import nl.idgis.giclient.util.ArrayTools; import nl.idgis.giclient.framework.bars.ButtonBarConfig; import nl.idgis.giclient.framework.bars.PositionConfig; import nl.idgis.giclient.gui.ContainerContent; import nl.idgis.giclient.geoma.Geometry; import nl.idgis.giclient.geoma.GeometryListener; import nl.idgis.giclient.geoma.GMLFactory; import nl.idgis.giclient.framework.buttons.GIButtonConfig; import nl.idgis.giclient.gis.ActiveMapListener; import nl.idgis.giclient.gis.Feature; import nl.idgis.giclient.gis.GIS; import nl.idgis.giclient.gis.Layer; import nl.idgis.giclient.gis.LayerFilteredFeaturesListener; import nl.idgis.giclient.gis.Map; import nl.idgis.giclient.gis.SelectionListener; import nl.idgis.giclient.modes.Mode; import nl.idgis.giclient.StringTools; import nl.idgis.giclient.geoma.Envelope; import nl.idgis.giclient.gis.TimeRangeScale; import nl.idgis.giclient.gis.SelectableLayer; import nl.idgis.giclient.util.Strings; import nl.idgis.giclient.gis.ChoristLayer; import nl.idgis.giclient.webserviceconnector.choristconnector.ChoristConnector; import nl.idgis.giclient.geoma.CAPFactory; import nl.idgis.giclient.framework.FrameWork; import flash.external.ExternalInterface; import nl.idgis.giclient.api.PropertiesResponseHandler; import nl.idgis.giclient.framework.SinglePaneComponent; import nl.idgis.giclient.framework.Frame; import nl.idgis.giclient.gui.context.AddLayer; import nl.idgis.giclient.event.StateEvent; import nl.idgis.giclient.event.StateEventListener; import nl.idgis.giclient.gis.CentreScale; class nl.idgis.giclient.api.APIInterpreter extends ContainerContent implements ActiveMapListener, LayerFilteredFeaturesListener, SelectionListener, GeometryListener { private var javaScriptObj:String = ""; private var gism:GIS = null; private var layerSelectedFeaturesData:Boolean = false; private var propertiesResponseHandlers:Object = null; function onLoad():Void { ruler.getGIS().gisEventDispatcher.addActiveMapListener(this); var layers:Array = ruler.getGIS().getLayers(); for (var i:String in layers) { layers[i].layerEventDispatcher.addLayerFilteredFeaturesListener(this); layers[i].layerEventDispatcher.addSelectionListener(this); } ruler.getGIS().getUnboundFeatureLayer().layerEventDispatcher.addSelectionListener(this); gism = ruler.getGIS(); propertiesResponseHandlers = new Object(); ExternalInterface.addCallback("addLayer", this, addLayer); ExternalInterface.addCallback("getCurrentExtent", this, getCurrentExtent); ExternalInterface.addCallback("setMode", this, setMode); ExternalInterface.addCallback("setButton", this, setButton); ExternalInterface.addCallback("setEditing", this, setEditing); ExternalInterface.addCallback("setActiveMap", this, setActiveMap); ExternalInterface.addCallback("refresh", this, refresh); ExternalInterface.addCallback("setActiveLayer", this, setActiveLayer); ExternalInterface.addCallback("setLayerVisible", this, setLayerVisible); ExternalInterface.addCallback("zoomToCurrentFeature", this, zoomToCurrentFeature); ExternalInterface.addCallback("setFilteredFeatures", this, setFilteredFeatures); ExternalInterface.addCallback("zoomToFilteredFeatures", this, zoomToFilteredFeatures); ExternalInterface.addCallback("zoomToEnvelope", this, zoomToEnvelope); ExternalInterface.addCallback("showButtonBar", this, showButtonBar); ExternalInterface.addCallback("hideButtonBar", this, hideButtonBar); ExternalInterface.addCallback("removeAllAreas", this, removeAllAreas); ExternalInterface.addCallback("addGeometry", this, addGeometry); ExternalInterface.addCallback("getProperty", this, getProperty); ExternalInterface.addCallback("loadGeometries", this, loadGeometries); ExternalInterface.addCallback("setInitialTimeRangeScale", this, setInitialTimeRangeScale); ExternalInterface.addCallback("selectFeaturesAndZoom", this, selectFeaturesAndZoom); ExternalInterface.addCallback("setCurrentFeature", this, setCurrentFeature); ExternalInterface.addCallback("zoomToSelectedFeatures", this, zoomToSelectedFeatures); ExternalInterface.addCallback("setSelectedFeatures", this, setSelectedFeatures); ExternalInterface.addCallback("zoomToLayers", this, zoomToLayers); ExternalInterface.addCallback("loadSnapShot", this, loadSnapShot); ExternalInterface.addCallback("setButtonBarVisible", this, setButtonBarVisible); ExternalInterface.addCallback("enableLayerSelectedFeaturesData", this, enableLayerSelectedFeaturesData); ExternalInterface.addCallback("registerObj", this, registerObj); ExternalInterface.addCallback("apiReady", this, apiReady); } function apiReady():Boolean { return true; } function registerObj(objName:String):Void { this.javaScriptObj = objName; } function enableLayerSelectedFeaturesData():Void { this.layerSelectedFeaturesData = true; } function getCurrentExtent():Object { var gis:GIS = ruler.getGIS(); var centreScale:CentreScale = gis.getCurrentCentreScaleWGS84(); if(centreScale == null) { centreScale = gis.getCurrentCentreScale(); } var envelope:Envelope = centreScale.toEnvelope(Stage.width, Stage.height, gis.getCoordPixFactorForSrs(centreScale.getSRS())); var decimals:Number = ruler.getSRSInfo().isProjection(envelope.getSRS()) ? 100 : 10000; return {minx: Math.round(envelope.getMinX() * decimals) / decimals, miny: Math.round(envelope.getMinY() * decimals) / decimals, maxx: Math.round(envelope.getMaxX() * decimals) / decimals, maxy: Math.round(envelope.getMaxY() * decimals) / decimals, srs: envelope.getSRS()}; } function addLayer(service:String):Void { var component : SinglePaneComponent = SinglePaneComponent(ruler.getGIClientConfig().getGIComponent("AddLayer")); var frame : Frame = component.showPane({}); AddLayer(frame.getScrollContent()).setService(service); } function setMode(modeName:String):Void { var mode:Mode = ruler.getGIClientConfig().getMode(modeName); if (mode == null) { _root["frameWork"].state(Strings.getFile("Api").getString("modeNameDontCorrespond", {modeName: modeName}), 0); } else { try { ruler.setActiveMode(mode); } catch (e:Error) { _root["frameWork"].state(Strings.getFile("Api").getString("cantSetActiveMode", {modeName: mode.getName()}), 0); } } } function setButton(buttonBarName:String, positionName:String, buttonName:String):Void { var buttonBarConfig:ButtonBarConfig = ruler.getGIClientConfig().getButtonBarConfig(buttonBarName); if (buttonBarConfig == null) { _root["frameWork"].state(Strings.getFile("Api").getString("buttonBarNameDontCorrespond", {buttonBarName: buttonBarName}), 0); } else { var positionConfig:PositionConfig = buttonBarConfig.getPositionConfig(positionName); if (positionConfig == null) { _root["frameWork"].state(Strings.getFile("Api").getString("positionNameDontCorrespond", {positionName: positionName}), 0); } else { var buttonConfig:GIButtonConfig = ruler.getGIClientConfig().getGIButtonConfig(buttonName); if (buttonConfig == null) { _root["frameWork"].state(Strings.getFile("Api").getString("buttonNameDontCorrespond", {buttonName: buttonName}), 0); } else { positionConfig.setButtonConfig(buttonConfig); } } } } function setEditing(editing:Boolean):Void { try { ruler.setEditing(editing); } catch (e:Error) { _root["frameWork"].state("Cannot set editing to " + editing, 0); } } function setActiveMap(mapName:String):Void { var map:Map = gism.getMap(mapName); if (map == null) { _root["frameWork"].state(Strings.getFile("Api").getString("mapNameDontCorresCapabilities", {mapName: mapName}), 0); } else { gism.setActiveMap(map); } } function refresh(layerName:String):Void { var layer:Layer = gism.getLayer(layerName); if (layer == null) { _root["frameWork"].state(Strings.getFile("Api").getString("layerNameUnknowRefresh", {layerName: layerName}), 0); } else { layer.refresh(); } } function setActiveLayer(name:String):Void { var layer:Layer = gism.getLayer(name); // A non-existing layer name will reset the active layer to null. gism.setActiveLayer(layer); } function setLayerVisible(layerName:String, visible:Boolean):Void { var layer:Layer = gism.getLayer(layerName); if (layer == null) { _root["frameWork"].state(Strings.getFile("Api").getString("layerNameUnknowSetlayervisible", {layerName: layerName}), 0); } else { layer.setVisible(visible); } } function zoomToCurrentFeature(layerName:String):Void { var layer:Layer = gism.getLayer(layerName); if (layer == null) { _root["frameWork"].state(Strings.getFile("Api").getString("layerUnknownZoomtocurrentfeature", {layerName : layerName }), 0); } else { gism.zoomToCurrentFeature(layer); } } function setFilteredFeatures(layerName:String, whereClause:String):Void { var layer:Layer = gism.getLayer(layerName); if (layer == null) { _root["frameWork"].state(Strings.getFile("Api").getString("cantPerfCallDontExist", {layerName: layerName}), 0); } else if (!(layer instanceof SelectableLayer)) { _root["frameWork"].state(Strings.getFile("Api").getString("cantPerfCallNotSelectable", {layerName: layerName}), 0); } else { var idsString:String = whereClause.substr(3); var ids:Array = ArrayTools.split(idsString); SelectableLayer(layer).setFilteredFeatures(ids, false); } } function zoomToFilteredFeatures(layerNamesString:String):Void { var layerNames:Array = layerNamesString.split(","); var layer:Layer = null; var layers:Array = new Array(); for (var i:String in layerNames) { layer = gism.getLayer(layerNames[i]); if (layer == null) { _root["frameWork"].state(Strings.getFile("Api").getString("layerUnknownZoomfilteredfeatures", {layerNames: layerNames[i] }), 0); } else { layers.push(layer); } } if (layers.length > 0) { gism.zoomToFilteredFeatures(layers); } } function zoomToEnvelope(minX:Number, minY:Number, maxX:Number, maxY:Number):Void { var envelope:Envelope = null; if ((minX != null) && (minY != null) && (maxX != null) && (maxY != null)) { envelope = new Envelope(ruler.getGIS().getActiveMap().getSRS(), minX, minY, maxX, maxY); } gism.zoomToEnvelope(envelope); } function showButtonBar(elementName:String):Void { FrameWork(_root["frameWork"]).showButtonBar(elementName); } function hideButtonBar(elementName:String):Void { FrameWork(_root["frameWork"]).hideButtonBar(elementName); } function removeAllAreas():Void { var editLayer:SelectableLayer = ruler.getEditLayer(); var removeFeatures:Array = new Array(); var features:Array = editLayer.getFeatures(); for(var i:Number = 0;i < features.length; i++) { removeFeatures.push(features[i]); } for(var i:Number = 0; i < removeFeatures.length; i++) { editLayer.removeFeature(removeFeatures[i]); } } function addGeometry(id:String, geomString:String, editable:Boolean, iconUrl:String):Void { var editLayer:SelectableLayer = ruler.getEditLayer(); var feature:Feature = editLayer.getFeature(id); var geom:XML = new XML(geomString); var geometry:Geometry = CAPFactory.parseArea(geom); ruler.setEditing(true, false); if(feature == null) { feature = ruler.getEditLayer().addFeature(geometry, id); } else { feature.setGeometry(geometry); } feature.setIconUrl(iconUrl); feature.setEditable(editable); } function getProperty(name:String): String { var value:String = null; if (name.toUpperCase() == "ACTIVELAYERSELECTEDFEATURES") { var activeLayer:SelectableLayer = SelectableLayer(gism.getActiveLayer()); if (activeLayer != null) { var layerName:String = activeLayer.getName(); var selectedFeatures:Array = activeLayer.getSelectedFeatures(); var idsString:String = getIDsString(selectedFeatures); value = "layer=" + layerName + ";" + idsString; } } return value; } function loadGeometries():String { var gmlString:String = ""; var editLayer:SelectableLayer = SelectableLayer(ruler.getEditLayer()); if (editLayer != null) { var editingFeatures:Array = editLayer.getSubSelectedFeatures(); if (editingFeatures.length > 0) { //exclude features with null geometry for (var k:Number = 0; k < editingFeatures.length; k++) { if (editingFeatures[k].getGeometry() == null) { editingFeatures.splice(k, 1); } } var gml:XML = GMLFactory.createGML(editingFeatures); gmlString = gml.toString(); } } return gmlString; } function setInitialTimeRangeScale(beginTimeStampString:String, endTimeStampString:String, scaleString:String):Void { var beginTimeStamp:Date = StringTools.parseDateTime(beginTimeStampString); var endTimeStamp:Date = StringTools.parseDateTime(endTimeStampString); var scale:Number = Number(scaleString); var newTimeRangeScale:TimeRangeScale = new TimeRangeScale(beginTimeStamp, endTimeStamp, scale, gism.getInitialFPS()); gism.setInitialTimeRangeScale(newTimeRangeScale); } function selectFeaturesAndZoom(layerName:String, whereClause:String):Void { var layer:Layer = gism.getLayer(layerName); if (layer == null) { _root["frameWork"].state(Strings.getFile("Api").getString("layerUnknownSelectfeaturesandzoom", {layerName : layerName }), 0); } else { var idsString:String = whereClause.substr(3); var ids:Array = ArrayTools.split(idsString); gism.selectFeaturesAndZoom(layer, ids); } } function setCurrentFeature(layerName:String, whereClause:String):Void { var layer:Layer = gism.getLayer(layerName); if (layer == null) { _root["frameWork"].state(Strings.getFile("Api").getString("cantPerfApiCallLayerDoesntEXist", {layerName: layerName }), 0); } else if (!(layer instanceof SelectableLayer)) { _root["frameWork"].state(Strings.getFile("Api").getString("cantPerfApiCallLayerIsNotSelectableLayer", {layerName: layerName }), 0); } else { var idsString:String = whereClause.substr(3); var ids:Array = ArrayTools.split(idsString); SelectableLayer(layer).setCurrentFeature(ids, false); } } function zoomToSelectedFeatures(layerName:String):Void { var layer:Layer = gism.getLayer(layerName); if (layer == null) { _root["frameWork"].state(Strings.getFile("Api").getString("layerUnknownZoomtoselectedfeatures", {layerName : layerName }), 0); } else { gism.zoomToSelectedFeatures(layer); } } function setSelectedFeatures(layerName:String, whereClause:String):Void { var layer:Layer = gism.getLayer(layerName); if (layer == null) { _root["frameWork"].state(Strings.getFile("Api").getString("cantPerfApiCallLayerDontExist", {layerName: layerName }), 0); } else if (!(layer instanceof SelectableLayer)) { _root["frameWork"].state(Strings.getFile("Api").getString("cantPerfApiCallLayerIsntSelectable", {layerName: layerName }), 0); } else { var idsString:String = whereClause.substr(3); var ids:Array = ArrayTools.split(idsString); SelectableLayer(layer).setSelectedFeatures(ids, false, null); } } function zoomToLayers(layerNamesString:String):Void { var layerNames:Array = layerNamesString.split(","); var layer:Layer = null; var layers:Array = new Array(); for (var i:String in layerNames) { layer = gism.getLayer(layerNames[i]); if (layer == null) { _root["frameWork"].state(Strings.getFile("Api").getString("layerUnknownZoomtolayers", {layerNames: layerNames[i] }), 0); } else { layers.push(layer); } } if (layers.length > 0) { gism.zoomToLayers(layers); } } function loadSnapShot(width:Number, height:Number, gmlString:String):Void { var gml:XML = new XML(gmlString); var env:Object = this; var snapshot:XML = new XML(); snapshot.ignoreWhite = true; snapshot["javaScriptObj"] = this.javaScriptObj; snapshot.onLoad = function(succes:Boolean) { if (succes) { var string:String = StringTools.escapeForJavaScript(this.toString()); var maxLength:Number = 32728; if (string.length <= maxLength) { ExternalInterface.call(this["javaScriptObj"] + ".onLoadSnapshot", string); } else { var numSubStrings:Number = Math.ceil(string.length / maxLength); ExternalInterface.call(this["javaScriptObj"] + ".onLoadSnapshot", env.chunkyPoolID, numSubStrings, null); var subString:String = null; for (var i:Number = 0; i < numSubStrings; i++) { subString = string.substr(i * maxLength, maxLength); ExternalInterface.call(this["javaScriptObj"] + ".onChunkyChunkyMagic", env.chunkyPoolID, i, subString); } env.chunkyPoolID++; } } }; //var url:String = "http://regge:3785/geoide/giservlet?request=GetCBSnapshot"; //var url:String = "http://idgisvv.xs4all.nl/cb/giservlet?request=GetCBSnapshot"; var url:String = "http://idgisvv.xs4all.nl/geoide-chorist/giservlet?request=GetCBSnapshot"; //var url:String = "http://rijn:8080/geoide-x-gdi/giservlet?request=GetCBSnapshot"; //url += "&map=" + gism.getActiveMap().getName(); var layers:Array = gism.getLayers(); var choristLayer:ChoristLayer = null; for(var i:Number = 0; i < layers.length; i++) { var layer:Layer = layers[i]; if(layer instanceof ChoristLayer) { choristLayer = ChoristLayer(layer); break; } } if(choristLayer != null) { url += "&url=" + ChoristConnector(choristLayer.getMapConnector()).getUrl().substring(7); url += "&service=" + choristLayer.getName(); } url += "&width=" + width; url += "&height=" + height; url += "&encoding=base64"; gml.addRequestHeader("Content-Type", "text/xml"); gml.sendAndLoad(url, snapshot); } function setButtonBarVisible(name:String, visible:Boolean):Void { var buttonBarConfig:ButtonBarConfig = ruler.getGIClientConfig().getButtonBarConfig(name); if (buttonBarConfig == null) { _root["frameWork"].state(Strings.getFile("Api").getString("buttonDontCorrespondToButton", {name: name}), 0); } else { if (visible) { _root.frameWork.addButtonBar(buttonBarConfig); } else { buttonBarConfig.deflate(); } } } function beforeChangeActiveMap():Void { var layers:Array = ruler.getGIS().getLayers(); for (var i:String in layers) { layers[i].layerEventDispatcher.removeLayerFilteredFeaturesListener(this); layers[i].layerEventDispatcher.removeSelectionListener(this); } } function afterChangeActiveMap():Void { var layers:Array = ruler.getGIS().getLayers(); for (var i:String in layers) { layers[i].layerEventDispatcher.addLayerFilteredFeaturesListener(this); layers[i].layerEventDispatcher.addSelectionListener(this); } } function onChangeLayerFilteredFeatures(layer:Layer):Void { var layerName:String = layer.getName(); var filteredFeatures:Array = SelectableLayer(layer).getFilteredFeatures(); ExternalInterface.call(this.javaScriptObj + ".onChangeFilteredFeatures", layerName, getIDsArray(filteredFeatures)); } function onChangeLayerSelectedFeatures(layer:Layer, selected:Boolean, subSelected:Boolean, current:Boolean):Void { if (selected) { var layerName:String = layer.getName(); var selectedFeatures:Array = SelectableLayer(layer).getSelectedFeatures(); if(this.layerSelectedFeaturesData) { var handler:PropertiesResponseHandler = this.propertiesResponseHandlers[layerName]; if(handler == null) { handler = new PropertiesResponseHandler(layerName, this.javaScriptObj + ".onChangeSelectedFeaturesData"); this.propertiesResponseHandlers[layerName] = handler; } handler.doRequests(selectedFeatures); } var idsString:String = getIDsString(selectedFeatures); ExternalInterface.call(this.javaScriptObj + ".onChangeSelectedFeatures", layerName, getIDsArray(selectedFeatures)); } if (current) { var layerName:String = layer.getName(); var currentFeature:Feature = SelectableLayer(layer).getCurrentFeature(); var id:String = ""; if (currentFeature != null) { id = currentFeature.getID(); var id_nr:String = id; var idPrefix:String = currentFeature.getLayer().getFeatureIdPrefix(); if (id.substr(0,idPrefix.length) == idPrefix) { //strip id prefix added by WFS id = id.substr(idPrefix.length); } } ExternalInterface.call(this.javaScriptObj + ".onChangeCurrentFeature", layerName, id); } } function onChangeGeometry(geometry:Geometry, permanent:Boolean):Void { var editLayer:SelectableLayer = SelectableLayer(ruler.getEditLayer()); var currentEditingFeature:Feature = editLayer.getCurrentFeature(); if ((currentEditingFeature.getGeometry() == geometry.getMostSuperGeometry()) && (permanent)) { var gml:XML = GMLFactory.createGML(new Array(currentEditingFeature)); ExternalInterface.call(this.javaScriptObj + ".onChangeGeometry", gml.toString()); editLayer.getCurrentFeature().onChangeGeometry(geometry, permanent); } } function beforeStopEditSession():Void { var gmlString:String = ""; var editingFeatures:Array = SelectableLayer(ruler.getEditLayer()).getSubSelectedFeatures(); if (editingFeatures.length > 0) { var gml:XML = GMLFactory.createGML(editingFeatures); gmlString = gml.toString(); } ExternalInterface.call(this.javaScriptObj + ".onChangeGeometry", gmlString); } private function getIDsString(features:Array):String { var idsString:String = "id="; for (var i:Number = 0; i < features.length; i++) { var id:String = features[i].getID(); var id_nr:String = id; var idPrefix:String = Feature(features[i]).getLayer().getFeatureIdPrefix(); if (id.substr(0,idPrefix.length) == idPrefix) { //strip id prefix added by WFS id = id.substr(idPrefix.length); } idsString += id; if (i < features.length - 1) { idsString += ","; } } return idsString; } private function getIDsArray(features:Array):Array { var idsArray:Array = new Array(); for (var i:Number = 0; i < features.length; i++) { idsArray.push(Feature(features[i]).getID()); } return idsArray; } }