#ifndef Tabelle_H
#define Tabelle_H

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

namespace Framework
{
    class Border;     //! Border.h
    class AlphaField;  //! AlphaField.h
    class VScrollBar; //! Scroll.h
    class HScrollBar; //! Scroll.h
    class Text;       //! Text.h
    class ObjTable; //! from this file

    //! Manages a table of drawings
    class ObjTable : public DrawableBackground
    {
    public:
        class Style : public DrawableBackground::Style
        {
        public:
            //! If this flag is set, the user can resize the columns
            //! with the mouse
            static const __int64 ColumnWidthChangeable = 0x00001000;
            //! If this flag is set, the user can resize the rows
            //! with the mouse
            static const __int64 RowHeightChangeable = 0x00002000;
            //! If this flag is set, the user cannot make the column
            //! width smaller than a certain limit despite the
            //! ColumnWidthChangeable flag
            static const __int64 ColumnWidthMin = 0x00004000;
            //! If this flag is set, the user cannot make the column
            //! width larger than a certain limit despite the
            //! ColumnWidthChangeable flag
            static const __int64 ColumnWidthMax = 0x00008000;
            //! If this flag is set, the user cannot make the row
            //! height smaller than a certain limit despite the
            //! RowHeightChangeable flag
            static const __int64 RowHeightMin = 0x00010000;
            //! If this flag is set, the user cannot make the row
            //! height larger than a certain limit despite the
            //! RowHeightChangeable flag
            static const __int64 RowHeightMax = 0x00020000;
            //! If this flag is set, the user can reorder the columns
            //! by dragging and dropping them
            static const __int64 ColumnsMovable = 0x00040000;
            //! If this flag is set, the user can reorder the rows
            //! by dragging and dropping them
            static const __int64 RowsMovable = 0x00800000;
            //! If this flag is set, the field that the user can select
            //! with the Allowed flag gets a different border
            static const __int64 SelectionBorder = 0x0080000;
            //! If this flag is set, the field that the user can select
            //! with the Allowed flag gets a different AlphaField
            static const __int64 SelectionBuffer = 0x00100000;
            //! If this flag is set, each field can have different
            //! borders and AlphaFields when selected
            static const __int64 SelectionMultistyled = 0x00200000;
            //! If this flag is set, lines are drawn between the fields
            static const __int64 Raster = 0x00400000;

            //! Combines the flags: ColumnWidthChangeable,
            //! RowHeightChangeable, ColumnsMovable,
            //! RowsMovable
            static const __int64 beweglich = ColumnWidthChangeable
                                           | RowHeightChangeable
                                           | ColumnsMovable | RowsMovable;
            //! Combines the flags: ColumnWidthMax,
            //! ColumnWidthMin, RowHeightMax,
            //! RowHeightMax
            static const __int64 min_max = ColumnWidthMax | ColumnWidthMin
                                         | RowHeightMax | RowHeightMax;
            //! Combines the flags: VScroll, HScroll
            static const __int64 scroll = VScroll | HScroll;
            //! Combines the flags: Border, Allowed,
            //! Visible, ColumnsMovable,
            //! SelectionBuffer, SelectionBorder, Raster
            static const __int64 normal
                = Border | Allowed | Visible | SelectionBuffer | SelectionBorder
                | Raster | MEIgnoreInside | MEIgnoreParentInside
                | MEIgnoreVisible | MEIgnoreProcessed;
        };

    private:
        RCArray<RCArray<Drawable>>* members;
        RCArray<Text>* spaltenNamen;
        RCArray<Text>* zeilenNamen;
        Array<int>* columnWidth;
        Array<int>* zeilenHeight;
        Array<int>* minSpaltenWidth;
        Array<int>* maxSpaltenWidth;
        Array<int>* minZeilenHeight;
        Array<int>* maxZeilenHeight;
        int spaltenAnzahl, zeilenAnzahl;
        int klickSpalte;
        int klickZeile;
        double mSpalte, mZeile;
        int mx, my;
        Point selected;
        int rasterColor;
        int gridWidth;
        Border* aRam;
        AlphaField* aAf;
        RCArray<RCArray<Border>>* msaRam;
        RCArray<RCArray<AlphaField>>* msaAf;
        RCArray<Array<__int64>>* styles;
        //! Processes mouse messages
        //! \param me The event triggered by the mouse input
        DLLEXPORT void doMouseEvent(MouseEvent& me, bool userRet) override;

