#ifndef Fortschritt_H
#define Fortschritt_H

#include "Objekt.h"

namespace Framework
{
	class LRahmen; // Rahmen.h
	class Farbe; // farbe.h
	class Bild; // Bild.h
	class Schrift; // Schrift.h
	class FBalken; // aus dieser Datei

	namespace FB_Style
	{
		const int Sichtbar           =  0x00001;
		const int Prozent            =  0x00002;
		const int Rahmen             =  0x00004;
		const int Hintergrund        =  0x00008;
		const int HAlpha             =  0x00010;
		const int HBild              =  0x00020;
		
		const int FRahmen            =  0x00080;
		const int FFarbe             =  0x00100;
		const int FBild              =  0x00200;
		const int FAlpha             =  0x00400;

		const int L_R                =  0x01000;
		const int R_L                =  0x02000;
		const int U_O                =  0x04000;
		const int O_U                =  0x08000;

		const int normal             =  0x0122F;
	}

	class FBalken : public Objekt
	{
	private:
		__int64 maxAk;
		__int64 ak;
		LRahmen *rahmen;
		LRahmen *fRahmen;
		Farbe *bgF;
		Farbe *fBgF;
		Bild *bgBild;
		Bild *fBgBild;
		Schrift *schrift;
		Farbe *schriftFarbe;
		unsigned char schriftGröße;
		int style;
		int ref;

	public:
		// Konstruktor 
		FBalken();
		// Destructor 
		~FBalken();
		// nicht constant 
		void setAktionAnzahl( __int64 ak ); // setzt die anzahl der Aktionen
		void aktionPlus(); // eine Aktion ist fertig
		void aktionPlus( __int64 aktionen ); // mehrere Aktionen sind fertig
		void reset(); // setzt die fertigen Aktionen zurück
		void setRahmenZ( LRahmen *ram ); // setzt einen Zeiger zum Rahmen
		void setRFarbeZ( Farbe *f ); // setzt die Rahmen Farbe
		void setRFarbe( int fc );
		void setRFarbe( Farbe *f );
		void setRBreite( int br ); // setzt die Rahmen Breite
		void setFRahmenZ( LRahmen *ram ); // setzt einen Zeiger zum Fertig Rahmen
		void setFRFarbeZ( Farbe *f ); // setzt die Fertig Rahmen Farbe
		void setFRFarbe( int fc );
		void setFRFarbe( Farbe *f );
		void setFRBreite( int br ); // setzt die Fertig Rahmen Breite
		void setBgFarbeZ( Farbe *f ); // setzt einen Zeiger zur Hintergrund Farbe
		void setBgFarbe( int fc );
		void setBgFarbe( Farbe *f );
		void setFBgFarbeZ( Farbe *f ); // setzt einen Zeiger zur Fertig Hintergrund Farbe
		void setFBgFarbe( int fc );
		void setFBgFarbe( Farbe *f );
		void setBgBildZ( Bild *b ); // setzt das Hintergrund Bild
		void setBgBild( Bild *b ); // kopiert in das Hintergrund Bild
		void setFBgBildZ( Bild *b ); // setzt das Fertig Hintergrund Bild
		void setFBgBild( Bild *b ); // kopiert in das Fertig Hintergrund Bild
		void setSchriftZ( Schrift *b ); // setzt die Schrift
		void setSFarbeZ( Farbe * f ); // setzt die Schrift Farbe
		void setSFarbe( int fc );
		void setSFarbe( Farbe *f );
		void setSGröße( unsigned char gr ); // setzt die Schrift größe
		void addStyle( int style ); // setzt den Style
		void setStyle( int style );
		void setStyle( int style, bool add_remove );
		void löscheStyle( int style );
		virtual void render( Bild *zrObj ); // zeichnet nach zrObj
		virtual void render( int xOff, int yOff, int bOff, int hOff, Bild *zrObj );
		// constant 
		__int64 getAktionAnzahl() const; // gibt die Anzahl der Aktionen zurück
		double getProzent() const; // gibt die momentane Prozentzahl zurück
		__int64 getAktion() const; // gibt die fertigen Aktionen zurück
		LRahmen *getRahmen() const; // gibt den Rahmen zurück
		LRahmen *zRahmen() const;
		LRahmen *getFRahmen() const; // gibt den Fertig Rahmen zurück
		LRahmen *zFRahmen() const;
		Farbe *getBgFarbe() const; // gibt die Hintergrund Farbe zurück
		Farbe *zBgFarbe() const;
		Farbe *getFBgFarbe() const; // gibt die Fertig Hintergrund Farbe zurück
		Farbe *zFBgFarbe() const;
		Bild *getBgBild() const; // gibt das Hintergrund Bild zurück
		Bild *zBgBild() const;
		Bild *getFBgBild() const; // gibt das Fertig Hintergrund Bild zurück
		Bild *zFBgBild() const;
		Schrift *getSchrift() const; // gibt die Schrift zurück
		Schrift *zSchrift() const;
		Farbe *getSFarbe() const; // gibt die Schrift Farbe zurück
		Farbe *zSFarbe() const;
		bool hatStyle( int style ) const; // prüft, ob style vorhanden
		bool hatStyleNicht( int style ) const; // prüft, ob style nicht vorhanden
		// Reference Counting 
		FBalken *getThis();
		FBalken *release();
	};
}

#endif