#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:
            //! Legt fest, ob eine Prozentangebe gezechnet wird
            static const __int64 Prozent = 0x001000;
            //! Legt fest, ob die Aktionsschritte gezeichnet werden
            static const __int64 Aktionen = 0x01000000;
            //! Legt fest, ob der vom fortschritt erfasste Teil des Balkens einen
            //! eigenen Rahmen hat
            static const __int64 FRahmen = 0x002000;
            //! Legt fest, ob der vom fortschritt erfasste Teil des Balkens eine
            //! eigene Hintergrund Farbe hat
            static const __int64 FFarbe = 0x004000;
            //! Legt fest, ob der vom fortschritt erfasste Teil des Balkens ein
            //! eigenes Hintergrund Bild hat
            static const __int64 FBild = 0x008000;
            //! Legt fest, ob der vom fortschritt erfasste Teil des Balkens zum
            //! zeichnen seines Hintergrundes alpha blending verwendet
            static const __int64 FAlpha = 0x10000;
            //! Legt fest, ob der vom fortschritt erfasste Teil des Balkens einen
            //! eigenen Frb�bergang hat
            static const __int64 FBuffered = 0x20000;

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

            //! Vereint die Flags Sichtbar, Rahmen, Hintergrund, HBild, FRahmen,
            //! FBild, L_R, Prozent
            static const __int64 normal = Sichtbar | Rahmen | Hintergrund
                                        | HBild | FRahmen | FBild | L_R
                                        | Prozent | Aktionen | HBildScale;
        };

    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;
    };
} // namespace Framework

#endif