#ifndef Scroll_H
#define Scroll_H

#include "OperatingSystem.h"
#include "ReferenceCounter.h"

namespace Framework
{
    class Image;          //! Image.h
    struct MouseEvent; //! MouseEvent.h

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

    //! The base class for horizontal and vertical scrollbars
    class ScrollBar : public virtual ReferenceCounter
    {
    protected:
        ScrollData* data;
        int knopfdruck;
        int color;
        int bgColor;
        bool bg;
        int clickScroll;
        int mx, my;
        bool mp;
        bool rend;

    public:
        //! Constructor
        DLLEXPORT ScrollBar();
        //! Destructor
        DLLEXPORT virtual ~ScrollBar();
        //! Sets the foreground color of the scrollbar
        //! \param fc The color in A8R8G8B8 format
        DLLEXPORT void setColor(int fc);
        //! Sets the background color of the scrollbar
        //! \param fc The color in A8R8G8B8 format
        //! \param bgF 1 if a background should be drawn
        DLLEXPORT void setBgColor(int fc, bool bgF);
        //! Updates the scrollbar
        //! \param maxGr The maximum size of the window in pixels
        //! \param anzeigeGr The displayed size of the window in pixels
        DLLEXPORT void update(int maxGr, int anzeigeGr);
        //! Sets the scroll speed
        //! \param clickScroll The number of pixels scrolled per click
        DLLEXPORT void setClickScroll(int clickScroll);
        //! Scrolls to a specific position
        //! \param pos The position in pixels in the window from which drawing
        //! should start
        DLLEXPORT void scroll(int pos);
        //! Processes a mouse event
        //! \param x The X position of the scroll bar in the window
        //! \param y The Y position of the scroll bar in the window
        //! \param br The width of the scroll bar
        //! \param hi The height of the scroll bar
        //! \return 1 if the message was processed. Does not set the
        //! processed flag of the mouse event
        DLLEXPORT virtual bool doMouseMessage(
            int x, int y, int br, int hi, MouseEvent& me)
            = 0;
        //! Returns whether the scrollbar has changed since the last call of
        //! this function
        DLLEXPORT bool getNeedRender();
        //! Draws the scrollbar
        //! \param x The X position of the scroll bar
        //! \param y The Y position of the scroll bar
        //! \param br The width of the scroll bar
        //! \param hi The height of the scroll bar
        //! \param zRObj The image to draw into
        DLLEXPORT virtual void render(
            int x, int y, int br, int hi, Image& zRObj) const = 0;
        //! Returns a pointer to the scroll data
        DLLEXPORT ScrollData* getScrollData() const;
        //! Returns the scroll speed. The number of pixels scrolled per click
        DLLEXPORT int getClickScroll() const;
        //! Returns the foreground color of the scrollbar
        DLLEXPORT int getColor() const;
        //! Returns the background color of the scrollbar
        DLLEXPORT int getBgColor() const;
        //! Returns the current scroll position
        DLLEXPORT int getScroll() const;
    };

    //! A vertical scrollbar, as used in some 2D GUI drawings of the
    //! framework
    class VScrollBar : public ScrollBar
    {
    public:
        //! Constructor
        DLLEXPORT VScrollBar();
        //! Destructor
        DLLEXPORT virtual ~VScrollBar();
        //! Processes a mouse event
        //! \param x The X position of the scroll bar in the window
        //! \param y The Y position of the scroll bar in the window
        //! \param br The width of the scroll bar
        //! \param hi The height of the scroll bar
        //! \return 1 if the message was processed. Does not set the
        //! processed flag of the mouse event
        DLLEXPORT bool doMouseMessage(
            int x, int y, int br, int hi, MouseEvent& me) override;
        //! Draws the scrollbar
        //! \param x The X position of the scroll bar
        //! \param y The Y position of the scroll bar
        //! \param br The width of the scroll bar
        //! \param hi The height of the scroll bar
        //! \param zRObj The image to draw into
        DLLEXPORT void render(
            int x, int y, int br, int hi, Image& zRObj) const override;
    };

    //! A horizontal scrollbar, as used in some 2D GUI drawings of the
    //! framework
    class HScrollBar : public ScrollBar
    {
    public:
        //! Constructor
        DLLEXPORT HScrollBar();
        //! Destructor
        DLLEXPORT virtual ~HScrollBar();
        //! Processes a mouse event
        //! \param x The X position of the scroll bar in the window
        //! \param y The Y position of the scroll bar in the window
        //! \param br The width of the scroll bar
        //! \param hi The height of the scroll bar
        //! \return 1 if the message was processed. Does not set the
        //! processed flag of the mouse event
        DLLEXPORT bool doMouseMessage(
            int x, int y, int br, int hi, MouseEvent& me) override;
        //! Draws the scrollbar
        //! \param x The X position of the scroll bar
        //! \param y The Y position of the scroll bar
        //! \param br The width of the scroll bar
        //! \param hi The height of the scroll bar
        //! \param zRObj The image to draw into
        DLLEXPORT void render(
            int x, int y, int br, int hi, Image& zRObj) const override;
    };
} // namespace Framework

#endif