#ifndef ToolTip_H
#define ToolTip_H

#include <functional>

#include "Array.h"
#include "Zeichnung.h"

namespace Framework
{
    class Schrift;       //! Schrift.h
    class Bild;          //! Bild.h
    class AlphaFeld;     //! AlphaFeld.h
    class Text;          //! Text.h
    class Rahmen;        //! Rahmen.h
    struct MausEreignis; //! MausEreignis.h
    class Bildschirm;    //! Bildschirm.h

#ifdef WIN32
#    pragma vtordisp(push, 2)
#endif
    class ToolTip : public ZeichnungHintergrund
    {
    private:
        RCArray<Zeichnung>* members;
        Punkt size;
        double animationSpeed;
        double warten;
        double wartenCount;
        double tval;
        bool mausIn;
        unsigned char alpha;
        bool sichtbar;
        bool zeichnen;
        bool mausIn2;
        Bildschirm* bildschirm;
        std::function<void(ToolTip*)> onShow;
        std::function<void(ToolTip*)> onHide;
        //! 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 ToolTip(Bildschirm* zSceen);
        //! Destruktor
        DLLEXPORT ~ToolTip();
        //! Fügt eine Zeichnung zum Tooltip hinzu
        //! \param m die neue Zeichnung
        DLLEXPORT void addMember(Zeichnung* m);
        //! Entfernt eine Zeichnung vom Tooltip
        //! \param m die Zeichnung
        DLLEXPORT void removeMember(Zeichnung* zM);
        //! Entfernt eine Zeichnung vom Tooltip
        //! \param i der Index der Zeichnung
        DLLEXPORT void removeMember(int i);
        //! setzt eine Funktion, die aufgerufen wird, sobald der Tooltip
        //! angezeigt wird \param onShow Die Funktion
        DLLEXPORT void setShowEvent(std::function<void(ToolTip*)> onShow);
        //! setzt eine Funktion, die aufgerufen wird, sobald der Tooltip nicht
        //! mehr angezeigt wird \param onShow Die Funktion
        DLLEXPORT void setHideEvent(std::function<void(ToolTip*)> onHide);
        //! Setzt die anzahl an Seunden, de gewartet wird bis der Tipp erscheint
        //! \param warten Die Anzahl an Sekunden
        DLLEXPORT void setWarten(double warten);
        //! Legt fest, wie schnell der Tipp erscheint
        //! \param speed Anzahl der Pixel, die pro Sekunde eingeblendet werden.
        //! (Standart: 250)
        DLLEXPORT void setAnimationSpeed(double speed);
        //! Legt Fest, ob die Maus in dem Zeichnung ist, zu dem der Tip gehört
        //! \param mausIn 1, wenn die Maus in dem Zeichnung ist. 0 sonst
        DLLEXPORT void setMausIn(bool mausIn);
        //! Setzt den Counter zurück, der zählt, wann der Tipp eingeblendet
        //! wird.
        DLLEXPORT void wartenReset();
        //! Legt fest, das das Zeichnung, zu dem der Tip gehört gezeichnet
        //! wurde, so dass der Tip auch gezeichnet werden könnte
        DLLEXPORT void setZeichnen();
        //! Aktualisiert den Tip. Wird vom Framework aufgerufen
        //! \param tickVal Die Zeit in sekunden, die seit dem lezten Aufruf
        //! dieser Funktion vergangen ist \return 1, wenn sich etwas verändert
        //! hat und das Bild neu gezeichnet werden muss. 0 sonst
        DLLEXPORT bool tick(double tickVal) override;
        //! Zeichnet den Tip nach zRObj, falls er sichtbar ist und das
        //! zugehörige Zeichnung ebenfalls gezeichnet wurde \param zRObj Das
        //! Bild, in welches gezeichnet werden soll
        DLLEXPORT void render(Bild& zRObj) override;
        //! Gibt einen Zeiger auf den Bildschirm ohne erhöhten Reference Counter
        //! zurück, so dem der Tooltip gehört.
        DLLEXPORT Bildschirm* zBildschirm() const;
        //! Gibt ein bestimmten member zurück (ohne erhöhten Reference Counter)
        //! \param i der Index des Members
        DLLEXPORT Zeichnung* zMember(int i) const;
        //! Gibt ein bestimmten member zurück
        //! \param i der Index des Members
        DLLEXPORT Zeichnung* getMember(int i) const;
        //! Gibt die Anzahl an Zeichnungen zurück, die zum Tooltip gehören
        DLLEXPORT int getMemberAnzahl() const;
        //! Erzeugt eine komplette kopie eines tooltips
        DLLEXPORT Zeichnung* dublizieren() const override;
    };
#ifdef WIN32
#    pragma vtordisp(pop)
#endif
} // namespace Framework

#endif