#ifndef Fortschritt_H
#define Fortschritt_H

#include "Zeichnung.h"

namespace Framework
{
    class Rahmen; //! Rahmen.h
    class AlphaFeld; //! AlphaFeld.h
    class Bild; //! Bild.h
    class Schrift; //! Schrift.h
    class FBalken; //! aus dieser Datei
    class TextRenderer;

    //! Eine Zeichnung des 2D GuI Frameworks, die einen Fortschrittsbalken zeichnet
    class FBalken : public ZeichnungHintergrund
    {
    public:
        class Style : public ZeichnungHintergrund::Style
        {
        public:
            const static __int64 Prozent = 0x001000; //! Legt fest, ob eine Prozentangebe gezechnet wird
            const static __int64 Aktionen = 0x01000000; //! Legt fest, ob die Aktionsschritte gezeichnet werden

            const static __int64 FRahmen = 0x002000; //! Legt fest, ob der vom fortschritt erfasste Teil des Balkens einen eigenen Rahmen hat
            const static __int64 FFarbe = 0x004000; //! Legt fest, ob der vom fortschritt erfasste Teil des Balkens eine eigene Hintergrund Farbe hat
            const static __int64 FBild = 0x008000; //! Legt fest, ob der vom fortschritt erfasste Teil des Balkens ein eigenes Hintergrund Bild hat
            const static __int64 FAlpha = 0x10000; //! Legt fest, ob der vom fortschritt erfasste Teil des Balkens zum zeichnen seines Hintergrundes alpha blending verwendet
            const static __int64 FBuffered = 0x20000; //! Legt fest, ob der vom fortschritt erfasste Teil des Balkens einen eigenen Frbübergang hat

            const static __int64 L_R = 0x0100000; //! Legt fest, ob sich der Fortschritt von lenks nach rechts ausbreitet
            const static __int64 R_L = 0x0200000; //! Legt fest, ob sich der Fortschritt von rechts nach links ausbreitet
            const static __int64 U_O = 0x0400000; //! Legt fest, ob sich der Fortschritt von unten nach oben ausbreitet
            const static __int64 O_U = 0x0800000; //! Legt fest, ob sich der Fortschritt von oben nach unten ausbreitet

            const static __int64 normal = Sichtbar | Rahmen | Hintergrund | HBild | FRahmen | FBild | L_R | Prozent | Aktionen; //! Vereint die Flags Sichtbar, Rahmen, Hintergrund, HBild, FRahmen, FBild, L_R, Prozent
        };
    private:
        __int64 maxAk;
        __int64 ak;
        Rahmen *fRahmen;
        AlphaFeld *fBuffer;
        int fBgF;
        Bild *fBgBild;
        TextRenderer *textRd;
        int schriftFarbe;
        unsigned char schriftSize;

    public:
        //! Konstruktor 
        DLLEXPORT FBalken();
        //! Destructor 
        DLLEXPORT virtual ~FBalken();
        //! Setzt die Anzahl an benötigten Operationen um 100% Fortschritt zu erreichen
        //! \param ak Die Anzahl an Operationen
        DLLEXPORT void setAktionAnzahl( __int64 ak );
        //! Legt fest, dass eine bestimmte Anzahl an Operationen seit dem letzten Aufruf der Funktion durchgeführt wurden
        //! \param aktionen Die durchgeführten Operationen. Standartmäßig auf 1
        DLLEXPORT void aktionPlus( __int64 aktionen = 1 );
        //! Setzt alle fertigen Operationen zurück, so dass der Fortschritt wieder von 0% beginnt
        DLLEXPORT void reset();
        //! Setzt einen Zeiger auf den Rahmen, der in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        //! \param ram Der Rahmen
        DLLEXPORT void setFRahmenZ( Rahmen *ram );
        //! Setzt die Farbe des Rahmens, der in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        //! \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setFRFarbe( int f );
        //! Setzt die Breite des Rahmens, der in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        //! \param br Die Breite in Pixeln
        DLLEXPORT void setFRBreite( int br );
        //! Setzt einen Zeiger auf den Farbverlauf, der in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        //! \param af Der Farbverlauf
        DLLEXPORT void setFAlphaFeldZ( AlphaFeld *af );
        //! Setzt die Farbe des Farbverlaufs, der in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        //! \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setFAFFarbe( int f );
        //! Setzt die Stärke des Farbverlaufs, der in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        //! \param st Die Stärke
        DLLEXPORT void setFAFStrength( int st );
        //! Setzt die Hintergrund Farbe, die in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        //! \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setFBgFarbe( int f );
        //! Setzt einen Zeiger auf das Hintergrund Bild, das in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        //! \param b Das Bild
        DLLEXPORT void setFBgBildZ( Bild *b );
        //! Setzt das Hintergrund Bild durch kopieren, das in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        //! \param b Das Bild, das kopiert werden soll
        DLLEXPORT void setFBgBild( Bild *b );
        //! Setzt den verwendeten TextRenderer
        //! \param textRd Der Textrenderer
        DLLEXPORT void setTextRendererZ( TextRenderer *textRd );
        //! Setzt die Schrift, die verwendet wird, um die Prozentanzeige zu zeichnen
        DLLEXPORT void setSchriftZ( Schrift *b );
        //! Setzt die Farbe der Prozentanzeige
        //! \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setSFarbe( int f );
        //! Setzt die Schriftgröße der Prozentanzeige
        //! \param gr Die Größe einer Zeile in Pixeln
        DLLEXPORT void setSSize( unsigned char gr );
        //! Zeichnet das Objekt nach zRObj, falls es sichtbar ist
        //! \param zRObj Das Bild, in welches gezeichnet werden soll
        DLLEXPORT void render( Bild &zRObj ) override;
        //! Gibt die Anzahl an benötigten Operationen zurück, die für 100% benötigt werden
        DLLEXPORT __int64 getAktionAnzahl() const;
        //! Gibt die momentan erreichte Prozentzahl des Fortschritts zurück
        DLLEXPORT double getProzent() const;
        //! Gibt die Anzahl an fertigen Operationen zurück
        DLLEXPORT __int64 getAktion() const;
        //! Gibt den Rahmen zurück, der in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        DLLEXPORT Rahmen *getFRahmen() const;
        //! Gibt den Rahmen ohne erhöhten Reference Counter zurück, der in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        DLLEXPORT Rahmen *zFRahmen() const;
        //! Gibt den Farbübergang zurück, der in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        DLLEXPORT AlphaFeld *getFAlphaFeld() const;
        //! Gibt den Farbübergang ohne erhöhten Reference Counter zurück, der in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        DLLEXPORT AlphaFeld *zFAlphaFeld() const;
        //! Gibt die Hintergrund Farbe im A8R8G8B8 Format zurück, die in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        DLLEXPORT int getFBgFarbe() const;
        //! Gibt das Hintergrund Bild zurück, das in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        DLLEXPORT Bild *getFBgBild() const;
        //! Gibt das Hintergrund Bild ohne erhöhten Reference COunter zurück, das in dem Teil des Balkens gezeichnet wird, der vom Fortschritt erfasst wurde
        DLLEXPORT Bild *zFBgBild() const;
        //! Gibt die Schrift zurück, die für die Prozentanzeige verwendet wird
        DLLEXPORT Schrift *getSchrift() const;
        //! Gibt die Schrift ohne erhöhten Reference Counter zurück, die für die Prozentanzeige verwendet wird
        DLLEXPORT Schrift *zSchrift() const;
        //! Gibt die Farbe der Prozentanzeige im A8R8G8B8 Format zurück
        DLLEXPORT int getSFarbe() const;
    };
}

#endif