/*---------------- 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.filterencoding.ComplexFilter; import nl.idgis.giclient.GIClientConfig; import nl.idgis.giclient.framework.GIComponent; import nl.idgis.giclient.framework.GIComponentAttrInfoAdapter; import nl.idgis.giclient.framework.GIComponentCustomAdapter; import nl.idgis.giclient.gis.GIS; import nl.idgis.giclient.gis.Layer; import nl.idgis.giclient.gis.GILayer; import nl.idgis.giclient.gis.Map; import nl.idgis.giclient.gis.Report; import nl.idgis.giclient.gui.mapviewer.MapViewer; import nl.idgis.giclient.modes.Mode; import nl.idgis.giclient.framework.MultiPaneComponent; import nl.idgis.giclient.gui.printcomponent.PrintComponent; import nl.idgis.giclient.RulerEventDispatcher; import nl.idgis.giclient.framework.SinglePaneComponent; import nl.idgis.giclient.util.XMLTools; import nl.idgis.giclient.event.StateEventDispatcher; import nl.idgis.giclient.event.ChangeEvent; import nl.idgis.giclient.event.StateEventListener; import nl.idgis.giclient.event.StateEvent; import nl.idgis.giclient.gis.SelectableLayer; import nl.idgis.giclient.util.SRSInfo; import nl.idgis.giclient.util.Strings; import nl.idgis.giclient.GIContext; import nl.idgis.giclient.GIContextListener; import nl.idgis.giclient.geoma.Envelope; import nl.idgis.giclient.framework.FrameWork; class nl.idgis.giclient.Ruler implements GIContextListener { private var srsInfo:SRSInfo = null; private var giClientConfig:GIClientConfig = null; private var gism:GIS = null; private var currentMode:Mode = null; private var depth:Number = 0; private var new_context:GIContext = null; var rulerEventDispatcher:RulerEventDispatcher = null; private var stateEventDispatcher:StateEventDispatcher = null; function Ruler(giClientConfig:GIClientConfig, gism:GIS, srsInfo:SRSInfo) { this.giClientConfig = giClientConfig; this.gism = gism; this.srsInfo = srsInfo; rulerEventDispatcher = new RulerEventDispatcher(); stateEventDispatcher = new StateEventDispatcher(); setActiveMode(getDefaultMode()); loadMapViewer(); loadAPIInterpreter(); loadComponents(); } function getGIClientConfig():GIClientConfig { return giClientConfig; } function getGIS():GIS { return gism; } function setActiveMode(currentMode:Mode):Void { if (currentMode == null) { // EXCEPTION return; } if (this.currentMode == currentMode) { return; } //do nothing if editing and multiFeatureEdit = false and newMode is "selectMode" or setCurrent, (SelectBySelection ignored!) // TODO end session when change current feature var editLayer:Layer = getEditLayer(); if (editLayer != null) { if (!(giClientConfig.isMultiFeatureEdit()) && ((currentMode.getName().toLowerCase().indexOf("select") > -1) || //use name because getAction returns Object instead of Action class (currentMode.getName().toLowerCase().indexOf("setcurrent") > -1) || ((currentMode.getName().toLowerCase().indexOf("create") > -1) && (currentMode.getName().toLowerCase().indexOf("createmembermode") == -1)))) { return; } } var activeLayer:Layer = gism.getActiveLayer(); var editableLayers:Array = gism.getEditableLayers(); var activeMap:Map = gism.getActiveMap(); if (((currentMode.isEditMode() && activeLayer instanceof SelectableLayer) || (currentMode.isEditMode() && activeLayer == null)) && !activeMap.getUnboundFeatureLayer()) { var edtLayer:SelectableLayer = SelectableLayer(activeLayer); if (edtLayer == null) { edtLayer = SelectableLayer(editableLayers[0]); } //trace("setActiveMode, authorized = " + SelectableLayer(edtLayer).authorized()); if (!SelectableLayer(edtLayer).authorized()) { FrameWork(_root.frameWork).message( Strings.getFile("Gui").getString("NotAuthorizedForMode")); return; } } if (this.currentMode != null) { // This if clause is only for init time. Normally there is always a current mode. this.currentMode.getAction().exit(this); this.currentMode.setRuler(null); } var previousMode:Mode = this.currentMode; this.currentMode = currentMode; if (currentMode.isEditMode()) { try { gism.setEditing(true); } catch (e:Error) { this.currentMode = previousMode; throw new Error // ("nl.idgis.giclient.Ruler.setActiveMode(): cannot set the active mode, because editing could not be set to true.\nCaused by: " + e.toString()); (Strings.getFile("Geoide").getString("CannotSetActiveEditingToTrue", {cause: e.toString()})) ; } if ((!activeMap.getUnboundFeatureLayer()) && ((activeLayer == null) || (!activeLayer.isEditable())) || ((GILayer(activeLayer).getGeometryType() != null) && (currentMode.getGeometryType() != null) && (GILayer(activeLayer).getGeometryType() != currentMode.getGeometryType()))) { if (editableLayers.length == 0) { this.currentMode = previousMode; throw new Error //("nl.idgis.giclient.Ruler.setActiveMode(): cannot set the active mode to an edit mode, because there is no editable layer to set as active layer."); (Strings.getFile("Geoide").getString("CannotSetActiveToEditModeNoEditableLayer")) ; } var modeGeometryType:String = currentMode.getGeometryType(); if (modeGeometryType == null) { gism.setActiveLayer(Layer(editableLayers[0])); } else { var layerGeometryType:String = null; for (var i:Number = 0; i < editableLayers.length; i++) { layerGeometryType = SelectableLayer(editableLayers[i]).getGeometryType(); if ((layerGeometryType == null) || (layerGeometryType == modeGeometryType)) { gism.setActiveLayer(Layer(editableLayers[i])); break; } else if (i == editableLayers.length - 1) { this.currentMode = previousMode; throw new Error//("nl.idgis.giclient.Ruler.setActiveMode(): cannot set the active mode to an edit mode, because there is no editable layer that matches the geometry type of the mode to set as active layer."); (Strings.getFile("Geoide").getString("CannotSetEditModeGeometryType")) ; } } } } } currentMode.getAction().enter(this); currentMode.setRuler(this); stateEventDispatcher.dispatchEvent(new ChangeEvent(this, "Ruler", "currentMode", previousMode)); var contextMenu:ContextMenu = currentMode.getContextMenu(); _root.menu = contextMenu; // TODO _root.mapViewer.attachOrUpdateMapCustomCursor(); // TODO } function getActiveMode():Mode { return currentMode; } function getDefaultMode():Mode { return giClientConfig.getMode("ZoomInMode"); } function getDefaultEditMode():Mode { return giClientConfig.getEditModes()[0]; // TODO } function getCreateMode():Mode { //return giClientConfig.getModes()[14]; // TODO return giClientConfig.getMode("CreatePolygonMode"); } private function loadMapViewer():Void { var initObject:Object = {ruler: this}; var mapViewer_o:MapViewer = MapViewer(_root.attachMovie("MapViewer", "mapViewer", depth++, initObject)); } private function loadAPIInterpreter():Void { var initObject:Object = {ruler: this}; _root.attachMovie("APIInterpreter", "apiInterpreter", depth++, initObject); } private function loadComponents():Void { var giComponents:Array = giClientConfig.getGIComponents(); var giComponent:GIComponent = null; var adapters:String = null; for (var i:Number = 0; i < giComponents.length; i++) { giComponent = giComponents[i]; giComponent.setRuler(this); adapters = giComponent.getAdapters(); if (adapters != null) { if (adapters.indexOf("Custom") > -1) { var adapter:Object = new GIComponentCustomAdapter(SinglePaneComponent(giComponent), rulerEventDispatcher); } if (adapters.indexOf("AttrInfo") > -1) { var adapter:Object = new GIComponentAttrInfoAdapter(MultiPaneComponent(giComponent), gism); } } } } function doReport():Void { var layer:SelectableLayer = null; var activeLayer:SelectableLayer = SelectableLayer(gism.getActiveLayer()); if (activeLayer != null) { //apply to active layer var reports:Array = activeLayer.getReports(); if (reports == null) { // no reports defined return; } else { layer = activeLayer; } } else { //apply to first layer with a report var layers:Array = gism.getLayers(); for (var i:Number = 0; i < layers.length; i++) { var reports:Array = layers[i].getReports(); if (reports == null) { // no reports defined return; } else { layer = layers[i]; break; } } } //trace("layer: " + layer.getName()); var selFeats:Array = layer.getSelectedFeatures(); var noofIDs:Number = selFeats.length; //trace("noofIDs: " + noofIDs); if (noofIDs > 0) { var report:Report = layer.getReports()[0]; var idStr:String = " "; var parameterColumn:String = report.getParameterColumn(); var sep:String = ""; for (var i:Number = 0; i < noofIDs; i++) { if (parameterColumn == null) { //assume ID-column idStr += sep + selFeats[i].getID(); } else { var value:String = XMLTools.getStringValue(parameterColumn, selFeats[i].getProperties()); idStr += sep + value; } sep = ","; } var url:String = ""; //trace("report.getName(): " + report.getName()); url = report.getUrlprefix(); if (url.indexOf(":") == -1) { // Assumes that an occurence of ":" means an absolute URL. //url = giClientConfig.getServerPath() + url; url = layer.getServerURL() + url; } url += idStr; //trace("url: " + url); _root.getURL(url, "_blank"); } } function doPrint():Void { var printComponent:PrintComponent = new PrintComponent(); var mapEnvelope:Envelope = gism.getCurrentCentreScale().toEnvelope(Stage.width, Stage.height, gism.getCoordPixFactor()); printComponent.printdoc(mapEnvelope); } function getQueryAspectFilter():ComplexFilter{ var map:Map = gism.getActiveMap(); if(map!=null){ if(map.getCurrentQueryAspect()!=null){ return map.getCurrentQueryAspect().getFilter(); } } return null; } function setEditing(editing:Boolean, save:Boolean):Void { gism.setEditing(editing, save); } function isEditing():Boolean { return gism.isEditing(); } function getEditLayer():SelectableLayer { return gism.getEditLayer(); } function addEventListener(stateEventListener:StateEventListener, sourceClassName:String, actionType:Number, propertyName:String):Void { //if (sourceClassName + "_" + actionType + "_" + propertyName != "Ruler_" + StateEvent.CHANGE + "_currentMode") { // EXCEPTION // return; //} stateEventDispatcher.addEventListener(stateEventListener, sourceClassName, actionType, propertyName); } function removeEventListener(stateEventListener:StateEventListener, sourceClassName:String, actionType:Number, propertyName:String):Void { //if (sourceClassName + "_" + actionType + "_" + propertyName != "Ruler_" + StateEvent.CHANGE + "_currentMode") { // EXCEPTION // return; //} stateEventDispatcher.removeEventListener(stateEventListener, sourceClassName, actionType, propertyName); } function getDefaultTextFormat():TextFormat{ var textFormat = new TextFormat(); textFormat.font = "_sans"; textFormat.size = 12; return textFormat; } function getSRSInfo():SRSInfo { return srsInfo; } function reloadGIContext() { new_context = new GIContext(this, giClientConfig); } function onLoadGIContext():Void { gism = new GIS(gism.getGIClient(), new_context, srsInfo, gism.getActiveMap().getName()); stateEventDispatcher.dispatchEvent(new StateEvent(this, "Ruler", StateEvent.CHANGE, "context")); } }