#ifndef TextFeld_H
#define TextFeld_H

#include "Objekt.h"

namespace Framework
{
	class Schrift; // Schrift.h
	class Text; // Text.h
	class Farbe; // Farbe.h
	class AlphaFeld; // AlphaFeld.h
	class LRahmen; // Rahmen.h
	class TextFeld; // aus dieser Datei
	class TextFeldArray; // aus dieser Datei

	namespace TF_Style
	{
		const int Sichtbar           =  0x00001;
		const int Erlaubt            =  0x00002;
		const int Rahmen             =  0x00004;
		const int Hintergrund        =  0x00008;
		const int HAlpha             =  0x00010;
		const int HBild              =  0x00020;
		const int Fokus              =  0x00080;

		const int Mehrzeilig         =  0x00100;
		const int HCenter            =  0x00200;
		const int VCenter            =  0x00400;
		const int Mehrfarbig         =  0x00800;

		const int Center             =  0x00600;
		const int TextFeld           =  0x00447;
		const int Text               =  0x00901;
		const int TextGebiet         =  0x0090F;
	}

	class TextFeld : public Objekt
	{
	private:
		int style;
		unsigned char schriftGröße;
		Schrift *schrift;
		Text *buffer;
		Farbe *bgF;
		Farbe *sF;
		AlphaFeld *bgBuff;
		LRahmen *rahmen;
		Bild *bgBild;
		unsigned char showChar;
		int begf, cpos;
		double tickVal;
		int ref;

	public:
		// Konstruktor 
		TextFeld();
		// Destruktor 
		~TextFeld();
		// nicht constant 
		void update(); // aktualisiert Position und größe 
		void setText( Text *txt ); // setzt den angezeigten Text
		void setTextZ( Text *txt ); // setzt einen Zeiger zum angezeigten Text
		void setAuswahl( int pos1, int pos2 ); // setzt den Ausgewählten Text
		void setAuswahl( Punkt *auswahl );
		void setText( const char *txt ); // setzt den angezeigten Text
		void setHintergrundBild( Bild *bild ); // setzt das Hintergrund Bild
		void setHintergrundBildZ( Bild *bild ); // setzt einen Zeiger zum Hintergrund Bild
		void setHintergrundFarbe( int fc ); // setzt die Hintergrundfarbe
		void setHintergrundFarbe( Farbe *f );
		void setHintergrundFarbeZ( Farbe *f ); // setzt einen Zeiger zur Hintergrundfarbe
		void setSchriftZ( Schrift *schrift ); // setzt einen Zeiger zur Schrift
		void setSchriftGröße( unsigned char gr ); // setzt die Schriftgröße
		void setSchriftFarbe( int fc ); // setzt die Schrift Farbe
		void setSchriftFarbe( Farbe *f );
		void setSchriftFarbeZ( Farbe *f ); // setze einen Zeiger zur Schriftfarbe
		void setLRZ( LRahmen *ram ); // setzt einen Zeiger zum Rahmen
		void setLRBreite( int br ); // setzt die Breite des Rahmens
		void setLRFarbe( int fc ); // setzt die Farbe des Rahmens
		void setLRFarbe( Farbe *f );
		void setLRFarbeZ( Farbe *f ); // setzt einen Zeiger zur Farbe des Rahmens
		void setSchowChar( unsigned char c ); // bei Passwortfeld *
		void setStyle( int style ); // setzt den Style des Text Feldes
		void setStyle( int style, bool add_löschen );
		void addStyle( int style );
		void löscheStyle( int style );
		virtual void tick( double tickval ); // tick
		virtual void doMausEreignis( MausEreignis *te ); // Maus Ereignis
		virtual void doTastaturEreignis( TastaturEreignis *te ); // Tastatur Ereignis
		virtual void render( Bild *zrObj ); // zeichenet nach rObj
		virtual void render( int xOff, int yOff, int bOff, int hOff, Bild *zrObj );
		// Konstant 
		Text *getText() const; // gibt getThis vom Text zurück
		Text *zText() const; // gibt den Text zurück
		Bild *getHintergrundBild() const; // gibt getThis vom Hintergrund Bild zurück
		Bild *zHintergrundBild() const; // gibt das Hintergrund Bild zurück
		Farbe *getHintergrundFarbe() const; // giebt getThis der Hintergrundfarbe zurück
		Farbe *zHintergrundFarbe() const; // gibt die Hintergrundfarbe zurück
		int getHintergrundFarbeCode() const;
		Schrift *getSchrift() const;// gint getThis der Schrift Zurück
		Schrift *zSchrift() const;// gibt die Schrift zurück
		unsigned char getSchriftGröße() const; // gibt die Schriftgröße zurück
		Farbe *getSchriftFarbe() const;// gibt getThis der Schriftfarbe zurück
		Farbe *zSchriftFarbe() const; // gibt die Schriftfarbe zurück
		int getSchriftFarbeCode() const;
		LRahmen *getLR() const; // gibt getThis des Rahmens zurück
		LRahmen *zLR() const; // gibt den Rahmen zurück
		int getLRBreite() const; // gibt die Breite des Rahmens zurück
		Farbe *getLRFarbe() const; // gibt getThis der Farbe des Rahmens zurück
		Farbe *zLRFarbe() const; // gibt die Farbe des Rahmens zurück
		int getLRFarbeCode() const;
		unsigned char getShowChar() const; // gibt den Anzeige Char zurück
		bool hatStyle( int style ) const; // prüft, ob style vorhanden
		bool hatStyleNicht( int style ) const; // prüft, ob style nicht vorhanden
		int getMarkierungLänge() const; // gibt die Länge der Markierung zurück
		// Reference Counting 
		TextFeld *getThis();
		TextFeld *release();
	};
}
#endif