/*----------------    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.NullGeometry;
import nl.idgis.giclient.geoma.Point;
import nl.idgis.giclient.gis.Feature;
import nl.idgis.giclient.gis.Layer;
import nl.idgis.giclient.gui.mapviewer.MapFeature;
import nl.idgis.giclient.gui.mapviewer.MapGeometry;
import nl.idgis.giclient.gui.mapviewer.MapLayer;
import nl.idgis.giclient.gui.mapviewer.MapViewer;
import nl.idgis.giclient.modes.MapViewerAction;
import nl.idgis.giclient.gis.SelectableLayer;

class nl.idgis.giclient.modes.MapViewerEditCreate implements MapViewerAction {

    private var numMouseDowns:Number = 0;
    private var intervalID:Number = null;

    function resetNumMouseDowns():Void {
        if (numMouseDowns >= 1) {
            numMouseDowns = 0;
            clearInterval(intervalID);
        }
    }

    function enter(mapViewer:MapViewer):Void { }

    function exit(mapViewer:MapViewer):Void { }

    function performPress(mapViewer:MapViewer, pressX:Number, pressY:Number, point:Point):Void {
        if (numMouseDowns == 0) {
            intervalID = setInterval(this, "resetNumMouseDowns", 400);
        }
        numMouseDowns++;
        var double:Boolean = false;
        if (numMouseDowns == 2) {
            double = true;
            resetNumMouseDowns();
        }

        if (point == null) {
            point = mapViewer.pixel2Point(mapViewer._xmouse, mapViewer._ymouse);
        }
        if (mapViewer.getGeometryLayer().getSelectedMapGeometry() == null) {
            createGeometry(mapViewer, point);
        } else {
            var eventObject:Object = new Object();
            eventObject["mode"] = "Create";
            eventObject["type"] = "MouseDown";
            eventObject["double"] = double;
            eventObject["backKey"] = Key.isDown(Key.BACKSPACE);
            eventObject["point"] = point;
            mapViewer.getGeometryLayer().setSelectedMapGeometry(mapViewer.getGeometryLayer().getSelectedMapGeometry().performEvent(eventObject));
            if (double) {
                mapViewer.ruler.setActiveMode(mapViewer.ruler.getDefaultEditMode());
            }
        }
    }

    function performRelease(mapViewer:MapViewer):Void { }

    function performMouseUp(mapViewer:MapViewer):Void { }

    function performMouseMove(mapViewer:MapViewer):Void {
        var selectedMapGeometry:MapGeometry = mapViewer.getGeometryLayer().getSelectedMapGeometry();
        if (selectedMapGeometry != null) {
            var eventObject:Object = new Object();
            eventObject["mode"] = "Create";
            eventObject["type"] = "MouseMove";
            eventObject["point"] = mapViewer.pixel2Point(mapViewer._xmouse, mapViewer._ymouse);
            selectedMapGeometry.performEvent(eventObject);
        }
    }

    function performDrag(mapViewer:MapViewer):Void { }

    function onKeyPress(mapViewer:MapViewer):Void { }

    private function createGeometry(mapViewer:MapViewer, point:Point):Void {
        // TODO GENERIC IMPLEMENTATION
    }

    private function addGeometry(mapViewer:MapViewer, geometry:Geometry):Void {    	  
        var layer:SelectableLayer = mapViewer.ruler.getEditLayer();
        var currentFeature:Feature = layer.getCurrentFeature();
        if (currentFeature == null) {
            layer.addFeature(geometry);
        } else {
            if (currentFeature.getGeometry() instanceof NullGeometry) {
                currentFeature.setGeometry(geometry);
            } else {
                layer.addFeature(geometry);
            }
        }
    }

    private function setDrawingMapGeometry(mapViewer:MapViewer):Void {
        var editLayer:Layer = mapViewer.ruler.getEditLayer();
        var mapLayer:MapLayer = mapViewer.getMapLayer(editLayer);
        var mapFeature:MapFeature = mapLayer.getCurrentEditingMapFeature();
        mapViewer.getGeometryLayer().setSelectedMapGeometry(mapFeature.getMapGeometry());
    }

}