/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield 
 *
 * This library is open source and may be redistributed and/or modified under  
 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or 
 * (at your option) any later version.  The full license is in LICENSE file
 * included with this distribution, and on the openscenegraph.org website.
 * 
 * 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 
 * OpenSceneGraph Public License for more details.
*/

#ifndef OSGGA_GUIEVENTADAPTER
#define OSGGA_GUIEVENTADAPTER 1 

#include <osg/Referenced>
#include <osgGA/Export>

namespace osgGA{


/**
Pure virtual base class for adapting platform specific events into
generic keyboard and mouse events. 

Used as GUI toolkit-independent input into GUIEventAdapters. Viewer
writers should subclass this base class to implement the functionality
to translate one of their GUI events, e.g. a Qt Event or an MFC Event,
as appropriate.
*/
class OSGGA_EXPORT GUIEventAdapter : public osg::Referenced
{
public:

        enum MouseButtonMask { 
                LEFT_MOUSE_BUTTON=1,
                MIDDLE_MOUSE_BUTTON=2,
                RIGHT_MOUSE_BUTTON=4
        };

        enum EventType {
                PUSH,
                RELEASE,
                DOUBLECLICK,
                DRAG,
                MOVE,
                KEYDOWN,
                KEYUP,
                FRAME,
                RESIZE,
                NONE
        };

	enum ModKeyMask {
	    MODKEY_LEFT_SHIFT  = 0x0001,
	    MODKEY_RIGHT_SHIFT = 0x0002,
	    MODKEY_LEFT_CTRL   = 0x0040,
	    MODKEY_RIGHT_CTRL  = 0x0080,
	    MODKEY_LEFT_ALT    = 0x0100,
	    MODKEY_RIGHT_ALT   = 0x0200,
	    MODKEY_LEFT_META   = 0x0400,
	    MODKEY_RIGHT_META  = 0x0800,
	    MODKEY_NUM_LOCK    = 0x1000,
	    MODKEY_CAPS_LOCK   = 0x2000,
            MODKEY_CTRL        = (MODKEY_LEFT_CTRL|MODKEY_RIGHT_CTRL),
            MODKEY_SHIFT       = (MODKEY_LEFT_SHIFT|MODKEY_RIGHT_SHIFT),
            MODKEY_ALT         = (MODKEY_LEFT_ALT|MODKEY_RIGHT_ALT),
            MODKEY_META        = (MODKEY_LEFT_META|MODKEY_RIGHT_META)
	};


        /** Get the EventType of the GUI event.*/
        virtual EventType getEventType() const = 0;

        /** key pressed, return -1 if inappr   opriate for this event. */
        virtual int getKey() const = 0;

        /** button pressed/released, return -1 if inappropriate for this event.*/
        virtual int getButton() const = 0;

        /** window minimum x. */
        virtual int getXmin() const = 0;

        /** window maximum x. */
        virtual int getXmax() const = 0;

        /** window minimum y. */
        virtual int getYmin() const = 0;

        /** window maximum y. */   
        virtual int getYmax() const = 0;

        /** current mouse x position.*/
        virtual int getX() const = 0;

        /** current mouse y position.*/
        virtual int getY() const = 0;

        /** current mouse button state */
        virtual unsigned int getButtonMask() const = 0;

        /** current modkey state */
        virtual unsigned int getModKeyMask() const = 0;

        /** time in seconds of event. */
        virtual double time() const = 0;

protected:

        GUIEventAdapter() {}

        /** Force users to create on heap, so that multiple referencing is safe.*/
        virtual ~GUIEventAdapter() {}

};

}

#endif
