#ifndef MausEreignis_H
#define MausEreignis_H

#include "Vec3.h"
#include <functional>

namespace Framework
{
    const int M_Links = 0;
    const int M_Mitte = 1;
    const int M_Rechts = 2;
    const int ME_PLinks = 0;
    const int ME_PRechts = 1;
    const int ME_PMitte = 2;
    const int ME_RLinks = 3;
    const int ME_RRechts = 4;
    const int ME_RMitte = 5;
    const int ME_DKLinks = 6;
    const int ME_DKRechts = 7;
    const int ME_DKMitte = 8;
    const int ME_Betritt = 9;
    const int ME_Leaves = 10;
    const int ME_Bewegung = 11;
    const int ME_UScroll = 12;
    const int ME_DScroll = 13;
    const int ME_RScroll = 14;
    const int ME_LScroll = 15;

    //! Speichert eine bestimmte Mauseingabe des Nutzers
    struct MausEreignis
    {
        //! Art der Eingabe
        int id;
        //! X koordinate auf dem Bildschirm relativ zur Zeichnungposition
        int mx;
        //! Y Koordinate auf dem Bildschirm relativ zur Zeichnungposition
        int my;
        //! Speichert, ob die Eingabe bereits verarbeitet wurde
        bool verarbeitet;
        //! Speichert, ob sich das mausereignis innerhalb des Objektes befindet, welches dieses Objekt beinhaltet
        bool insideParent;
        //! original X koordinate
        int originalX;
        //! original Y koordinate
        int originalY;
    };

    //! Speichert eine bestimmte Mauseingabe des Nutzers
    struct MausEreignis3D
    {
        //! Art der Eingabe
        int id;
        //! Die Position der Maus in der Welt
        Vec3< float > pos;
        //! Die Richtung, in die die Kamera zeigt
        Vec3< float > dir;
        //! Speichert, ob die Eingabe bereits verarbeitet wurde
        bool verarbeitet;
    };

    typedef std::function< bool( void*, void*, MausEreignis ) > MausAktion;

    //! Standart Maus Ereinis Rückruffunktion
    //! \param param Ein beliebiger Parameter
    //! \param obj Die Zeichnung, welches diese Funktion aufruft
    //! \param te Das Mausereignis, welches verarbeitet werden soll
    //! \return (true), wenn aufrufende Zeichnung das Ereignis weiterverarbeiten soll. (false) sonnst.
    //! Gibt immer (true) zurück
    DLLEXPORT bool _ret1ME( void *param, void *obj, MausEreignis me );
    //! Standart Maus Ereinis Rückruffunktion
    //! \param param Ein beliebiger Parameter
    //! \param obj Die Zeichnung, welches diese Funktion aufruft
    //! \param te Das Mausereignis, welches verarbeitet werden soll
    //! \return (true), wenn aufrufende Zeichnung das Ereignis weiterverarbeiten soll. (false) sonnst.
    //! Gibt immer (true) zurück und schlüißt das Fenster, welches es aufgerufen hat (darf nur auf Fenstern gesetzt werden)
    DLLEXPORT bool _closeFensterME( void *param, void *obj, MausEreignis me );
}

#endif