    public:
        //! Constructor
        DLLEXPORT ObjTable();
        //! Destructor
        DLLEXPORT virtual ~ObjTable();
        //! Adds a column to the table
        //! \param name The name of the column
        DLLEXPORT void addColumn(const char* name);
        //! Adds a column to the table
        //! \param name The name of the column
        DLLEXPORT void addColumn(Text* name);
        //! Adds a column to the table at a specific position
        //! \param sNum The index of the new column
        //! \param name The name of the new column
        DLLEXPORT void addColumn(int sNum, const char* name);
        //! Adds a column to the table at a specific position
        //! \param sNum The index of the new column
        //! \param name The name of the new column
        DLLEXPORT void addColumn(int sNum, Text* name);
        //! Adds a row to the table
        //! \param name The name of the row
        DLLEXPORT void addRow(const char* name);
        //! Adds a row to the table
        //! \param name The name of the row
        DLLEXPORT void addRow(Text* name);
        //! Adds a row to the table at a specific position
        //! \param zNum The index of the new row
        //! \param name The name of the new row
        DLLEXPORT void addRow(int zNum, const char* name);
        //! Adds a row to the table at a specific position
        //! \param sNum The index of the new row
        //! \param name The name of the new row
        DLLEXPORT void addRow(int zNum, Text* name);
        //! Removes a column
        //! \param sNum The index of the column
        DLLEXPORT void removeColumn(int sNum);
        //! Removes a column
        //! \param name The name of the column
        DLLEXPORT void removeColumn(const char* name);
        //! Removes a column
        //! \param name The name of the column
        DLLEXPORT void removeColumn(Text* name);
        //! Removes a row
        //! \param zNum The index of the row
        DLLEXPORT void removeRow(int zNum);
        //! Removes a row
        //! \param name The name of the row
        DLLEXPORT void removeRow(const char* name);
        //! Removes a row
        //! \param name The name of the row
        DLLEXPORT void removeRow(Text* name);
        //! Sets the index of a column
        //! \param name The name of the column
        //! \param pos The new index of the column
        DLLEXPORT void setColumnPosition(const char* name, int pos);
        //! Sets the index of a column
        //! \param name The name of the column
        //! \param pos The new index of the column
        DLLEXPORT void setColumnPosition(Text* name, int pos);
        //! Sets the index of a column
        //! \param sNum The old index of the column
        //! \param pos The new index of the column
        DLLEXPORT void setColumnPosition(int sNum, int pos);
        //! Sets the index of a row
        //! \param name The name of the row
        //! \param pos The new index of the row
        DLLEXPORT void setRowPosition(const char* name, int pos);
        //! Sets the index of a row
        //! \param name The name of the row
        //! \param pos The new index of the row
        DLLEXPORT void setRowPosition(Text* name, int pos);
        //! Sets the index of a row
        //! \param zNum The old index of the row
        //! \param pos The new index of the row
        DLLEXPORT void setRowPosition(int zNum, int pos);
        //! Sets a drawing to be placed in a specific cell.
        //! If a drawing already exists in the cell, it will be overwritten.
        //! \param sNum The index of the column
        //! \param zNum The index of the row
        //! \param obj The drawing to place in the cell
        DLLEXPORT void setDrawableZ(int sNum, int zNum, Drawable* obj);
        //! Sets a drawing to be placed in a specific cell.
        //! If a drawing already exists in the cell, it will be overwritten.
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        //! \param obj The drawing to place in the cell
        DLLEXPORT void setDrawableZ(
            const char* spaltenName, const char* zeilenName, Drawable* obj);
        //! Sets a drawing to be placed in a specific cell.
        //! If a drawing already exists in the cell, it will be overwritten.
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        //! \param obj The drawing to place in the cell
        DLLEXPORT void setDrawableZ(
            Text* spaltenName, Text* zeilenName, Drawable* obj);
        //! Sets the column width
        //! \param sNum The index of the column
        //! \param br The width in pixels
        DLLEXPORT void setColumnWidth(int sNum, int br);
        //! Sets the column width
        //! \param name The name of the column
        //! \param br The width in pixels
        DLLEXPORT void setColumnWidth(const char* name, int br);
        //! Sets the column width
        //! \param name The name of the column
        //! \param br The width in pixels
        DLLEXPORT void setColumnWidth(Text* name, int br);
        //! Sets the row height
        //! \param zNum The index of the row
        //! \param hi The height in pixels
        DLLEXPORT void setRowHeight(int zNum, int hi);
        //! Sets the row height
        //! \param name The name of the row
        //! \param hi The height in pixels
        DLLEXPORT void setRowHeight(const char* name, int hi);
        //! Sets the row height
        //! \param name The name of the row
        //! \param hi The height in pixels
        DLLEXPORT void setRowHeight(Text* name, int hi);
        //! Sets the minimum column width (requires flags:
        //! ColumnWidthChangeable, ColumnWidthMin) \param sNum The index of
        //! the column \param minBr The minimum width in pixels
        DLLEXPORT void setMinColumnWidth(int sNum, int minBr);
        //! Sets the minimum column width (requires flags:
        //! ColumnWidthChangeable, ColumnWidthMin) \param name The name of
        //! the column \param minBr The minimum width in pixels
        DLLEXPORT void setMinColumnWidth(const char* name, int minBr);
        //! Sets the minimum column width (requires flags:
        //! ColumnWidthChangeable, ColumnWidthMin) \param name The name of
        //! the column \param minBr The minimum width in pixels
        DLLEXPORT void setMinColumnWidth(Text* name, int minBr);
        //! Sets the maximum column width (requires flags:
        //! ColumnWidthChangeable, ColumnWidthMax) \param sNum The index of
        //! the column \param maxBr The maximum width in pixels
        DLLEXPORT void setMaxColumnWidth(int sNum, int maxBr);
        //! Sets the maximum column width (requires flags:
        //! ColumnWidthChangeable, ColumnWidthMax) \param name The name of
        //! the column \param maxBr The maximum width in pixels
        DLLEXPORT void setMaxColumnWidth(const char* name, int maxBr);
        //! Sets the maximum column width (requires flags:
        //! ColumnWidthChangeable, ColumnWidthMax) \param name The name of
        //! the column \param maxBr The maximum width in pixels
        DLLEXPORT void setMaxColumnWidth(Text* name, int maxBr);
        //! Sets the minimum row height (requires flags:
        //! RowHeightChangeable, RowHeightMin) \param zNum The index of
        //! the row \param minHi The minimum height in pixels
        DLLEXPORT void setMinRowHeight(int zNum, int minHi);
        //! Sets the minimum row height (requires flags:
        //! RowHeightChangeable, RowHeightMin) \param name The name of
        //! the row \param minHi The minimum height in pixels
        DLLEXPORT void setMinRowHeight(const char* name, int minHi);
        //! Sets the minimum row height (requires flags:
        //! RowHeightChangeable, RowHeightMin) \param name The name of
        //! the row \param minHi The minimum height in pixels
        DLLEXPORT void setMinRowHeight(Text* name, int minHi);
        //! Sets the maximum row height (requires flags:
        //! RowHeightChangeable, RowHeightMax) \param zNum The index of
        //! the row \param maxHi The maximum height in pixels
        DLLEXPORT void setMaxRowHeight(int zNum, int maxHi);
        //! Sets the maximum row height (requires flags:
        //! RowHeightChangeable, RowHeightMax) \param name The name of
        //! the row \param maxHi The maximum height in pixels
        DLLEXPORT void setMaxRowHeight(const char* name, int maxHi);
        //! Sets the maximum row height (requires flags:
        //! RowHeightChangeable, RowHeightMax) \param name The name of
        //! the row \param maxHi The maximum height in pixels
        DLLEXPORT void setMaxRowHeight(Text* name, int maxHi);
        //! Sets which cell is selected (requires flag: Allowed)
        //! \param sNum The index of the column
        //! \param zNum The index of the row
        DLLEXPORT void setSelection(int sNum, int zNum);
        //! Sets which cell is selected (requires flag: Allowed)
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        DLLEXPORT void setSelection(
            const char* spaltenName, const char* zeilenName);
        //! Sets which cell is selected (requires flag: Allowed)
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        DLLEXPORT void setSelection(Text* spaltenName, Text* zeilenName);
        //! Sets the color of the grid displayed between cells
        //! \param f The color in A8R8G8B8 format
        DLLEXPORT void setGridColor(int f);
        //! Sets the width of the grid displayed between cells
        //! \param br The width in pixels
        DLLEXPORT void setGridWidth(int br);
        //! Sets a pointer to the border drawn around the selected cell
        //! \param ram The border
        DLLEXPORT void setABorderZ(Border* ram);
        //! Sets the color of the border drawn around the selected cell
        //! \param f The color in A8R8G8B8 format
        DLLEXPORT void setARColor(int f);
        //! Sets the width of the border drawn around the selected cell
        //! \param br The width in pixels
        DLLEXPORT void setARWidth(int br);
        //! Sets a pointer to the AlphaField used for the selected cell
        //! \param af The AlphaField
        DLLEXPORT void setAAlphaFieldZ(AlphaField* af);
        //! Sets the color of the AlphaField used for the selected cell
        //! \param f The color in A8R8G8B8 format
        DLLEXPORT void setAAfColor(int f);
        //! Sets the strength of the AlphaField used for the selected cell
        //! \param st The strength
        DLLEXPORT void setAAfStrength(int st);
        //! Sets a pointer to a border used with the SelectionMultistyled flag
        //! when selecting a specific cell \param sNum The index of the column
        //! \param zNum The index of the row \param ram The border
        DLLEXPORT void setABorderZ(int sNum, int zNum, Border* ram);
        //! Sets a pointer to a border used with the SelectionMultistyled flag
        //! when selecting a specific cell \param spaltenName The name of the
        //! column \param zeilenName The name of the row
        //! \param ram The border
        DLLEXPORT void setABorderZ(
            const char* spaltenName, const char* zeilenName, Border* ram);
        //! Sets a pointer to a border used with the SelectionMultistyled flag
        //! when selecting a specific cell \param spaltenName The name of the
        //! column \param zeilenName The name of the row
        //! \param ram The border
        DLLEXPORT void setABorderZ(
            Text* spaltenName, Text* zeilenName, Border* ram);
        //! Sets the color of a border used with the SelectionMultistyled flag
        //! when selecting a specific cell \param sNum The index of the column
        //! \param zNum The index of the row \param f The color in A8R8G8B8
        //! format
        DLLEXPORT void setARColor(int sNum, int zNum, int f);
        //! Sets the color of a border used with the SelectionMultistyled flag
        //! when selecting a specific cell \param spaltenName The name of the
        //! column \param zeilenName The name of the row
        //! \param f The color in A8R8G8B8 format
        DLLEXPORT void setARColor(
            const char* spaltenName, const char* zeilenName, int f);
        //! Sets the color of a border used with the SelectionMultistyled flag
        //! when selecting a specific cell \param spaltenName The name of the
        //! column \param zeilenName The name of the row
        //! \param f The color in A8R8G8B8 format
        DLLEXPORT void setARColor(Text* spaltenName, Text* zeilenName, int f);
        //! Sets the width of a border used with the SelectionMultistyled flag
        //! when selecting a specific cell \param sNum The index of the column
        //! \param zNum The index of the row \param br The width in pixels
        DLLEXPORT void setARWidth(int sNum, int zNum, int br);
        //! Sets the width of a border used with the SelectionMultistyled flag
        //! when selecting a specific cell \param spaltenName The name of the
        //! column \param zeilenName The name of the row
        //! \param br The width in pixels
        DLLEXPORT void setARWidth(
            const char* spaltenName, const char* zeilenName, int br);
        //! Sets the width of a border used with the SelectionMultistyled flag
        //! when selecting a specific cell \param spaltenName The name of the
        //! column \param zeilenName The name of the row
        //! \param br The width in pixels
        DLLEXPORT void setARWidth(Text* spaltenName, Text* zeilenName, int br);
        //! Sets the color gradient used with the SelectionMultistyled flag
        //! when selecting a specific cell \param sNum The index of the column
        //! \param zNum The index of the row \param af The color gradient
        DLLEXPORT void setAAlphaFieldZ(int sNum, int zNum, AlphaField* af);
        //! Sets the color gradient used with the SelectionMultistyled flag
        //! when selecting a specific cell \param spaltenName The name of the
        //! column \param zeilenName The name of the row \param af The color
        //! gradient
        DLLEXPORT void setAAlphaFieldZ(
            const char* spaltenName, const char* zeilenName, AlphaField* af);
        //! Sets the color gradient used with the SelectionMultistyled flag
        //! when selecting a specific cell \param spaltenName The name of the
        //! column \param zeilenName The name of the row \param af The color
        //! gradient
        DLLEXPORT void setAAlphaFieldZ(
            Text* spaltenName, Text* zeilenName, AlphaField* af);
        //! Sets the color of the color gradient used with the
        //! SelectionMultistyled flag when selecting a specific cell
        //! \param sNum The index of the column \param zNum The index of the
        //! row \param f The color in A8R8G8B8 format
        DLLEXPORT void setAAfColor(int sNum, int zNum, int f);
        //! Sets the color of the color gradient used with the
        //! SelectionMultistyled flag when selecting a specific cell
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        //! \param f The color in A8R8G8B8 format
        DLLEXPORT void setAAfColor(
            const char* spaltenName, const char* zeilenName, int f);
        //! Sets the color of the color gradient used with the
        //! SelectionMultistyled flag when selecting a specific cell
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        //! \param f The color in A8R8G8B8 format
        DLLEXPORT void setAAfColor(Text* spaltenName, Text* zeilenName, int f);
        //! Sets the strength of the color gradient used with the
        //! SelectionMultistyled flag when selecting a specific cell
        //! \param sNum The index of the column \param zNum The index of the
        //! row \param st The strength
        DLLEXPORT void setAAfStrength(int sNum, int zNum, int st);
        //! Sets the strength of the color gradient used with the
        //! SelectionMultistyled flag when selecting a specific cell
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        //! \param st The strength
        DLLEXPORT void setAAfStrength(
            const char* spaltenName, const char* zeilenName, int st);
        //! Sets the strength of the color gradient used with the
        //! SelectionMultistyled flag when selecting a specific cell
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        //! \param st The strength
        DLLEXPORT void setAAfStrength(
            Text* spaltenName, Text* zeilenName, int st);
        //! Adds styles used with the SelectionMultistyled flag when selecting
        //! a specific cell \param sNum The index of the column
        //! \param zNum The index of the row \param style The style to add
        DLLEXPORT void addMsStyle(int sNum, int zNum, __int64 style);
        //! Adds styles used with the SelectionMultistyled flag when selecting
        //! a specific cell \param spaltenName The name of the column
        //! \param zeilenName The name of the row \param style The style to add
        DLLEXPORT void addMsStyle(
            const char* spaltenName, const char* zeilenName, __int64 style);
        //! Adds styles used with the SelectionMultistyled flag when selecting
        //! a specific cell \param spaltenName The name of the column
        //! \param zeilenName The name of the row \param style The style to add
        DLLEXPORT void addMsStyle(
            Text* spaltenName, Text* zeilenName, __int64 style);
        //! Sets the styles used with the SelectionMultistyled flag when selecting
        //! a specific cell \param sNum The index of the column
        //! \param zNum The index of the row \param style The style to use
        DLLEXPORT void setMsStyle(int sNum, int zNum, __int64 style);
        //! Sets the styles used with the SelectionMultistyled flag when selecting
        //! a specific cell \param spaltenName The name of the column
        //! \param zeilenName The name of the row \param style The style to use
        DLLEXPORT void setMsStyle(
            const char* spaltenName, const char* zeilenName, __int64 style);
        //! Sets the styles used with the SelectionMultistyled flag when selecting
        //! a specific cell \param spaltenName The name of the column
        //! \param zeilenName The name of the row \param style The style to use
        DLLEXPORT void setMsStyle(
            Text* spaltenName, Text* zeilenName, __int64 style);
        //! Sets the styles used with the SelectionMultistyled flag when selecting
        //! a specific cell \param sNum The index of the column
        //! \param zNum The index of the row \param style The style to use
        //!  add_remove: 1 if the given styles should be added.
        //!  0 if they should be removed
        DLLEXPORT void setMsStyle(
            int sNum, int zNum, __int64 style, bool add_remove);
        //! Sets the styles used with the SelectionMultistyled flag when selecting
        //! a specific cell \param spaltenName The name of the column
        //! \param zeilenName The name of the row \param style The style to use
        //!  add_remove: 1 if the given styles should be added.
        //!  0 if they should be removed
        DLLEXPORT void setMsStyle(const char* spaltenName,
            const char* zeilenName,
            __int64 style,
            bool add_remove);
        //! Sets the styles used with the SelectionMultistyled flag when selecting
        //! a specific cell \param spaltenName The name of the column
        //! \param zeilenName The name of the row \param style The style to use
        //!  add_remove: 1 if the given styles should be added.
        //!  0 if they should be removed
        DLLEXPORT void setMsStyle(Text* spaltenName,
            Text* zeilenName,
            __int64 style,
            bool add_remove);
        //! Removes styles from the styles used with the SelectionMultistyled flag
        //! when selecting a specific cell \param sNum The index of the column
        //! \param zNum The index of the row \param style The style to remove
        DLLEXPORT void removeMsStyle(int sNum, int zNum, __int64 style);
        //! Removes styles from the styles used with the SelectionMultistyled flag
        //! when selecting a specific cell \param spaltenName The name of the
        //! column \param zeilenName The name of the row \param style The style
        //! to remove
        DLLEXPORT void removeMsStyle(
            const char* spaltenName, const char* zeilenName, __int64 style);
        //! Removes styles from the styles used with the SelectionMultistyled flag
        //! when selecting a specific cell \param spaltenName The name of the
        //! column \param zeilenName The name of the row \param style The style
        //! to remove
        DLLEXPORT void removeMsStyle(
            Text* spaltenName, Text* zeilenName, __int64 style);
        //! 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 me 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 number of columns
        DLLEXPORT int getColumnCount() const;
        //! Returns the number of rows
        DLLEXPORT int getRowCount() const;
        //! Returns the index of a column
        //! \param name The name of the column
        DLLEXPORT int getColumnNumber(const char* name) const;
        //! Returns the index of a column
        //! \param name The name of the column
        DLLEXPORT int getColumnNumber(Text* name) const;
        //! Returns the name of a column
        //! \param num The index of the column
        DLLEXPORT Text* getColumnName(int num) const;
        //! Returns the name of a column without increased reference counter
        //! \param num The index of the column
        DLLEXPORT Text* zColumnName(int num) const;
        //! Returns the index of a row
        //! \param name The name of the row
        DLLEXPORT int getRowNumber(const char* name) const;
        //! Returns the index of a row
        //! \param name The name of the row
        DLLEXPORT int getRowNumber(Text* name) const;
        //! Returns the name of a row
        //! \param num The index of the row
        DLLEXPORT Text* getRowName(int num) const;
        //! Returns the name of a row without increased reference counter
        //! \param num The index of the row
        DLLEXPORT Text* zRowName(int num) const;
        //! Searches for a drawing in the table and returns the column index
        //! as x and the row index as y. (-1, -1) if the object was not found
        //! \param zObj The drawing (without increased reference counter)
        DLLEXPORT Point getDrawablePosition(Drawable* zObj) const;
        //! Returns the drawing in a specific cell of the table
        //! (without increased reference counter) \param sNum The index of
        //! the column \param zNum The index of the row
        DLLEXPORT Drawable* zDrawable(int sNum, int zNum) const;
        //! Returns the drawing in a specific cell of the table
        //! (without increased reference counter) \param spaltenName The name
        //! of the column \param zeilenName The name of the row
        DLLEXPORT Drawable* zDrawable(
            const char* spaltenName, const char* zeilenName) const;
        //! Returns the drawing in a specific cell of the table
        //! (without increased reference counter) \param spaltenName The name
        //! of the column \param zeilenName The name of the row
        DLLEXPORT Drawable* zDrawable(
            Text* spaltenName, Text* zeilenName) const;
        //! Returns the drawing in a specific cell of the table
        //! \param sNum The index of the column \param zNum The index of the row
        DLLEXPORT Drawable* getDrawable(int sNum, int zNum) const;
        //! Returns the drawing in a specific cell of the table
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        DLLEXPORT Drawable* getDrawable(
            const char* spaltenName, const char* zeilenName) const;
        //! Returns the drawing in a specific cell of the table
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        DLLEXPORT Drawable* getDrawable(
            Text* spaltenName, Text* zeilenName) const;
        //! Returns the width of a column in pixels
        //! \param num The index of the column
        DLLEXPORT int getColumnWidth(int num) const;
        //! Returns the width of a column in pixels
        //! \param name The name of the column
        DLLEXPORT int getColumnWidth(const char* name) const;
        //! Returns the width of a column in pixels
        //! \param name The name of the column
        DLLEXPORT int getColumnWidth(Text* name) const;
        //! Returns the height of a row in pixels
        //! \param num The index of the row
        DLLEXPORT int getRowHeight(int num) const;
        //! Returns the height of a row in pixels
        //! \param name The name of the row
        DLLEXPORT int getRowHeight(const char* name) const;
        //! Returns the height of a row in pixels
        //! \param name The name of the row
        DLLEXPORT int getRowHeight(Text* name) const;
        //! Returns the minimum column width in pixels
        //! \param num The index of the column
        DLLEXPORT int getMinColumnWidth(int num) const;
        //! Returns the minimum column width in pixels
        //! \param name The name of the column
        DLLEXPORT int getMinColumnWidth(const char* name) const;
        //! Returns the minimum column width in pixels
        //! \param name The name of the column
        DLLEXPORT int getMinColumnWidth(Text* name) const;
        //! Returns the maximum column width in pixels
        //! \param num The index of the column
        DLLEXPORT int getMaxColumnWidth(int num) const;
        //! Returns the maximum column width in pixels
        //! \param name The name of the column
        DLLEXPORT int getMaxColumnWidth(const char* name) const;
        //! Returns the maximum column width in pixels
        //! \param name The name of the column
        DLLEXPORT int getMaxColumnWidth(Text* name) const;
        //! Returns the minimum row height in pixels
        //! \param num The index of the row
        DLLEXPORT int getMinRowHeight(int num) const;
        //! Returns the minimum row height in pixels
        //! \param name The name of the row
        DLLEXPORT int getMinRowHeight(const char* name) const;
        //! Returns the minimum row height in pixels
        //! \param name The name of the row
        DLLEXPORT int getMinRowHeight(Text* name) const;
        //! Returns the maximum row height in pixels
        //! \param num The index of the row
        DLLEXPORT int getMaxRowHeight(int num) const;
        //! Returns the maximum row height in pixels
        //! \param name The name of the row
        DLLEXPORT int getMaxRowHeight(const char* name) const;
        //! Returns the maximum row height in pixels
        //! \param name The name of the row
        DLLEXPORT int getMaxRowHeight(Text* name) const;
        //! Returns the index of the column the mouse points to
        //! \param mx The x coordinate of the mouse position relative to the
        //! left edge of the table in pixels
        DLLEXPORT double getMouseColumn(int mx) const;
        //! Returns the name of the column the mouse points to
        //! \param mx The x coordinate of the mouse position relative to the
        //! left edge of the table in pixels
        DLLEXPORT Text* getMouseColumnnName(int mx) const;
        //! Returns the name of the column the mouse points to without increased
        //! reference counter \param mx The x coordinate of the mouse position
        //! relative to the left edge of the table in pixels
        DLLEXPORT Text* zMouseColumnName(int mx) const;
        //! Returns the index of the row the mouse points to
        //! \param my The Y coordinate of the mouse position relative to the
        //! top edge of the table in pixels
        DLLEXPORT double getMouseRow(int my) const;
        //! Returns the name of the row the mouse points to
        //! \param my The Y coordinate of the mouse position relative to the
        //! top edge of the table in pixels
        DLLEXPORT Text* getMouseRownName(int my) const;
        //! Returns the name of the row the mouse points to without increased
        //! reference counter \param my The Y coordinate of the mouse position
        //! relative to the top edge of the table in pixels
        DLLEXPORT Text* zMouseRowName(int my) const;
        //! Returns the column index as x and the row index as y of the
        //! selected field
        DLLEXPORT const Point& getSelahlPosition() const;
        //! Returns the color of the grid in A8R8G8B8 format
        DLLEXPORT int getGridColor() const;
        //! Returns the width of the grid in pixels
        DLLEXPORT int getGridWidth() const;
        //! Returns a pointer to the border used for the selected field
        DLLEXPORT Border* getABorder() const;
        //! Returns a pointer to the border without increased reference counter
        //! used for the selected field
        DLLEXPORT Border* zABorder() const;
        //! Returns a pointer to the color gradient used for the selected field
        DLLEXPORT AlphaField* getAAlphaField() const;
        //! Returns a pointer to the color gradient without increased reference
        //! counter used for the selected field
        DLLEXPORT AlphaField* zAAlphaField() const;
        //! Returns a pointer to the border used with the SelectionMultistyled
        //! flag when selecting a specific cell \param sNum The index of the
        //! column \param zNum The index of the row
        DLLEXPORT Border* getABorder(int sNum, int zNum) const;
        //! Returns a pointer to the border without increased reference counter
        //! used with the SelectionMultistyled flag when selecting a specific cell
        //! \param sNum The index of the column \param zNum The index of the row
        DLLEXPORT Border* zABorder(int sNum, int zNum) const;
        //! Returns a pointer to the color gradient used with the
        //! SelectionMultistyled flag when selecting a specific cell
        //! \param sNum The index of the column \param zNum The index of the row
        DLLEXPORT AlphaField* getAAlphaField(int sNum, int zNum) const;
        //! Returns a pointer to the color gradient without increased reference
        //! counter used with the SelectionMultistyled flag when selecting a
        //! specific cell \param sNum The index of the column
        //! \param zNum The index of the row
        DLLEXPORT AlphaField* zAAlphaField(int sNum, int zNum) const;
        //! Returns a pointer to the border used with the SelectionMultistyled
        //! flag when selecting a specific cell \param spaltenName The name of
        //! the column \param zeilenName The name of the row
        DLLEXPORT Border* getABorder(
            const char* spaltenName, const char* zeilenName) const;
        //! Returns a pointer to the border without increased reference counter
        //! used with the SelectionMultistyled flag when selecting a specific cell
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        DLLEXPORT Border* zABorder(
            const char* spaltenName, const char* zeilenName) const;
        //! Returns a pointer to the color gradient used with the
        //! SelectionMultistyled flag when selecting a specific cell
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        DLLEXPORT AlphaField* getAAlphaField(
            const char* spaltenName, const char* zeilenName) const;
        //! Returns a pointer to the color gradient without increased reference
        //! counter used with the SelectionMultistyled flag when selecting a
        //! specific cell \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        DLLEXPORT AlphaField* zAAlphaField(
            const char* spaltenName, const char* zeilenName) const;
        //! Returns a pointer to the border used with the SelectionMultistyled
        //! flag when selecting a specific cell \param spaltenName The name of
        //! the column \param zeilenName The name of the row
        DLLEXPORT Border* getABorder(Text* spaltenName, Text* zeilenName) const;
        //! Returns a pointer to the border without increased reference counter
        //! used with the SelectionMultistyled flag when selecting a specific cell
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        DLLEXPORT Border* zABorder(Text* spaltenName, Text* zeilenName) const;
        //! Returns a pointer to the color gradient used with the
        //! SelectionMultistyled flag when selecting a specific cell
        //! \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        DLLEXPORT AlphaField* getAAlphaField(
            Text* spaltenName, Text* zeilenName) const;
        //! Returns a pointer to the color gradient without increased reference
        //! counter used with the SelectionMultistyled flag when selecting a
        //! specific cell \param spaltenName The name of the column
        //! \param zeilenName The name of the row
        DLLEXPORT AlphaField* zAAlphaField(
            Text* spaltenName, Text* zeilenName) const;
        //! Checks whether a specific style is set for a specific cell with the
        //! SelectionMultistyled flag \param sNum The index of the column
        //! \param zNum The index of the row
        //! \param style The style to check
        DLLEXPORT inline bool hasMsStyle(
            int sNum, int zNum, __int64 style) const;
        //! Checks whether a specific style is not set for a specific cell with
        //! the SelectionMultistyled flag \param sNum The index of the column
        //! \param zNum The index of the row \param style The style to check
        DLLEXPORT inline bool hasMsStyleNot(
            int sNum, int zNum, __int64 style) const;
        //! Checks whether a specific style is set for a specific cell with the
        //! SelectionMultistyled flag \param spaltenName The name of the column
        //! \param zeilenName The name of the row \param style The style
        //! to check
        DLLEXPORT inline bool hasMsStyle(const char* spaltenName,
            const char* zeilenName,
            __int64 style) const;
        //! Checks whether a specific style is not set for a specific cell with
        //! the SelectionMultistyled flag \param spaltenName The name of the column
        //! \param zeilenName The name of the row \param style The style
        //! to check
        DLLEXPORT inline bool hasMsStyleNot(const char* spaltenName,
            const char* zeilenName,
            __int64 style) const;
        //! Checks whether a specific style is set for a specific cell with the
        //! SelectionMultistyled flag \param spaltenName The name of the column
        //! \param zeilenName The name of the row \param style The style
        //! to check
        DLLEXPORT inline bool hasMsStyle(
            Text* spaltenName, Text* zeilenName, __int64 style) const;
        //! Checks whether a specific style is not set for a specific cell with
        //! the SelectionMultistyled flag \param spaltenName The name of the column
        //! \param zeilenName The name of the row \param style The style
        //! to check
        DLLEXPORT inline bool hasMsStyleNot(
            Text* spaltenName, Text* zeilenName, __int64 style) const;
        //! Creates a copy of the table that can be modified without
        //! affecting the original
        DLLEXPORT Drawable* duplicate() const override;
    };
} // namespace Framework
#endif