#ifndef Knopf_H
#define Knopf_H

#include "TextFeld.h"

namespace Framework
{
    class TextFeld;      //! TextFeld.h
    class AlphaFeld;     //! AlphaFeld.h
    class Text;          //! Text.h
    class Schrift;       //! Schrift.h
    class Rahmen;        //! Rahmen.h
    class LTDBDatei;     //! Dateisystem.h
    class Knopf;         //! aus dieser Datei
    class KontrollKnopf; //! aus dieser Datei
    class TextRenderer;

    //! Eine Zeichnung des 2D GUI Frameworks, die einen Knopf zeichnet, den der
    //! Benutzer drücken kann
    class Knopf : public TextFeld
    {
    public:
        class Style : public ZeichnungHintergrund::Style
        {
        public:
            static const __int64 MehrfarbigText
                = 0x0010000; //! Legt fest, ob der Text des Knopfes mehrere
                             //! Farben haben darf
            static const __int64 KlickFarbe
                = 0x0020000; //! Legt fest, ob der Knopf während er gedrückt
                             //! wird eine Hintergrund Farbe hat
            static const __int64 KlickBild
                = 0x0040000; //! Legt fest, ob der Knopf während er gedrückt
                             //! wird ein Bild als Hintergrund hat
            static const __int64 KlickAlpha
                = 0x0080000; //! Legt fest, ob der Knopf während er gedrückt
                             //! wird für das Zeichnen des Hintergrundes alpha
                             //! blending verwendet
            static const __int64 KlickBuffer
                = 0x0100000; //! Legt fest, ob der Knopf während er gedrückt
                             //! wird einen Farbübergang besitzt

            static const __int64 Normal
                = Sichtbar | Erlaubt | Rahmen | Buffered | MehrfarbigText
                | KlickBuffer; //! Vereint di Flags Sichtbar, Erlaubt, Rahmen,
                               //! Buffered, MehrfarbigText, KlickBuffer
        };

    private:
        int klickFarbe;
        Bild* klickBild;
        AlphaFeld* klickBuffer;
        int klickIndex;
        //! Verarbeitet Maus Nachrichten
        //! \param me Das Ereignis, was durch die Mauseingabe ausgelößt wurde
        DLLEXPORT void doMausEreignis(MausEreignis& me, bool userRet) override;

    public:
        //! Konstruktor
        DLLEXPORT Knopf();
        //! Destruktor
        DLLEXPORT virtual ~Knopf();
        //! Setzt die Farbe, die als Hintergrund verwendet wird, wenn der Knopf
        //! gedrückt wird \param fc Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setKlickFarbe(int fc);
        //! Setzt das Hintergrund Bild durch kopieren, das verwendet wird, wenn
        //! der Knopf gedrückt wird \param bild Das Bild, das kopiert werden
        //! soll
        DLLEXPORT void setKlickBild(Bild* bild);
        //! Setzt einen Zeiger auf das Hintergrund Bild, das verwendet wird,
        //! wenn der Knopf gedrückt wird \param bild Das neue Bild
        DLLEXPORT void setKlickBildZ(Bild* bild);
        //! Setzt einen Zeiger auf den Farbübergang, der verwendet wird, wenn
        //! der Knopf gedrückt wird \param af Der neue Farbübergang
        DLLEXPORT void setKBZ(AlphaFeld* af);
        //! Setzt die Stärke des Farbübergangs, der verwendet wird, wenn der
        //! Knopf gedrückt wird \param st Die Stärke
        DLLEXPORT void setKBStrength(int st);
        //! Setzt die Farbe des Farbübergangs, der verwendet wird, wenn der
        //! Knopf gedrückt wird \param fc Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setKBFarbe(int fc);
        //! Verarbeitet Maus Nachrichten
        //! \param te Das Ereignis, was durch die Tastatur Eingabe ausgelößt
        //! wurde
        DLLEXPORT void doTastaturEreignis(TastaturEreignis& te) override;
        //! Zeichnet das Objekt nach zRObj, falls es sichtbar ist
        //! \param zRObj Das Bild, in welches gezeichnet werden soll
        DLLEXPORT void render(Bild& zRObj) override;
        //! Gibt die Hintergrund Farbe im A8R8G8B8 Format zurück, die verwendet
        //! wird, wenn der Knopf gedrückt wird
        DLLEXPORT int getKlickFarbe() const;
        //! Gibt das Hintergrund Bild zurück, das verwendet wird, wenn der Knopf
        //! gedrückt wird
        DLLEXPORT Bild* getKlickBild() const;
        //! Gibt das Hintergrund Bild ohne erhöhten Reference Counter zurück,
        //! das verwendet wird, wenn der Knopf gedrückt wird
        DLLEXPORT Bild* zKlickBild() const;
        //! Gibt den Farbübergang zurück, der verwendet wird, wenn der Knopf
        //! gedrückt wird
        DLLEXPORT AlphaFeld* getKB() const;
        //! Gibt den Farbübergang ohne erhöhten Reference Counter zurück, der
        //! verwendet wird, wenn der Knopf gedrückt wird
        DLLEXPORT AlphaFeld* zKB() const;
        //! Gibt die Farbe des Farbübergangs im A8R8G8B8 Format zurück, der
        //! verwendet wird, wenn der Knopf gedrückt wird
        DLLEXPORT int getKBFarbe() const;
        //! Gibt die Stärke des Farbübergangs zurück, der verwendet wird, wenn
        //! der Knopf gedrückt wird
        DLLEXPORT int getKBStrength() const;
        //! Kopiert den Knopf, so das er ohne auswirkungen auf das Original
        //! verändert werden kann
        DLLEXPORT Zeichnung* dublizieren() const override;
    };

