#ifndef Scroll_H
#define Scroll_H

#include "Betriebssystem.h"
#include "ReferenceCounter.h"

namespace Framework
{
    class Bild;          //! Bild.h
    struct MausEreignis; //! MausEreignis.h

    struct ScrollData
    {
        int anzeige;
        int max;
        int scrollPos;
    };

    //! Die Baseklasse vür die Horizontale und Vertikale Scrollbar
    class ScrollBar : public virtual ReferenceCounter
    {
    protected:
        ScrollData* data;
        int knopfdruck;
        int farbe;
        int bgFarbe;
        bool bg;
        int klickScroll;
        int mx, my;
        bool mp;
        bool rend;

    public:
        //! Konstruktor
        DLLEXPORT ScrollBar();
        //! Destruktor
        DLLEXPORT virtual ~ScrollBar();
        //! Setzt die Fordergrundfarbe der Scrollbar
        //! \param fc Die Farbe in A8R8G8B8 Format
        DLLEXPORT void setFarbe(int fc);
        //! Setzt die Hintergrundfarbe der Scrollbar
        //! \param fc Die Farbe in A8R8G8B8 Format
        //! \param bgF 1, fals ein Hintergrund gezeichnet werden soll
        DLLEXPORT void setBgFarbe(int fc, bool bgF);
        //! Aktualisiert die Scrollbar
        //! \param maxGr Die Maximale Größe des Fensters in Pixeln
        //! \param anzeigeGr Die angezeigte Größe des Fensters in Pixeln
        DLLEXPORT void update(int maxGr, int anzeigeGr);
        //! Setzt die Scroll geschwindigkeit
        //! \param klickScroll Die anzahl an Pixeln, die pro Klick gescrollt
        //! werden
        DLLEXPORT void setKlickScroll(int klickScroll);
        //! Scrollt zu einer bestimmten Position
        //! \param pos Die Position in Pixeln im Fenster, ab der gezeichnet
        //! werden soll
        DLLEXPORT void scroll(int pos);
        //! Verarbeitet ein Maus Ereignis
        //! \param x Die X Position der Scroll Bar im Fenster
        //! \param y Die Y Position der Scroll Bar im Fenster
        //! \param br Die Breite der Scroll Bar
        //! \param hi Die Höhe der Scroll Bar
        //! \return 1, falls die Nachricht verarbeitet wurde. Setzt dafür nicht
        //! den verarbeitet flag des Maus Ereignisses
        DLLEXPORT virtual bool doMausMessage(
            int x, int y, int br, int hi, MausEreignis& me)
            = 0;
        //! Gibt zurück, ob sich die Scrollbar seit dem letzten Aufruf der
        //! Funktion verändert hat
        DLLEXPORT bool getRend();
        //! Zeichnet die Scrollbar
        //! \param x Die X Position der Scroll Bar
        //! \param y Die Y Position der Scroll Bar
        //! \param br Die Breite der Scroll Bar
        //! \param hi Die Höhe der Scroll Bar
        //! \param zRObj Das Bild, in das gezeichnet werden soll
        DLLEXPORT virtual void render(
            int x, int y, int br, int hi, Bild& zRObj) const = 0;
        //! Gibt einen zeiger auf die Scroll Daten zurück
        DLLEXPORT ScrollData* getScrollData() const;
        //! Gibt die Scroll geschwindigkeit zurück. Die Anzahl der gescrollten
        //! Pixel pro Klick
        DLLEXPORT int getKlickScroll() const;
        //! Gibt die Fordergrundfarbe der Scrollbar zurück
        DLLEXPORT int getFarbe() const;
        //! Gibt die Hintergrundfarbe der Scrollbar zurück
        DLLEXPORT int getBgFarbe() const;
        //! Gibt die aktuelle Scroll Position zurück
        DLLEXPORT int getScroll() const;
    };

    //! Eine vertikale Scrollbar, wie sie in manchen 2D GUI Zeichnungen des
    //! Frameworks verwendet wird
    class VScrollBar : public ScrollBar
    {
    public:
        //! Konstruktor
        DLLEXPORT VScrollBar();
        //! Destruktor
        DLLEXPORT virtual ~VScrollBar();
        //! Verarbeitet ein Maus Ereignis
        //! \param x Die X Position der Scroll Bar im Fenster
        //! \param y Die Y Position der Scroll Bar im Fenster
        //! \param br Die Breite der Scroll Bar
        //! \param hi Die Höhe der Scroll Bar
        //! \return 1, falls die Nachricht verarbeitet wurde. Setzt dafür nicht
        //! den verarbeitet flag des Maus Ereignisses
        DLLEXPORT bool doMausMessage(
            int x, int y, int br, int hi, MausEreignis& me) override;
        //! Zeichnet die Scrollbar
        //! \param x Die X Position der Scroll Bar
        //! \param y Die Y Position der Scroll Bar
        //! \param br Die Breite der Scroll Bar
        //! \param hi Die Höhe der Scroll Bar
        //! \param zRObj Das Bild, in das gezeichnet werden soll
        DLLEXPORT void render(
            int x, int y, int br, int hi, Bild& zRObj) const override;
    };

    //! Eine horizontale Scrollbar, wie sie in manchen 2D GUI Zeichnungen des
    //! Frameworks verwendet wird
    class HScrollBar : public ScrollBar
    {
    public:
        //! Konstruktor
        DLLEXPORT HScrollBar();
        //! Destruktor
        DLLEXPORT virtual ~HScrollBar();
        //! Verarbeitet ein Maus Ereignis
        //! \param x Die X Position der Scroll Bar im Fenster
        //! \param y Die Y Position der Scroll Bar im Fenster
        //! \param br Die Breite der Scroll Bar
        //! \param hi Die Höhe der Scroll Bar
        //! \return 1, falls die Nachricht verarbeitet wurde. Setzt dafür nicht
        //! den verarbeitet flag des Maus Ereignisses
        DLLEXPORT bool doMausMessage(
            int x, int y, int br, int hi, MausEreignis& me) override;
        //! Zeichnet die Scrollbar
        //! \param x Die X Position der Scroll Bar
        //! \param y Die Y Position der Scroll Bar
        //! \param br Die Breite der Scroll Bar
        //! \param hi Die Höhe der Scroll Bar
        //! \param zRObj Das Bild, in das gezeichnet werden soll
        DLLEXPORT void render(
            int x, int y, int br, int hi, Bild& zRObj) const override;
    };
} // namespace Framework

#endif