#ifndef SelectionBox_H
#define SelectionBox_H

#include "Array.h"
#include "Drawing.h"

namespace Framework
{
    class TextField;   //! TextField.h
    class VScrollBar; //! Scroll.h
    class Border;     //! Border.h
    class Button;      //! Button.h
    class AlphaField;  //! AlphaField.h
    class Text;       //! Tet.h
    class Font;    //! Font.h
    class TextRenderer;

    //! A 2D GUI Framework drawing. Represents a box from which
    //! the user can select different values by expanding it
    class SelectionBox : public DrawableBackground
    {
    public:
        class Style : public DrawableBackground::Style
        {
        public:
            //! If this flag is set, each value in the list has a border
            static const __int64 FieldBorder = 0x000001000;
            //! If this flag is set, each value in the list has a background
            static const __int64 FieldBackground = 0x000002000;
            //! If this flag is set, each value in the list has an image
            //! as background
            static const __int64 FieldHImage = 0x000004000;
            //! If this flag is set, each value in the list has a
            //! transparent background
            static const __int64 FieldHAlpha = 0x000008000;
            //! If this flag is set, each value in the list has a
            //! color gradient
            static const __int64 FieldBuffer = 0x000010000;
            //! If this flag is set, the currently selected value
            //! gets a background
            static const __int64 SelectionBackground = 0x000020000;
            //! If this flag is set, the currently selected value
            //! gets a background image
            static const __int64 SelectionHImage = 0x000040000;
            //! If this flag is set, the currently selected value
            //! gets a transparent background
            static const __int64 SelectionHAlpha = 0x000080000;
            //! If this flag is set, the currently selected value
            //! gets a color gradient
            static const __int64 SelectionBuffer = 0x000100000;
            //! If this flag is set, the currently selected value
            //! gets a border
            static const __int64 SelectionBorder = 0x000200000;
            //! If this flag is set, each value has its own backgrounds
            //! and borders instead of sharing the same ones
            static const __int64 MultiStyled = 0x000400000;
            //! Sets a maximum height for the expanded list. A scrollbar
            //! appears automatically when there are more elements than
            //! can be visible
            static const __int64 MaxHeight = 0x004000000;
            //! If this flag is set, the element the mouse is pointing
            //! at has a background
            static const __int64 MouseBackground = 0x008000000;
            //! If this flag is set, the element the mouse is pointing
            //! at has a background image
            static const __int64 MouseHImage = 0x010000000;
            //! If this flag is set, the element the mouse is pointing
            //! at has a transparent background
            static const __int64 MouseHAlpha = 0x020000000;
            //! If this flag is set, the element the mouse is pointing
            //! at has a color gradient
            static const __int64 MouseBuffer = 0x040000000;
            //! If this flag is set, the element the mouse is pointing
            //! at has a border
            static const __int64 MouseBorder = 0x080000000;
            //! const int NachObenDropDownen	= 0x100000000;
            //! const int AutoDropDownRichtung	= 0x200000000;

            //! Normal style: Visible, Enabled, Border, FieldBorder,
            //! SelectionBuffer, SelectionBorder, MaxHeight, VScroll,
            //! MouseBorder, MouseBuffer
            static const __int64 Normal
                = Visible | Allowed | Border | FieldBorder | SelectionBuffer
                | SelectionBorder | MaxHeight | VScroll | MouseBorder | MouseBuffer
                | Background | MEIgnoreParentInside | MEIgnoreProcessed;
        };

    private:
        TextRenderer* textRd;
        Array<__int64>* msStyle;
        RCArray<TextField>* members;
        Button* ausfahren;
        Border* selBorder;
        int selBgF;
        Image* selBgB;
        AlphaField* selAf;
        RCArray<Border>* msSelBorder;
        Array<int>* msSelBgF;
        RCArray<Image>* msSelBgB;
        RCArray<AlphaField>* msSelAf;
        Border* mouseBorder;
        int mouseBgF;
        Image* mouseBgB;
        AlphaField* mouseAf;
        RCArray<Border>* msMouseBorder;
        Array<int>* msMouseBgF;
        RCArray<Image>* msMouseBgB;
        RCArray<AlphaField>* msMouseAf;
        int anzahl;
        int selection;
        bool ausgeklappt;
        int ausklappHeight;
        int ausklapMaxHeight;
        int entryHeight;
        double tickval;
        int mouseEntry;
        bool scrollAnzeigen;
        void* eAkP;
        std::function<void(void*, SelectionBox*, int, int)> eAk;
        //! Processes mouse messages
        //! \param me The event triggered by the mouse input
        DLLEXPORT void doMouseEvent(MouseEvent& me, bool userRet) override;