    //! Eine Zeichnung des 2D GUI Frameworks, die einen Auswählbares Kästchen
    //! mit beschriftung zeichnet
    class KontrollKnopf : public ZeichnungHintergrund
    {
    public:
        class Style : public ZeichnungHintergrund::Style
        {
        public:
            static const __int64 Selected
                = 0x1000000; //! Legt fest, ob das Kästchen ausgewählt ist

            static const __int64 MehrfarbigText
                = 0x001000; //! Legt Fest, ob der Beschriftungs Text mehrfarbig
                            //! sein kann
            static const __int64 KlickFarbe
                = 0x002000; //! Legt fest, ob das Kästchen während ed gedrückt
                            //! wird eine Hintergrund Farbe hat
            static const __int64 KlickBild
                = 0x004000; //! Legt fest, ob das Kästchen beim Klicken ein
                            //! Hintergrund Bild hat
            static const __int64 KlickAlpha
                = 0x008000; //! Legt fest, ob für den Hintergrund des Kästchens
                            //! beim Klicken alpha blending verwendet wird
            static const __int64 KlickBuffer
                = 0x010000; //! Legt fest, ob das Kästchen beim Klicken einen
                            //! Farbübergang hat
            static const __int64 SelectFarbe
                = 0x020000; //! Legt fest, ob das Kästchen wärhend es ausgewählt
                            //! ist eine Hintergrund Farbe hat
            static const __int64 SelectBild
                = 0x040000; //! Legt fest, ob das Kästchen wärhend es ausgewählt
                            //! ist ein Hintergrund Bild hat
            static const __int64 SelectAlpha
                = 0x080000; //! Legt fest, ob das Kästchen wärhend es ausgewählt
                            //! ist für den Hintergrund alpha blending verwendet
            static const __int64 SelectBuffer
                = 0x100000; //! Legt fest, ob das Kästchen wärhend es ausgewählt
                            //! ist einen Farbübergang hat
            static const __int64 SelectText
                = 0x200000; //! Legt fest, ob das Kästchen wärhend es ausgewählt
                            //! ist eine andere Beschriftung hat
            static const __int64 MehrzeiligText
                = 0x400000; //! Legt fest, ob das Kästchen eine Mehrzeilige
                            //! Beschriftung haben kann

            static const __int64 MausKlick
                = 0x800000; //! Legt fest, ob gerade mit der Maus auf das
                            //! Kästchen geklickt wird. (Wird vom Kästchen
                            //! selbst verwaltet)

            static const __int64 Normal
                = Sichtbar | Erlaubt | Rahmen
                | KlickBuffer; //! Vereint die Flags Sichtbar, Erlaubt, Rahmen,
                               //! KlickBuffer
        };

    private:
        Text* txt;
        Text* sTxt;
        int sBgF;
        int kBgF;
        Bild* sBgB;
        Bild* kBgB;
        AlphaFeld* sAf;
        AlphaFeld* kAf;
        Bild* kasten;
        Bild* sKasten;
        TextRenderer* textRd;
        int sF;
        int sGr;
        //! Verarbeitet Maus Nachrichten
        //! \param me Das Ereignis, was durch die Mauseingabe ausgelößt wurde
        DLLEXPORT void doMausEreignis(MausEreignis& me, bool userRet) override;

