/* -*-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_GUIEVENTHANDLERVISITOR
#define OSGGA_GUIEVENTHANDLERVISITOR 1

#include <osgGA/Export>
#include <osgGA/GUIEventAdapter>
#include <osg/ref_ptr>

namespace osgGA{

// Some forward declarations
class GUIActionAdapter;
class GUIEventHandler;
class CompositeGUIEventHandler;
class MatrixManipulator;
class StateSetManipulator;

/**
Base class for visiting GUIEventHandlers.

A Default Visitor, (Might want to make it an Extrinsic Visitor at some point).
By default, it does nothing to the things it visits. Sub classes of this Visitor
need only override visit operations for the types of object they're interested in.

*/


class OSGGA_EXPORT GUIEventHandlerVisitor
{
    public:

        virtual void visit(GUIEventHandler&) {}
        virtual void visit(CompositeGUIEventHandler&);
        virtual void visit(MatrixManipulator&) {};
        virtual void visit(StateSetManipulator&) {};

        // Accessors

        /** Get the GUI EventAdapter associated with this GUIEventHandlerVisitor */
        const GUIEventAdapter *getGUIEventAdapter() {  return _gea.get(); }

        /** Get the GUI Action Adapter associated with this GEH Visitor */
        GUIActionAdapter *getGUIActionAdapter() { return _gaa; }

    protected:

        GUIEventHandlerVisitor(GUIEventAdapter* in, GUIActionAdapter* out):_gea(in),_gaa(out) {}
        virtual ~GUIEventHandlerVisitor() {}

    private:
  
        osg::ref_ptr<GUIEventAdapter> _gea;
        GUIActionAdapter*             _gaa; // Just a pointer. NOT owned by this object.

};

};

#endif