    public:
        //! Constructor
        DLLEXPORT SelectionBox();
        //! Destructor
        DLLEXPORT virtual ~SelectionBox();
        //! Sets the parameter of the callback function that is called when
        //! the user selects a new element \param p The parameter
        DLLEXPORT void setEventParam(void* p);
        //! Sets the callback function that is called when the user
        //! selects a new element \param eAk The callback function call:
        //! eAk( parameter, this, 0, selectionIndex )
        DLLEXPORT void setEventAktion(
            std::function<void(void*, SelectionBox*, int, int)> event);
        //! Sets the used TextRenderer
        //! \param textRd The text renderer
        DLLEXPORT void setTextRendererZ(TextRenderer* textRd);
        //! Sets the used font
        //! \param font The font
        DLLEXPORT void setFontZ(Font* font);
        //! Adds a selectable entry to the list. The first entry is
        //! automatically selected at the beginning \param txt The text of
        //! the entry
        DLLEXPORT void addEntry(const char* txt);
        //! Adds a selectable entry to the list. The first entry is
        //! automatically selected at the beginning \param txt The text of
        //! the entry
        DLLEXPORT void addEntry(Text* txt);
        //! Adds a selectable entry to the list. The first entry is
        //! automatically selected at the beginning \param txt A pointer to
        //! the entry
        DLLEXPORT void addEntryZ(TextField* txt);
        //! Changes the text of an entry
        //! \param i The index of the entry
        //! \param txt The new text
        DLLEXPORT void setEntry(int i, const char* txt);
        //! Changes the text of an entry
        //! \param i The index of the entry
        //! \param txt The new text
        DLLEXPORT void setEntry(int i, Text* txt);
        //! Changes an entry
        //! \param i The index of the entry
        //! \param txt A pointer to the new entry
        DLLEXPORT void setEntryZ(int i, TextField* txt);
        //! Deletes an entry
        //! \param i The index of the entry
        DLLEXPORT void removeEntry(int i);
        //! Sets a pointer to the button used for expanding and collapsing
        //! the list \param ausK The button
        DLLEXPORT void setDropDownButtonZ(Button* ausK);
        //! Sets a pointer to a border used for a specific entry
        //! \param i The index of the entry \param border The border
        DLLEXPORT void setEntryBorderZ(int i, Border* border);
        //! Sets the color of a border used for a specific entry
        //! \param i The index of the entry \param f The color in
        //! A8R8G8B8 format
        DLLEXPORT void setEntryBorderColor(int i, int f);
        //! Sets the width of a border used for a specific entry
        //! \param i The index of the entry \param rbr The width
        //! of the border in pixels
        DLLEXPORT void setEntryBorderWidth(int i, int rbr);
        //! Sets a background color used for a specific entry
        //! \param i The index of the entry \param f The color in
        //! A8R8G8B8 format
        DLLEXPORT void setEntryBackgroundColor(int i, int f);
        //! Sets a pointer to a background image used for a specific
        //! entry \param i The index of the entry
        //! \param bgB The background image
        DLLEXPORT void setEntryBackgroundImageZ(int i, Image* bgB);
        //! Sets a background image by copying, used for a specific
        //! entry \param i The index of the entry \param bgB The
        //! background image
        DLLEXPORT void setEntryBackgroundImage(int i, Image* bgB);
        //! Sets a pointer to a color gradient used for a specific
        //! entry \param i The index of the entry \param af The
        //! color gradient
        DLLEXPORT void setEntryAlphaFieldZ(int i, AlphaField* af);
        //! Sets the color of a color gradient used for a specific
        //! entry \param i The index of the entry \param afF The
        //! color in A8R8G8B8 format
        DLLEXPORT void setEntryAlphaFieldColor(int i, int afF);
        //! Sets the strength of a color gradient used for a specific
        //! entry \param i The index of the entry \param afSt The
        //! strength
        DLLEXPORT void setEntryAlphaFieldStrength(int i, int afSt);
        //! Sets a pointer to a border used for the selected entry
        //! \param border The border
        DLLEXPORT void setSelBorderZ(Border* border);
        //! Sets the color of a border used for the selected entry
        //! \param f The color in A8R8G8B8 format
        DLLEXPORT void setSelBorderColor(int f);
        //! Sets the width of a border used for the selected entry
        //! \param rbr The width in pixels
        DLLEXPORT void setSelBorderWidth(int rbr);
        //! Sets the background color used for the selected entry
        //! \param f The color in A8R8G8B8 format
        DLLEXPORT void setSelBackgroundColor(int f);
        //! Sets a pointer to a background image used for the selected
        //! entry \param bgB The image
        DLLEXPORT void setSelBackgroundImageZ(Image* bgB);
        //! Sets a background image by copying, used for the selected
        //! entry \param bgB The image
        DLLEXPORT void setSelBackgroundImage(Image* bgB);
        //! Sets a pointer to a color gradient used for the selected
        //! entry \param af The color gradient
        DLLEXPORT void setSelAlphaFieldZ(AlphaField* af);
        //! Sets the color of a color gradient used for the selected
        //! entry \param afF The color in A8R8G8B8 format
        DLLEXPORT void setSelAlphaFieldColor(int afF);
        //! Sets the strength of a color gradient used for the selected
        //! entry \param afSt The strength
        DLLEXPORT void setSelAlphaFieldStrength(int afSt);
        //! Sets a pointer to a border used with the MultiStyled flag
        //! when selecting a specific entry \param i
        //! The index of the entry \param border The border
        DLLEXPORT void setMsSelBorderZ(int i, Border* border);
        //! Sets the color of a border used with the MultiStyled flag when
        //! selecting a specific entry \param i The index
        //! of the entry \param f The color in A8R8G8B8 format
        DLLEXPORT void setMsSelBorderColor(int i, int f);
        //! Sets the width of a border used with the MultiStyled flag when
        //! selecting a specific entry \param i The
        //! index of the entry \param rbr The width in pixels
        DLLEXPORT void setMsSelBorderWidth(int i, int rbr);
        //! Sets the background color used with the MultiStyled flag when
        //! selecting a specific entry \param i The index
        //! of the entry \param f The color in A8R8G8B8 format
        DLLEXPORT void setMsSelBackgroundColor(int i, int f);
        //! Sets a pointer to a background image used with the MultiStyled
        //! flag when selecting a specific entry
        //! \param i The index of the entry
        //! \param bgB The image
        DLLEXPORT void setMsSelBackgroundImageZ(int i, Image* bgB);
        //! Sets a background image by copying, used with the MultiStyled
        //! flag when selecting a specific entry
        //! \param i The index of the entry
        //! \param bgB The image
        DLLEXPORT void setMsSelBackgroundImage(int i, Image* bgB);
        //! Sets a pointer to a color gradient used with the MultiStyled
        //! flag when selecting a specific entry
        //! \param i The index of the entry
        //! \param af The color gradient
        DLLEXPORT void setMsSelAlphaFieldZ(int i, AlphaField* af);
        //! Sets the color of a color gradient used with the MultiStyled flag
        //! when selecting a specific entry \param i The
        //! index of the entry \param afF The color in A8R8G8B8 format
        DLLEXPORT void setMsSelAlphaFieldColor(int i, int afF);
        //! Sets the strength of a color gradient used with the MultiStyled
        //! flag when selecting a specific entry \param i
        //! The index of the entry \param afSt The strength
        DLLEXPORT void setMsSelAlphaFieldStrength(int i, int afSt);
        //! Sets a pointer to a border used for the entry the mouse is
        //! pointing at \param border The border
        DLLEXPORT void setMouseBorderZ(Border* border);
        //! Sets the color of a border used for the entry the mouse is
        //! pointing at \param f The color in A8R8G8B8 format
        DLLEXPORT void setMouseBorderColor(int f);
        //! Sets the width of a border used for the entry the mouse is
        //! pointing at \param rbr The width of the border in pixels
        DLLEXPORT void setMouseBorderWidth(int rbr);
        //! Sets the background color used for the entry the mouse is
        //! pointing at \param f The color in A8R8G8B8 format
        DLLEXPORT void setMouseBackgroundColor(int f);
        //! Sets a pointer to a background image used for the entry the mouse
        //! is pointing at \param bgB The image
        DLLEXPORT void setMouseBackgroundImageZ(Image* bgB);
        //! Sets a background image by copying, used for the entry the mouse
        //! is pointing at \param bgB The image
        DLLEXPORT void setMouseBackgroundImage(Image* bgB);
        //! Sets a color gradient used for the entry the mouse is pointing
        //! at \param af The color gradient
        DLLEXPORT void setMouseAlphaFieldZ(AlphaField* af);
        //! Sets the color of a color gradient used for the entry the mouse
        //! is pointing at \param afF The color in A8R8G8B8 format
        DLLEXPORT void setMouseAlphaFieldColor(int afF);
        //! Sets the strength of a color gradient used for the entry the mouse
        //! is pointing at \param afSt The strength
        DLLEXPORT void setMouseAlphaFieldStrength(int afSt);
        //! Sets a pointer to a border used with the MultiStyled flag for a
        //! specific entry the mouse is pointing at
        //! \param i The index of the entry
        //! \param border The border
        DLLEXPORT void setMsMouseBorderZ(int i, Border* border);
        //! Sets the color of a border used with the MultiStyled flag for a
        //! specific entry the mouse is pointing at \param i
        //! The index of the entry \param f The color in A8R8G8B8 format
        DLLEXPORT void setMsMouseBorderColor(int i, int f);
        //! Sets the width of a border used with the MultiStyled flag for a
        //! specific entry the mouse is pointing at
        //! \param i The index of the entry
        //! \param rbr The width in pixels
        DLLEXPORT void setMsMouseBorderWidth(int i, int rbr);
        //! Sets the background color used with the MultiStyled flag for a
        //! specific entry the mouse is pointing at \param i
        //! The index of the entry \param f The color in A8R8G8B8 format
        DLLEXPORT void setMsMouseBackgroundColor(int i, int f);
        //! Sets a pointer to a background image used with the MultiStyled
        //! flag for a specific entry the mouse is pointing at
        //! \param i The index of the entry \param bgB The image
        DLLEXPORT void setMsMouseBackgroundImageZ(int i, Image* bgB);
        //! Sets a background image by copying, used with the MultiStyled
        //! flag for a specific entry the mouse is pointing at
        //! \param i The index of the entry \param bgB The image
        DLLEXPORT void setMsMouseBackgroundImage(int i, Image* bgB);
        //! Sets a pointer to a color gradient used with the MultiStyled
        //! flag for a specific entry the mouse is pointing at
        //! \param i The index of the entry \param af The color gradient
        DLLEXPORT void setMsMouseAlphaFieldZ(int i, AlphaField* af);
        //! Sets the color of a color gradient used with the MultiStyled
        //! flag for a specific entry the mouse is pointing at
        //! \param i The index of the entry
        //! \param afF The color in A8R8G8B8 format
        DLLEXPORT void setMsMouseAlphaFieldColor(int i, int afF);
        //! Sets the strength of a color gradient used with the MultiStyled
        //! flag for a specific entry the mouse is pointing at
        //! \param i The index of the entry
        //! \param afSt The strength
        DLLEXPORT void setMsMouseAlphaFieldStrength(int i, int afSt);
        //! Selects an element
        //! \param i The index of the element
        DLLEXPORT void setSelection(int i);
        //! Expands the list for selection
        DLLEXPORT void expand();
        //! Collapses the list
        DLLEXPORT void collapse();
        //! Scrolls in the list to a specific entry
        //! \param i The index of the entry
        DLLEXPORT void scrollToEntry(int i);
        //! Sets the maximum expansion height of the list
        //! \param maxHeight The maximum height in pixels
        DLLEXPORT void setMaxAuskappHeight(int maxHeight);
        //! Sets the height of the entries
        //! \param height The height in pixels
        DLLEXPORT void setEntryHeight(int height);
        //! Adds styles to a specific entry if the MultiStyled flag
        //! is set \param i The index of the entry \param
        //! abStyle The style to add
        DLLEXPORT void addMsStyle(int i, __int64 abStyle);
        //! Sets styles of a specific entry if the MultiStyled flag
        //! is set \param i The index of the entry \param abStyle The
        //! style \param add 1 if the styles should be added,
        //! 0 if they should be removed
        DLLEXPORT void setMsStyle(int i, __int64 abStyle, bool add);
        //! Replaces the styles of a specific entry if the MultiStyled
        //! flag is set \param i The index of the entry \param
        //! abStyle The new style
        DLLEXPORT void setMsStyle(int i, __int64 abStyle);
        //! Removes styles from a specific entry if the MultiStyled
        //! flag is set \param i The index of the entry \param
        //! abStyle The style to remove
        DLLEXPORT void removeMsStyle(int i, __int64 abStyle);
        //! Updates the object. Called by the framework
        //! \param tickVal The time in seconds since the last call
        //! of this function \return 1 if something changed
        //! and the image needs to be redrawn. 0 otherwise
        DLLEXPORT bool tick(double tickVal) override;
        //! Processes keyboard messages
        //! \param te The event triggered by the keyboard input
        DLLEXPORT void doKeyboardEvent(KeyboardEvent& te) override;
        //! Draws the object to zRObj if it is visible
        //! \param zRObj The image to draw into
        DLLEXPORT void render(Image& zRObj) override;
        //! Returns the index of an entry
        //! \param txt The text of the entry
        DLLEXPORT int getEntryPos(const char* txt) const;
        //! Returns the index of an entry
        //! \param txt The text of the entry
        DLLEXPORT int getEntryPos(Text* txt) const;
        //! Returns the text of an entry
        //! \param i The index of the entry
        DLLEXPORT Text* getEntryText(int i) const;
        //! Returns the text of an entry without increased reference counter
        //! \param i The index of the entry
        DLLEXPORT Text* zEntryText(int i) const;
        //! Returns an entry
        //! \param i The index of the entry
        DLLEXPORT TextField* getEntry(int i) const;
        //! Returns an entry without increased reference counter
        //! \param i The index of the entry
        DLLEXPORT TextField* zEntry(int i) const;
        //! Returns the index of the selected entry
        DLLEXPORT int getSelection() const;
        //! Returns the number of entries
        DLLEXPORT int getEntryCount() const;
        //! Returns whether the list is currently expanded
        DLLEXPORT bool isExpanded() const;
        //! Returns the maximum height of the expanded list
        DLLEXPORT int getMaxHeight() const;
        //! Returns the height of an entry
        DLLEXPORT int getEntryHeight() const;
        //! Returns the button used for expanding and collapsing the list
        DLLEXPORT Button* getDropDownButton() const;
        //! Returns the button without increased reference counter used for
        //! expanding and collapsing the list
        DLLEXPORT Button* zDropDownButton() const;
        //! Returns the border of an entry
        //! \param i The index of the entry
        DLLEXPORT Border* getEntryBorder(int i) const;
        //! Returns the border of an entry without increased reference counter
        //! \param i The index of the entry
        DLLEXPORT Border* zEntryBorder(int i) const;
        //! Returns the color of a border of an entry in A8R8G8B8 format
        //! \param i The index of the entry
        DLLEXPORT int getEntryBorderColor(int i) const;
        //! Returns the width of a border of an entry
        //! \param i The index of the entry
        DLLEXPORT int getEntryBorderWidth(int i) const;
        //! Returns the color gradient of an entry
        //! \param i The index of the entry
        DLLEXPORT AlphaField* getEntryAlphaField(int i) const;
        //! Returns the color gradient of an entry without increased reference
        //! counter \param i The index of the entry
        DLLEXPORT AlphaField* zEntryAlphaField(int i) const;
        //! Returns the color of a color gradient of an entry in A8R8G8B8 format
        //! \param i The index of the entry
        DLLEXPORT int getEntryAlphaFieldColor(int i) const;
        //! Returns the strength of a color gradient of an entry
        //! \param i The index of the entry
        DLLEXPORT int getEntryAlphaFieldStrength(int i) const;
        //! Returns the background color of an entry in A8R8G8B8 format
        //! \param i The index of the entry
        DLLEXPORT int getEntryBackgroundColor(int i) const;
        //! Returns the background image of an entry
        //! \param i The index of the entry
        DLLEXPORT Image* getEntryBackgroundImage(int i) const;
        //! Returns the background image of an entry without increased reference
        //! counter \param i The index of the entry
        DLLEXPORT Image* zEntryBackgroundImage(int i) const;
        //! Returns the border used when selecting an entry
        DLLEXPORT Border* getSelBorder() const;
        //! Returns the border without increased reference counter used when
        //! selecting an entry
        DLLEXPORT Border* zSelBorder() const;
        //! Returns the color of the border in A8R8G8B8 format used when
        //! selecting an entry
        DLLEXPORT int getSelBorderColor() const;
        //! Returns the width of the border used when selecting an entry
        DLLEXPORT int getSelBorderWidth() const;
        //! Returns the color gradient used when selecting an entry
        DLLEXPORT AlphaField* getSelAlphaField() const;
        //! Returns the color gradient without increased reference counter used
        //! when selecting an entry
        DLLEXPORT AlphaField* zSelAlphaField() const;
        //! Returns the color of the color gradient used when selecting
        //! an entry
        DLLEXPORT int getSelAlphaFieldColor() const;
        //! Returns the strength of the color gradient used when selecting
        //! an entry
        DLLEXPORT int getSelAlphaFieldStrength() const;
        //! Returns the background color in A8R8G8B8 format used when
        //! selecting an entry
        DLLEXPORT int getSelBackgroundColor() const;
        //! Returns the background image used when selecting an entry
        DLLEXPORT Image* getSelBackgroundImage() const;
        //! Returns the background image without increased reference counter used
        //! when selecting an entry
        DLLEXPORT Image* zSelBackgroundImage() const;
        //! Returns the border used with the MultiStyled flag when selecting
        //! a specific entry \param i The index of the entry
        DLLEXPORT Border* getMsSelBorder(int i) const;
        //! Returns the border without increased reference counter used with the
        //! MultiStyled flag when selecting a specific entry
        //! \param i The index of the entry
        DLLEXPORT Border* zMsSelBorder(int i) const;
        //! Returns the color of the border in A8R8G8B8 format used with the
        //! MultiStyled flag when selecting a specific entry
        //! \param i The index of the entry
        DLLEXPORT int getMsSelBorderColor(int i) const;
        //! Returns the width of the border used with the MultiStyled flag when
        //! selecting a specific entry \param i The index of the entry
        DLLEXPORT int getMsSelBorderWidth(int i) const;
        //! Returns the color gradient used with the MultiStyled flag when
        //! selecting a specific entry \param i The index of the entry
        DLLEXPORT AlphaField* getMsSelAlphaField(int i) const;
        //! Returns the color gradient without increased reference counter used
        //! with the MultiStyled flag when selecting a specific entry
        //! \param i The index of the entry
        DLLEXPORT AlphaField* zMsSelAlphaField(int i) const;
        //! Returns the color of the color gradient in A8R8G8B8 format used with
        //! the MultiStyled flag when selecting a specific entry
        //! \param i The index of the entry
        DLLEXPORT int getMsSelAlphaFieldColor(int i) const;
        //! Returns the strength of the color gradient used with the MultiStyled
        //! flag when selecting a specific entry
        //! \param i The index of the entry
        DLLEXPORT int getMsSelAlphaFieldStrength(int i) const;
        //! Returns the background color in A8R8G8B8 format used with the
        //! MultiStyled flag when selecting a specific entry
        //! \param i The index of the entry
        DLLEXPORT int getMsSelBackgroundColor(int i) const;
        //! Returns the background image used with the MultiStyled flag when
        //! selecting a specific entry \param i The index of the entry
        DLLEXPORT Image* getMsSelBackgroundImage(int i) const;
        //! Returns the background image without increased reference counter used
        //! with the MultiStyled flag when selecting a specific entry
        //! \param i The index of the entry
        DLLEXPORT Image* zMsSelBackgroundImage(int i) const;
        //! Returns the border used when the mouse is pointing at an entry
        DLLEXPORT Border* getMouseBorder() const;
        //! Returns the border without increased reference counter used when
        //! the mouse is pointing at an entry
        DLLEXPORT Border* zMouseBorder() const;
        //! Returns the color of the border in A8R8G8B8 format used when
        //! the mouse is pointing at an entry
        DLLEXPORT int getMouseBorderColor() const;
        //! Returns the width of the border used when the mouse is pointing
        //! at an entry
        DLLEXPORT int getMouseBorderWidth() const;
        //! Returns the color gradient used when the mouse is pointing
        //! at an entry
        DLLEXPORT AlphaField* getMouseAlphaField() const;
        //! Returns the color gradient without increased reference counter used
        //! when the mouse is pointing at an entry
        DLLEXPORT AlphaField* zMouseAlphaField() const;
        //! Returns the color of the color gradient in A8R8G8B8 format used
        //! when the mouse is pointing at an entry
        DLLEXPORT int getMouseAlphaFieldColor() const;
        //! Returns the strength of the color gradient used when the mouse
        //! is pointing at an entry
        DLLEXPORT int getMouseAlphaFieldStrength() const;
        //! Returns the background color in A8R8G8B8 format used when the
        //! mouse is pointing at an entry
        DLLEXPORT int getMouseBackgroundColor() const;
        //! Returns the background image used when the mouse is pointing
        //! at an entry
        DLLEXPORT Image* getMouseBackgroundImage() const;
        //! Returns the background image without increased reference counter used
        //! when the mouse is pointing at an entry
        DLLEXPORT Image* zMouseBackgroundImage() const;
        //! Returns the border used with the Multistyle flag when the mouse
        //! is pointing at a specific entry \param i The index of the entry
        DLLEXPORT Border* getMsMouseBorder(int i) const;
        //! Returns the border without increased reference counter used with the
        //! Multistyle flag when the mouse is pointing at a specific entry
        //! \param i The index of the entry
        DLLEXPORT Border* zMsMouseBorder(int i) const;
        //! Returns the color of the border in A8R8G8B8 format used with the
        //! Multistyle flag when the mouse is pointing at a specific entry
        //! \param i The index of the entry
        DLLEXPORT int getMsMouseBorderColor(int i) const;
        //! Returns the width of the border used with the Multistyle flag
        //! when the mouse is pointing at a specific entry
        //! \param i The index of the entry
        DLLEXPORT int getMsMouseBorderWidth(int i) const;
        //! Returns the color gradient used with the Multistyle flag when
        //! the mouse is pointing at a specific entry \param i The index
        //! of the entry
        DLLEXPORT AlphaField* getMsMouseAlphaField(int i) const;
        //! Returns the color gradient without increased reference counter used
        //! with the Multistyle flag when the mouse is pointing at a specific
        //! entry \param i The index of the entry
        DLLEXPORT AlphaField* zMsMouseAlphaField(int i) const;
        //! Returns the color of the color gradient in A8R8G8B8 format used with
        //! the Multistyle flag when the mouse is pointing at a specific entry
        //! \param i The index of the entry
        DLLEXPORT int getMsMouseAlphaFieldColor(int i) const;
        //! Returns the strength of the color gradient used with the Multistyle
        //! flag when the mouse is pointing at a specific entry
        //! \param i The index of the entry
        DLLEXPORT int getMsMouseAlphaFieldStrength(int i) const;
        //! Returns the background color in A8R8G8B8 format used with the
        //! Multistyle flag when the mouse is pointing at a specific entry
        //! \param i The index of the entry
        DLLEXPORT int getMsMouseBackgroundColor(int i) const;
        //! Returns the background image used with the Multistyle flag when
        //! the mouse is pointing at a specific entry
        //! \param i The index of the entry
        DLLEXPORT Image* getMsMouseBackgroundImage(int i) const;
        //! Returns the background image without increased reference counter used
        //! with the Multistyle flag when the mouse is pointing at a specific
        //! entry \param i The index of the entry
        DLLEXPORT Image* zMsMouseBackgroundImage(int i) const;
        //! Checks whether a point is inside this object
        //! \param x The x coordinate of the point
        //! \param y The y coordinate of the point
        //! \return 1 if the point is inside, 0 otherwise
        DLLEXPORT bool isPointInside(int x, int y) const override;
        //! Checks whether a specific style is set for a specific entry with the
        //! MultiStyled flag \param i The index of the entry
        //! \param abStyle The style
        DLLEXPORT inline bool hasMsStyle(int i, __int64 abStyle) const;
        //! Checks whether a specific style is not set for a specific entry with
        //! the MultiStyled flag \param i The index of the entry
        //! \param abStyle The style
        DLLEXPORT inline bool hasMsStyleNot(int i, __int64 abStyle) const;
        DLLEXPORT Drawable*
        duplicate() const override; //! Creates a copy of the drawing
    };
} // namespace Framework

#endif