#ifndef Rahmen_H
#define Rahmen_H

#include "Zeichnung.h"

namespace Framework
{
    class Bild; //! aus Bild.h

    class Rahmen : public Zeichnung
    {
    protected:
        int br;
        int farbe;
        bool alpha;
        bool breaks;
        int breakOffset;
        int breakLength;
        int lineLength;

    public:
        //! Konstruktor 
        DLLEXPORT Rahmen();
        //! Destruktor
        DLLEXPORT virtual ~Rahmen();
        //! Setzt die Breite des Rahmens
        //! \param br Die Breite in Pixeln
        DLLEXPORT void setRamenBreite( int br );
        //! wenn dieser Flag gesetzt wird, wird der Rahmen gestrichelt gezeichnet
        //! \param br 1 -> gestrichelt, 0 -> durchgehend
        //! \param brOff startpunkt des ersten linienabschnittes
        //! \param brLength länge einer lücke
        //! \param lineLength länge einer linie
        DLLEXPORT void setBreaks( bool br, int brOff = 0, int brLength = 10, int lineLength = 10 );
        //! Gibt die Breite des Rahmens in Pixeln zurück
        DLLEXPORT int getRBreite() const;
        //! Legt fest, ob beim zeichnen alpha blending verwendet werden soll
        //! \param a 1, falls alpha blending verwendet werden soll
        DLLEXPORT void setAlpha( bool a );
        //! Setzt die Fare des Rahmens
        //! \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setFarbe( int f );
        //! Gibt die Farbe des Rahmens im A8R8G8B8 Format zurück
        DLLEXPORT int getFarbe() const;
        //! Gibt zurück, ob der Rahmen mit Alpha Blending gezeichnet wird
        DLLEXPORT bool hatAlpha() const;
        //! Gibt 1 zurück, falls der Rahmen gestrichelt gezeichnet wird
        DLLEXPORT bool hasBreaks() const;
        //! startpunkt des ersten linienabschnittes
        DLLEXPORT int getBreakOffset() const;
        //! länge einer lücke
        DLLEXPORT int getBreakLength() const;
        //! länge einer linie
        DLLEXPORT int getLineLength() const;
    };

    //! Eine Zeichnung des 2D GUI Frameworks, die einen Linienrahmen um ein Rechteck zeichnet
    class LRahmen : public Rahmen
    {
    private:

    public:
        //! Konstruktor 
        DLLEXPORT LRahmen();
		//! Destruktor
		DLLEXPORT virtual ~LRahmen();
        //! Zeichnet den Rahmen
        //! \param zRObj Das Bild, in den der Rahmen gezeichnet werden soll
        DLLEXPORT void render( Bild &zRObj ) override;
        //! Kopiert den Rahmen, so dass er ohne auswirkungen auf das Original verändert werden kann
        DLLEXPORT Zeichnung *dublizieren() const override;
    };

    class Rahmen3D : public Rahmen
    {
    public:
        //! Konstruktor 
        DLLEXPORT Rahmen3D();
        //! Destruktor
        DLLEXPORT virtual ~Rahmen3D();
        //! Zeichnet den Rahmen
        //! \param zRObj Das Bild, in den der Rahmen gezeichnet werden soll
        DLLEXPORT void render( Bild &zRObj ) override;
        //! Kopiert den Rahmen, so dass er ohne auswirkungen auf das Original verändert werden kann
        DLLEXPORT Zeichnung *dublizieren() const override;
    };
}

#endif