/* -*-c++-*- */
/* osgEarth - Dynamic map generation toolkit for OpenSceneGraph
 * Copyright 2015 Pelican Mapping
 * http://osgearth.org
 *
 * osgEarth 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 of the License, or
 * (at your option) any later version.
 *
 * This program 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 program.  If not, see <http://www.gnu.org/licenses/>
 */

#ifndef OSGEARTHANNO_FEATURE_EDITING_H
#define OSGEARTHANNO_FEATURE_EDITING_H 1

#include <osgEarthAnnotation/AnnotationEditing>
#include <osgEarth/MapNode>
#include <osgGA/GUIEventHandler>
#include <osgViewer/View>

#include <osgEarthAnnotation/FeatureNode>

namespace osgEarth { namespace Annotation
{    
    /**
     * AddPointHandler is a GUIEventHandler that allows you to append points to a Feature's Geometry
     */
    struct OSGEARTHANNO_EXPORT AddPointHandler : public osgGA::GUIEventHandler 
    {
    public:
        /**
         * Constructs a new AddPointHandler
         * @param featureNode
         *      The FeatureNode
         */
        AddPointHandler(FeatureNode* featureNode);

        bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa );

        /**
         * Sets the mouse button used for adding new points
         */
        void setMouseButton( osgGA::GUIEventAdapter::MouseButtonMask mouseButton);

        /**
         * Gets the mouse button used for adding new points
         */
        osgGA::GUIEventAdapter::MouseButtonMask getMouseButton() const;

        void setIntersectionMask( osg::Node::NodeMask intersectionMask ) { _intersectionMask = intersectionMask; }
        osg::Node::NodeMask getIntersectionMask() const { return _intersectionMask;}


    private:
        bool addPoint( float x, float y, osgViewer::View* view );

        osgGA::GUIEventAdapter::MouseButtonMask _mouseButton;
        bool _mouseDown;
        bool _firstMove;

        osg::ref_ptr< FeatureNode > _featureNode;

        osg::Node::NodeMask _intersectionMask;
    };

    
    /**
     * Node you can add to your scene graph to edit the verts of a Feature's Geometry
     */
    class OSGEARTHANNO_EXPORT FeatureEditor : public AnnotationEditor
    {
    public:
         /**
         * Constructs a new FeatureEditor
         * @param featureNode
         *      The FeatureNode to edit         
         */
        FeatureEditor( FeatureNode* featureNode );

        /**
         *Gets the color of the draggers when they are selected
         */
        const osg::Vec4f& getPickColor() const;

        /**
         *Sets the color of the draggers when they are selected
         */
        void setPickColor( const osg::Vec4f& pickColor );

        /**
         *Gets the color of the draggers
         */
        const osg::Vec4f& getColor() const;

        /**
         *Sets the color of the draggers
         */
        void setColor( const osg::Vec4f& color );


        /**
         *Gets the dragger size
         */
        float getSize() const;

        /**
         *Sets the dragger size
         */
        void setSize( float size );


    protected:
        void init();

        osg::Vec4f _pickColor;
        osg::Vec4f _color;
        float _size;

        osg::ref_ptr< FeatureNode > _featureNode;        
    };

} } // namespace osgEarth::Annotation

#endif // OSGEARTHANNO_FEATURE_EDITING_H