/*---------------- 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.geoma.Point; import nl.idgis.giclient.gis.Feature; import nl.idgis.giclient.gis.FeatureGeometryListener; import nl.idgis.giclient.gis.Layer; import nl.idgis.giclient.gui.mapviewer.MapViewer; import nl.idgis.giclient.framework.buttons.ModeButtonConfig; import nl.idgis.giclient.modes.MapViewerCreateCircle; import nl.idgis.giclient.modes.MapViewerCreateEllipse; import nl.idgis.giclient.modes.MapViewerCreateMember; import nl.idgis.giclient.modes.MapViewerCreatePoint; import nl.idgis.giclient.modes.MapViewerCreatePolygon; import nl.idgis.giclient.modes.MapViewerCreateSquare; import nl.idgis.giclient.modes.MapViewerEditMove; import nl.idgis.giclient.modes.MapViewerInfo; import nl.idgis.giclient.modes.MapViewerPan; import nl.idgis.giclient.modes.MapViewerSelect; import nl.idgis.giclient.modes.MapViewerSelectByCircle; import nl.idgis.giclient.modes.MapViewerSelectByPolygon; import nl.idgis.giclient.modes.MapViewerSelectByPoint; import nl.idgis.giclient.modes.MapViewerSelectBySquare; import nl.idgis.giclient.modes.MapViewerSelectByFeature; import nl.idgis.giclient.modes.MapViewerSetCurrentFeature; import nl.idgis.giclient.modes.MapViewerWebInfo; import nl.idgis.giclient.modes.MapViewerPopupInfo; import nl.idgis.giclient.modes.MapViewerZoomIn; import nl.idgis.giclient.modes.MapViewerZoomOut; import nl.idgis.giclient.util.Pixel; import nl.idgis.giclient.util.SynchListener; import nl.idgis.giclient.util.URLTools; import nl.idgis.giclient.util.XMLTools; import mx.utils.Delegate; import nl.idgis.giclient.synch.SynchSocket; import nl.idgis.giclient.geoma.GMLFactory; import nl.idgis.giclient.io.XMLResponse; import nl.idgis.giclient.io.XMLResponseListener; import nl.idgis.giclient.io.XMLServer; import nl.idgis.giclient.Ruler; import nl.idgis.giclient.gis.SelectableLayer; import nl.idgis.giclient.webserviceconnector.giconnector.GIConnector; import nl.idgis.giclient.modes.MapViewerFeatureInfo; import nl.idgis.giclient.modes.MapViewerGML; class nl.idgis.giclient.modes.Mode implements SynchListener, FeatureGeometryListener, XMLResponseListener { private var name:String = ""; private var language:String = ""; private var ruler:Ruler = null; private var modeButtonConfig:ModeButtonConfig = null; private var customCursorURL:String = null; private var editMode:Boolean = false; private var geometryType:String = null; private var contextMenu:ContextMenu = null; private var snapSymbol:MovieClip = null; private var intID:Number = 0; private var contextMenuPosition:Pixel = null; //dummy variables to force compilation by MTASC private var mapViewerGML:MapViewerGML = null; private var mapViewerCreateCircle:MapViewerCreateCircle = null; private var mapViewerCreateEllipse:MapViewerCreateEllipse = null; private var mapViewerCreateMember:MapViewerCreateMember = null; private var mapViewerCreatePoint:MapViewerCreatePoint = null; private var mapViewerCreatePolygon:MapViewerCreatePolygon = null; private var mapViewerCreateSquare:MapViewerCreateSquare = null; private var mapViewerEditMove:MapViewerEditMove = null; private var mapViewerInfo:MapViewerInfo = null; private var mapViewerFeatureInfp:MapViewerFeatureInfo = null; private var mapViewerPan:MapViewerPan = null; private var mapViewerSelect:MapViewerSelect = null; private var mapViewerSelectByCircle:MapViewerSelectByCircle = null; private var mapViewerSelectByPolygon:MapViewerSelectByPolygon = null; private var mapViewerSelectByPoint:MapViewerSelectByPoint = null; private var mapViewerSelectBySquare:MapViewerSelectBySquare = null; private var mapViewerSelectByFeature:MapViewerSelectByFeature = null; private var mapViewerSetCurrentFeature:MapViewerSetCurrentFeature = null; private var mapViewerWebInfo:MapViewerWebInfo = null; private var mapViewerPopupInfo:MapViewerPopupInfo = null; private var mapViewerZoomIn:MapViewerZoomIn = null; private var mapViewerZoomOut:MapViewerZoomOut = null; function Mode(name:String, customCursorURL:String, mapViewerActionURL:String, editMode:Boolean, contextItemNodes:Array, language:String) { this.name = name; this.customCursorURL = customCursorURL; loadMapViewerAction(mapViewerActionURL); this.editMode = editMode; this.language = language; if (name == "CreatePointMode") { geometryType = "Point"; } else if (name == "CreateLineStringMode") { geometryType = "Line"; } else if (name == "CreatePolygonMode") { geometryType = "Polygon"; } else if (name == "CreateSquareMode") { geometryType = "Polygon"; } else if (name == "CreateEllipseMode") { geometryType = "Polygon"; } else if (name == "CreateCircleMode") { geometryType = "Polygon"; } loadContextMenu(contextItemNodes); } function setRuler(ruler:Ruler):Void { this.ruler = ruler; } function getGeometryType():String { return geometryType; } private function loadMapViewerAction(url:String):Void { if (_root["mapViewerActions"] == null) { _root.createEmptyMovieClip("mapViewerActions", 99); } var initObj:Object = new Object(); if(name=='ReportByCircleMode'||name=='ReportBySquareMode'|| name=='ReportByPolygonMode'||name=='ReportByFeatureMode'|| name=='ReportByPointMode'){ initObj["select"] = false; } URLTools.loadMovie(_root["mapViewerActions"], url, name, _root["mapViewerActions"].getNextHighestDepth(), initObj); } private function loadContextMenu(contextItemNodes) { contextMenu = new ContextMenu(); contextMenu.hideBuiltInItems(); if (contextItemNodes != null) { for (var i:Number = 0; i < contextItemNodes.length; i++) { var contextItemNode:XMLNode = contextItemNodes[i]; var name:String = XMLTools.getStringValue("name", contextItemNode); var menuTextNode:XMLNode = XMLTools.getChild("menuText", contextItemNode); var menuText:String = XMLTools.getStringValue(language, menuTextNode); if(menuText == null) menuText = XMLTools.getStringValue("en", menuTextNode); switch (name.toUpperCase()) { case "SNAP2POINT": var item:ContextMenuItem = new ContextMenuItem(menuText, snap2PointHandler); contextMenu.customItems.push(item); break; case "COORDINATEINPUT": var item:ContextMenuItem = new ContextMenuItem(menuText, Delegate.create(this, openCoordinateInputFrame)); contextMenu.customItems.push(item); break; default: _root["frameWork"].state("contextmenuitem-handler '" + name + "' unknown", 0); break; } } } } function getName():String { return name; } function setModeButtonConfig(modeButtonConfig:ModeButtonConfig):Void { this.modeButtonConfig = modeButtonConfig; } function getModeButtonConfig():ModeButtonConfig { return modeButtonConfig; } function getCustomCursorURL():String { return customCursorURL; } function getAction():Object { return _root["mapViewerActions"][name]; } function getContextMenu():ContextMenu { return contextMenu; } function isEditMode():Boolean { return editMode; } function snap2PointHandler() { var mapViewer:MapViewer = _root.mapViewer; //mind out: handler does not execute in the context of this mode //capture mouse position, because may change during processing (requestProperties) var thisMode:Mode = mapViewer.ruler.getActiveMode(); thisMode.contextMenuPosition = new Pixel(mapViewer._xmouse, mapViewer._ymouse); var mapFeatures:Array = mapViewer.getMapFeaturesUnderMousePointer(MapViewer.FRONTMOST_LAYER, false, false); if (mapFeatures.length == 0) return; var layer:SelectableLayer = SelectableLayer(mapFeatures[0]._parent._parent.getLayer()); var featureID:String = mapViewer.getFeatureID(mapFeatures[0]._name); var feature:Feature = layer.getFeature(featureID); //trace("snapped-id: " + feature.getID()); if ((feature.getGeometry() == null) || (feature.getGeometry() == undefined)) { feature.featureEventDispatcher.addFeatureGeometryListener(thisMode); feature.requestProperties(thisMode); } else { thisMode.snap2GeometryPoint(feature); } } function onChangeFeatureGeometry(feature:Feature):Void { //avoid unnecessary listening var mapViewer:MapViewer = _root.mapViewer; var thisMode:Mode = mapViewer.ruler.getActiveMode(); feature.featureEventDispatcher.removeFeatureGeometryListener(thisMode); thisMode.snap2GeometryPoint(feature); } function snap2GeometryPoint(feature:Feature):Void { var mapViewer:MapViewer = _root.mapViewer; //trace("contextMenuPosition: " + contextMenuPosition); var mousePixel:Pixel = contextMenuPosition; //trace("mousePixel: " + mousePixel); var mousePoint:Point = mapViewer.pixel2Point(mousePixel.getX(), mousePixel.getY()); //trace("mx: " + mousePoint.getX() + " my: " + mousePoint.getY()); var nearestPoint:Point = feature.getGeometry().getNearestPoint(mousePoint); var snapPoint:Point = new Point(nearestPoint.getSRS(), nearestPoint.getX(), nearestPoint.getY()); //trace("sx: " + snapPoint.getX() + " sy: " + snapPoint.getY()); var snapPixel:Pixel = mapViewer.point2Pixel(snapPoint.getX(), snapPoint.getY()); //trace("snapPixel: " + snapPixel); var distance:Number = snapPixel.getDistance(mousePixel); //trace("distance: " + distance); if (distance > 4) { return; } drawSnapLocation(snapPoint); getAction().performPress(mapViewer, 0, 0, snapPoint); } private function drawSnapLocation(snapPoint:Point):Void { var mapViewer:MapViewer = _root.mapViewer; removeSnapLocation(); //remove previous snapSymbol snapSymbol = mapViewer.createEmptyMovieClip("snap_mc", mapViewer.getNextHighestDepth()); var pixel:Pixel = mapViewer.point2Pixel(snapPoint.getX(), snapPoint.getY()); var snapColor:Number = 0xFFFF00; var lineThickness:Number = 2; snapSymbol.lineStyle(lineThickness, snapColor, 100); snapSymbol.moveTo(pixel.getX() - 4, pixel.getY()); snapSymbol.lineTo(pixel.getX() + 4, pixel.getY()); snapSymbol.moveTo(pixel.getX(), pixel.getY() - 4); snapSymbol.lineTo(pixel.getX(), pixel.getY() + 4); intID = setInterval(this, "removeSnapLocation", 10000); } private function removeSnapLocation() { clearInterval(intID); if (snapSymbol != null) snapSymbol.removeMovieClip(); } function onSynch(target:Object, action:String):Void { //ignore } function openCoordinateInputFrame():Void { var mapViewer:MapViewer = _root.mapViewer; var initObject:Object = new Object(); initObject = { scrollContent: "lib://CoordinateInputFrame", paneTitle: "Invoer coordinaten", isScrolling: false, resizable: false, hasShader: false, doorzichtig:false, _x:100, _y:100}; initObject["contentProperties"] = new Object(); initObject["contentProperties"]["ruler"] = ruler; initObject["contentProperties"]["synchSocket"] = new SynchSocket(this, inputXYHandler, null); _root.frameWork.makeFrame("coordinateInputFrame",initObject,360,120); } function inputXYHandler(synchObject:Object):Void { var mapViewer:MapViewer = _root.mapViewer; _root.frameWork["frames"]["coordinateInputFrame"].removeMovieClip(); if (Boolean(synchObject["confirmed"])) { var xInput:Number = Number(synchObject["xInput"]); var yInput:Number = Number(synchObject["yInput"]); var crs:String = String(synchObject["crs"]); var mapSrs:String = mapViewer.ruler.getGIS().getActiveMap().getSRS(); var point = new Point(crs, xInput,yInput); if(crs!=mapSrs){ transformPoint(point,crs, mapSrs); } else { getAction().performPress(mapViewer, 0, 0, point); } } } private function transformPoint(point:Point,fromSrs,toSrs:String ):Void{ var mapViewer:MapViewer = _root.mapViewer; var geometryNode:XMLNode = GMLFactory.createGeometryNode("transformPoint", point,fromSrs); var geometryXML:XML = new XML(); geometryXML.appendChild(geometryNode.firstChild); var serverRequest:String = "request=Transform&toSRS=" + toSrs; var xmlServer:XMLServer = new XMLServer(GIConnector(ruler.getGIS().getTransformConnector()).getURL()); xmlServer.postAndLoad(geometryXML, this, serverRequest, null); } function onLoadXMLResponse(xmlResponse:XMLResponse):Void { var mapViewer:MapViewer = _root.mapViewer; var point:Point = Point(GMLFactory.parseGML(xmlResponse.firstChild)); getAction().performPress(mapViewer, 0, 0, point); } }