    public:
        //! Konstruktor
        DLLEXPORT KontrollKnopf();
        //! Destruktor
        DLLEXPORT virtual ~KontrollKnopf();
        //! Setzt den Zeiger auf den Beschriftungs Text
        //! \param txt Der Text
        DLLEXPORT void setTextZ(Text* txt);
        //! Setzt den Beschriftungs Text
        //! \param txt Der Text
        DLLEXPORT void setText(Text* txt);
        //! Setzt den Beschriftungs Text
        //! \param txt Der Text
        DLLEXPORT void setText(const char* txt);
        //! Setzt den Zeiger auf den Beschriftungs Text, der angezeigt wird,
        //! während das Kästchen ausgewählt ist \param txt Der Text
        DLLEXPORT void setSTextZ(Text* txt);
        //! Setzt den Beschriftungs Text, der angezeigt wird, während das
        //! Kästchen ausgewählt ist \param txt Der Text
        DLLEXPORT void setSText(Text* txt);
        //! Setzt den Beschriftungs Text, der angezeigt wird, während das
        //! Kästchen ausgewählt ist \param txt Der Text
        DLLEXPORT void setSText(const char* txt);
        //! Setzt den verwendeten TextRenderer
        //! \param textRd Der Textrenderer
        DLLEXPORT void setTextRendererZ(TextRenderer* textRd);
        //! Setzt die Schrift, die für die Beschriftung verwendet werden soll
        //! \param schrift Die Schrift
        DLLEXPORT void setSchriftZ(Schrift* schrift);
        //! Setzt die Farbe der Schrift, die für die Beschriftung verwendet
        //! werden soll \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setSFarbe(int f);
        //! Setzt die Größe der Schrift, die für die Beschriftung verwendet
        //! werden soll \param f Die Höhe einer Zeile in Pixeln
        DLLEXPORT void setSSize(int gr);
        //! Setzt die Hintergrund Farbe, die verwendet wird, während das
        //! Kästchen ausgewählt ist \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setSBgFarbe(int f);
        //! Setzt die Hintergrund Farbe, die verwendet wird, während auf das
        //! Kästchen geklickt wird \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setKBgFarbe(int f);
        //! Setzt einen Zeiger auf das Hintergrund Bild, das verwendet wird,
        //! während das Kästchen ausgewählt ist \param b Das Bild
        DLLEXPORT void setSBgBildZ(Bild* b);
        //! Setzt das Hintergrund Bild durch kopieren, das verwendet wird,
        //! während das Kästchen ausgewählt ist \param b Das Bild, das kopiert
        //! werden soll
        DLLEXPORT void setSBgBild(Bild* b);
        //! Setzt einen Zeiger auf das Hintergrund Bild, das verwendet wird,
        //! während auf das Kästchen geklickt wird \param b Das Bild
        DLLEXPORT void setKBgBildZ(Bild* b);
        //! Setzt das Hintergrund Bild durch kopieren, das verwendet wird,
        //! während auf das Kästchen geklickt wird \param b Das Bild, das
        //! kopiert werden soll
        DLLEXPORT void setKBgBild(Bild* b);
        //! Setzt einen Zeiger auf den Farbübergang, der verwendet wird, während
        //! das Kästchen ausgewählt ist \param af Der Farbübergang
        DLLEXPORT void setSAlphaFeldZ(AlphaFeld* af);
        //! Setzt die Farbe des Farbübergangs, der verwendet wird, während das
        //! Kästchen ausgewählt ist \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setSAFFarbe(int f);
        //! Setzt die Stärke des Farbübergangs, der verwendet wird, während das
        //! Kästchen ausgewählt ist \param st Die Stärke
        DLLEXPORT void setSAFStrength(int st);
        //! Setzt einen Zeiger auf den Farbübergang, der verwendet wird, während
        //! auf das Kästchen geklickt wird \param af Der Farbübergang
        DLLEXPORT void setKAlphaFeldZ(AlphaFeld* af);
        //! Setzt die Farbe des Farbübergangs, der verwendet wird, während auf
        //! das Kästchen geklickt wird \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setKAFFarbe(int f);
        //! Setzt die Stärke des Farbübergangs, der verwendet wird, während auf
        //! das Kästchen geklickt wird \param st Die Stärke
        DLLEXPORT void setKAFStrength(int st);
        //! Lädt die Bilder "kasten.gif" und "skasten.gif" aus einer LTDB Datei
        //! Das Bild kasten.gif wird gezeichnet, wenn das Kästchen nicht
        //! ausgewählt ist. Das Bild skasten.gif wird gezeichnet, wenn das
        //! Kästchen ausgewählt wird \param zDat Die LTDB Datei
        DLLEXPORT void loadData(LTDBDatei* zDat);
        //! Lädt die Bilder "kasten.gif" und "skasten.gif" aus einer LTDB Datei
        //! Das Bild kasten.gif wird gezeichnet, wenn das Kästchen nicht
        //! ausgewählt ist. Das Bild skasten.gif wird gezeichnet, wenn das
        //! Kästchen ausgewählt wird \param ltdb Der Pfad zur LTDB Datei
        DLLEXPORT void loadData(const char* ltdb);
        //! Zeichnet das Objekt nach zRObj, falls es sichtbar ist
        //! \param zRObj Das Bild, in welches gezeichnet werden soll
        DLLEXPORT void render(Bild& zRObj) override;
        //! Gibt die beschriftung zurück
        DLLEXPORT Text* getText() const;
        //! Gibt die beschriftung ohne erhöhten Reference Counter zurück
        DLLEXPORT Text* zText() const;
        //! Gibt die beschriftung zurück, die verwendet wird, während das
        //! Kästchen ausgewählt ist
        DLLEXPORT Text* getSText() const;
        //! Gibt die beschriftung ohne erhöhten Reference Counter zurück, die
        //! verwendet wird, während das Kästchen ausgewählt ist
        DLLEXPORT Text* zSText() const;
        //! Gibt die verwendete Schrift zurück
        DLLEXPORT Schrift* getSchrift() const;
        //! Gibt die verwendete Schrift ohne Reference Counter zurück
        DLLEXPORT Schrift* zSchrift() const;
        //! Gibt die Schrift Farbe im A8R8G8B8 Format zurück
        DLLEXPORT int getSFarbe() const;
        //! Gibt die Schrift Größe zurück
        DLLEXPORT int getSSize() const;
        //! Gibt die Hintergrund Farbe im A8R8G8B8 Format zurück, die verwendet
        //! wird, während das Kästchen ausgewählt ist
        DLLEXPORT int getSBgFarbe() const;
        //! Gibt die Hintergrund Farbe im A8R8G8B8 Format zurück, die verwendet
        //! wird, während auf das Kästchen geklickt wird
        DLLEXPORT int getKBgFarbe() const;
        //! Gibt das Hintergrund Bild zurück, das verwendet wird, während das
        //! Kästchen ausgewählt ist
        DLLEXPORT Bild* getSBgBild() const;
        //! Gibt das Hintergrund Bild ohne erhöhten Reference Counter zurück,
        //! das verwendet wird, während das Kästchen ausgewählt ist
        DLLEXPORT Bild* zSBgBild() const;
        //! Gibt das Hintergrund Bild zurück, das verwendet wird, während auf
        //! das Kästchen geklickt wird
        DLLEXPORT Bild* getKBgBild() const;
        //! Gibt das Hintergrund Bild ohne erhöhten Reference Counter zurück,
        //! das verwendet wird, während auf das Kästchen geklickt wird
        DLLEXPORT Bild* zKBgBild() const;
        //! Gibt den Farbübergang zurück, der verwendet wird, während das
        //! Kästchen ausgewählt ist
        DLLEXPORT AlphaFeld* getSAlphaFeld() const;
        //! Gibt den Farbübergang ohne erhöhten Reference COunter zurück, der
        //! verwendet wird, während das Kästchen ausgewählt ist
        DLLEXPORT AlphaFeld* zSAlphaFeld() const;
        //! Gibt den Farbübergang zurück, der verwendet wird, während auf das
        //! Kästchen geklickt wird
        DLLEXPORT AlphaFeld* getKAlphaFeld() const;
        //! Gibt den Farbübergang ohne erhöhten Reference COunter zurück, der
        //! verwendet wird, während auf das Kästchen geklickt wird
        DLLEXPORT AlphaFeld* zKAlphaFeld() const;
    };
} // namespace Framework

#endif