#ifndef TastaturEreignis_H
#define TastaturEreignis_H

#include <functional>

#include "Betriebssystem.h"

namespace Framework
{
    //! Es wurde eine Taste runtergedrückt
    const int TE_Press = 0;
    //! Es wurde eine Taste losgelassen
    const int TE_Release = 1;
#ifdef WIN32
    const unsigned char T_Tab = VK_TAB;
    const unsigned char T_Enter = VK_RETURN;
    const unsigned char T_BackSpace = VK_BACK;
    const unsigned char T_Shift = VK_SHIFT;
    const unsigned char T_Strg = VK_CONTROL;
    const unsigned char T_Alt = VK_MENU;
    const unsigned char T_Pause = VK_PAUSE;
    const unsigned char T_Caps_Lock = VK_CAPITAL;
    const unsigned char T_Esc = VK_ESCAPE;
    const unsigned char T_Space = VK_SPACE;
    const unsigned char T_BildO = VK_PRIOR;
    const unsigned char T_BildU = VK_NEXT;
    const unsigned char T_Ende = VK_END;
    const unsigned char T_Pos1 = VK_HOME;
    const unsigned char T_Links = VK_LEFT;
    const unsigned char T_Oben = VK_UP;
    const unsigned char T_Rechts = VK_RIGHT;
    const unsigned char T_Unten = VK_DOWN;
    const unsigned char T_Druck = VK_PRINT;
    const unsigned char T_Einfg = VK_INSERT;
    const unsigned char T_Entf = VK_DELETE;
    const unsigned char T_F1 = VK_F1;
    const unsigned char T_F2 = VK_F2;
    const unsigned char T_F3 = VK_F3;
    const unsigned char T_F4 = VK_F4;
    const unsigned char T_F5 = VK_F5;
    const unsigned char T_F6 = VK_F6;
    const unsigned char T_F7 = VK_F7;
    const unsigned char T_F8 = VK_F8;
    const unsigned char T_F9 = VK_F9;
    const unsigned char T_F10 = VK_F10;
    const unsigned char T_F11 = VK_F11;
    const unsigned char T_F12 = VK_F12;
    const unsigned char T_Num = VK_NUMLOCK;
    const unsigned char T_Alt_Gr = VK_RMENU;
#else
    const unsigned char T_Tab = 0x09;
    const unsigned char T_Enter = 0x0D;
    const unsigned char T_BackSpace = 0x0B;
    const unsigned char T_Shift = 0x10;
    const unsigned char T_Strg = 0x11;
    const unsigned char T_Alt = 0x12;
    const unsigned char T_Pause = 0x13;
    const unsigned char T_Caps_Lock = 0x14;
    const unsigned char T_Esc = 0x1B;
    const unsigned char T_Space = 0x20;
    const unsigned char T_BildO = 0x21;
    const unsigned char T_BildU = 0x22;
    const unsigned char T_Ende = 0x23;
    const unsigned char T_Pos1 = 0x24;
    const unsigned char T_Links = 0x25;
    const unsigned char T_Oben = 0x26;
    const unsigned char T_Rechts = 0x27;
    const unsigned char T_Unten = 0x28;
    const unsigned char T_Druck = 0x2A;
    const unsigned char T_Einfg = 0x2D;
    const unsigned char T_Entf = 0x2E;
    const unsigned char T_F1 = 0x70;
    const unsigned char T_F2 = 0x71;
    const unsigned char T_F3 = 0x72;
    const unsigned char T_F4 = 0x73;
    const unsigned char T_F5 = 0x74;
    const unsigned char T_F6 = 0x75;
    const unsigned char T_F7 = 0x76;
    const unsigned char T_F8 = 0x77;
    const unsigned char T_F9 = 0x78;
    const unsigned char T_F10 = 0x79;
    const unsigned char T_F11 = 0x7A;
    const unsigned char T_F12 = 0x7B;
    const unsigned char T_Num = 0x90;
    const unsigned char T_Alt_Gr = 0xA5;
#endif

    //! Speichert den Input eines Nutzers auf der Tastatur
    struct TastaturEreignis
    {
        //! Art der Eingabe
        int id;
        //! Betroffene Taste
        char taste[3];
        //! virtual key code
        int virtualKey;
        //! (true), wenn die Eingabe bereits verarbeitet wurde. (false) sonnst
        bool verarbeitet;
    };

    typedef std::function<bool(void*, void*, TastaturEreignis)> TastaturAktion;

    //! Standart Tastatur Ereinis Rückruffunktion
    //! \param param Ein beliebiger Parameter
    //! \param obj Die Zeichnung, welches diese Funktion aufruft
    //! \param te Das Tastaturereignis, welches verarbeitet werden soll
    //! \return (true), wenn aufrufende Zeichnung das Ereignis weiterverarbeiten
    //! soll. (false) sonnst. Gibt immer (true) zurück
    DLLEXPORT bool _ret1TE(void* param, void* obj, TastaturEreignis te);
    //! Standart Tastatur Ereinis Rückruffunktion
    //! \param param Ein beliebiger Parameter
    //! \param obj Die Zeichnung, welches diese Funktion aufruft
    //! \param te Das Tastaturereignis, welches verarbeitet werden soll
    //! \return (true), wenn aufrufende Zeichnung das Ereignis weiterverarbeiten
    //! soll. (false) sonnst. Gibt nur (true) zurück, wenn die Taste zwischen
    //! '0' und '9' ist, oder zum Löschen oder Cursorbewegen dient
    DLLEXPORT bool _nurNummernTE(void* param, void* obj, TastaturEreignis te);
    //! Standart Tastatur Ereinis Rückruffunktion
    //! \param param Ein beliebiger Parameter
    //! \param obj Die Zeichnung, welches diese Funktion aufruft
    //! \param te Das Tastaturereignis, welches verarbeitet werden soll
    //! \return (true), wenn aufrufende Zeichnung das Ereignis weiterverarbeiten
    //! soll. (false) sonnst. Gibt nur (true) zurück, wenn die Taste zwischen
    //! '0' und '9' oder 'A' und 'F' ist, oder zum Löschen oder Cursorbewegen
    //! dient
    DLLEXPORT bool _nurHexTE(void* param, void* obj, TastaturEreignis te);
} // namespace Framework

#endif