/*---------------- 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.Geometry; import nl.idgis.giclient.geoma.LinearRing; import nl.idgis.giclient.geoma.MultiPolygon; import nl.idgis.giclient.geoma.Point; import nl.idgis.giclient.geoma.Polygon; import nl.idgis.giclient.gis.Feature; import nl.idgis.giclient.gis.Layer; import nl.idgis.giclient.gui.mapviewer.MapGeometry; import nl.idgis.giclient.gui.mapviewer.MapPoint; import nl.idgis.giclient.util.Pixel; import nl.idgis.giclient.config.Colors; import nl.idgis.giclient.gis.SelectableLayer; class nl.idgis.giclient.gui.mapviewer.MapPolygon extends MapGeometry { function performEvent(eventObject:Object):MapGeometry { var mapGeometry:MapGeometry = null; var mode:String = eventObject["mode"]; var type:String = eventObject["type"]; var double:Boolean = Boolean(eventObject["double"]); var delKey:Boolean = Boolean(eventObject["delKey"]); if ((mode == "GeneralEdit") && (type == "MouseDown")) { mapGeometry = passEvent(eventObject); if ((mapGeometry == this) && (delKey)) { //remove interior ring or polygon from multi? var pol:Polygon = Polygon(geometry); var innerRemoved:Boolean = false; var intRing:LinearRing = interiorRingHitted(pol, eventObject); if (intRing != null) { pol.removeInteriorRing(intRing); //trace("removeInteriorRing"); innerRemoved = true; this.onChangeGeometry("ADDREMOVE"); _root["apiInterpreter"].onChangeGeometry(geometry, true); // TODO EVENT MODEL draw(); } if (!innerRemoved) { var superGeometry:Geometry = geometry.getSuperGeometry(); if (superGeometry != null && superGeometry.getGeometries().length > 1) { superGeometry.removeGeometry(geometry); // TODO EVENT MODEL var parentGeometry = MapGeometry(_parent); //save parent, removed by onChangeGeometry _parent.onChangeGeometry("ADDREMOVE"); _root["apiInterpreter"].onChangeGeometry(superGeometry, true); // TODO EVENT MODEL parentGeometry.draw(); } } } else if ((mapGeometry == this) && (double)) { //trace("(mapGeometry == this) && (double)"); var pixel:Pixel = Pixel(eventObject["pixel"]); var point:Point = geometryLayer.getMapViewer().pixel2Point(pixel.getX(), pixel.getY()); var interiorRing:LinearRing = new LinearRing(point.getSRS(), new Array(point, point)); interiorRing.addPoint(new Point(point.getSRS(), point.getX(), point.getY())); Polygon(geometry).addInteriorRing(interiorRing); // TODO EVENT MODEL this.onChangeGeometry("ADDREMOVE"); geometryLayer.getMapViewer().ruler.setActiveMode(geometryLayer.getMapViewer().ruler.getCreateMode()); mapGeometry = MapGeometry(mapGeometries[mapGeometries.length - 1]); } else if (mapGeometry == this && !(double)) { //check if press applies to inner ring //trace("(mapGeometry == this) && !(double)"); var pol:Polygon = Polygon(geometry); var intRing:LinearRing = interiorRingHitted(pol, eventObject); if (intRing != null) { for (var i = 0; i < mapGeometries.length; i++) { if (MapGeometry(mapGeometries[i]).getGeometry() == intRing) { mapGeometry = MapGeometry(mapGeometries[i]); } } } } else if (double) { //trace("nl.idgis.giclient.gui.mapviewer.MapPolygon, GeneralEdit, MouseDown, double"); mapGeometry = MapPoint(_root.attachMovie("MapPoint", "boozoo", 123)); // WORKAROUND BOOZOO } } else if ((mode == "GeneralEdit") && (type == "MouseMove")) { var pol:Polygon = Polygon(geometry); var dx:Number = eventObject["dx"]; var dy:Number = eventObject["dy"]; var innerMoved:Boolean = false; var intRing:LinearRing = interiorRingHitted(pol, eventObject); if (intRing != null) { intRing.move(dx, dy); //trace("MoveInteriorRing"); innerMoved = true; } if (!innerMoved) { geometry.move(dx, dy); } // TODO EVENT MODEL this.onChangeGeometry(); mapGeometry = this; } else if ((mode == "Create") && (type == "MouseDown")) { var backKey:Boolean = Boolean(eventObject["backKey"]); var point:Point = Point(eventObject["point"]); if (!double) { if (backKey) { geometry.removePoint(null, false); } else { geometry.addPoint(point, false); } mapGeometry = this; } else { // Removes the point that was added at the first click of the double click. geometry.removePoint(null, false); if (labelText == "[ new member ]") { var editLayer:Layer = geometryLayer.getMapViewer().ruler.getEditLayer(); var currentFeature:Feature = SelectableLayer(editLayer).getCurrentFeature(); var currentGeometry:Geometry = currentFeature.getGeometry(); // CAN BE NULLGEOMETRY? var polygons:Array = new Array(currentGeometry, geometry); var multiPolygon:MultiPolygon = new MultiPolygon(currentGeometry.getSRS(), polygons); currentFeature.setGeometry(multiPolygon); _root["apiInterpreter"].onChangeGeometry(geometry, true); // TODO EVENT MODEL geometryLayer.removeMapGeometry(this); } _root["apiInterpreter"].onChangeGeometry(geometry, true); // TODO EVENT MODEL mapGeometry = null; } // TODO EVENT MODEL this.onChangeGeometry("ADDREMOVE"); this.draw(); } else if ((mode == "Create") && (type == "MouseMove")) { var point:Point = Point(eventObject["point"]); geometry.setPointXY(point.getX(), point.getY()); // TODO EVENT MODEL this.onChangeGeometry(); mapGeometry = this; } else if (mode == "CreateMember") { var point:Point = Point(eventObject["point"]); var polygon:Polygon = new Polygon(point.getSRS(), new LinearRing(point.getSRS(), new Array(point, point))); polygon.addPoint(new Point(point.getSRS(), point.getX(), point.getY())); mapGeometry = geometryLayer.addMapGeometry(polygon, MapGeometry.ACTIVE, color, "[ new member ]"); } return mapGeometry; } function drawAsNormal(geometry:Geometry, color:Number,fillOpacity:Number,lineThickness:Number):Void { clear(); var polygon:Polygon = Polygon(geometry); var linearRings:Array = polygon.getGeometries(); var linearRing:LinearRing = null; lineStyle(lineThickness, color, 100); beginFill(color, fillOpacity); //trace("linearRings.length : " + linearRings.length); for (var i:Number = 0; i < linearRings.length; i++) { var points:Array = LinearRing(linearRings[i]).getPoints(); var point:Point = Point(points[0]); var pixel:Pixel = geometryLayer.getMapViewer().point2Pixel(point.getX(), point.getY()); moveTo(pixel.getX(), pixel.getY()); for (var j:Number = 1; j < points.length; j++) { point = Point(points[j]); pixel = geometryLayer.getMapViewer().point2Pixel(point.getX(), point.getY()); lineTo(pixel.getX(), pixel.getY()); } } endFill(); } function drawAsActive(geometry:Geometry):Void { clear(); var polygon:Polygon = Polygon(geometry); var linearRings:Array = polygon.getGeometries(); var linearRing:LinearRing = null; lineStyle(1, Colors.currentColor, 100); beginFill(Colors.currentColor, Colors.currentFillOpacity); //trace("linearRings.length : " + linearRings.length); for (var i:Number = 0; i < linearRings.length; i++) { var points:Array = LinearRing(linearRings[i]).getPoints(); var point:Point = Point(points[0]); var pixel:Pixel = geometryLayer.getMapViewer().point2Pixel(point.getX(), point.getY()); moveTo(pixel.getX(), pixel.getY()); for (var j:Number = 1; j < points.length; j++) { point = Point(points[j]); pixel = geometryLayer.getMapViewer().point2Pixel(point.getX(), point.getY()); lineTo(pixel.getX(), pixel.getY()); } } endFill(); } function hitTest(x:Number, y:Number, shapeFlag:Boolean):Boolean { //perform hitTest without inner rings var polygon:Polygon = Polygon(geometry); var hit:Boolean = null; if (polygon.getNumInteriorRings() == 0) { hit = super.hitTest(x, y, true); } else { var ring_mc:MovieClip = _root.createEmptyMovieClip("outring_mc", this.getNextHighestDepth()); var outRing:LinearRing = polygon.getExteriorRing(); drawTransparentRing(ring_mc, outRing); hit = ring_mc.hitTest(x, y, true); ring_mc.removeMovieClip(); } //trace("nl.idgis.giclient.gui.mapviewer.MapPolygon.hitTest = " + hit); return hit; } private function drawTransparentRing(mc:MovieClip, linearRing:LinearRing):Void { mc.lineStyle(1, 0x000000, 1); mc.beginFill(0x000000, 1); var points:Array = linearRing.getPoints(); var point:Point = Point(points[0]); var pixel:Pixel = geometryLayer.getMapViewer().point2Pixel(point.getX(), point.getY()); mc.moveTo(pixel.getX(), pixel.getY()); //trace("mc.moveTo(pixel.getX(), pixel.getY(): " + pixel.getX() + ", " + pixel.getY()); //trace("points.length: " + points.length); for (var j:Number = 1; j < points.length; j++) { point = Point(points[j]); pixel = geometryLayer.getMapViewer().point2Pixel(point.getX(), point.getY()); mc.lineTo(pixel.getX(), pixel.getY()); } mc.endFill(); } private function interiorRingHitted(pol:Polygon, eventObject:Object):LinearRing { var intRing:LinearRing = null; var i:Number = 0; while (i < pol.getNumInteriorRings() && intRing == null) { var ring_mc:MovieClip = this.createEmptyMovieClip("intring_mc", this.getNextHighestDepth()); intRing = pol.getInteriorRing(i); drawTransparentRing(ring_mc, intRing); var pixel:Pixel = Pixel(eventObject["pixel"]); var x:Number = pixel.getX(); var y:Number = pixel.getY(); if (!(ring_mc.hitTest(x, y, true))) { intRing = null; //make null until hit } ring_mc.removeMovieClip(); i++; } return intRing; } }