#ifndef FreundesListe_H
#define FreundesListe_H

#include <Klient.h>
#include <Zeichnung.h>
#include <Fenster.h>
#include <Array.h>
#include <Knopf.h>
#include <Thread.h>

using namespace Framework;

class FreundData : private Thread
{
private:
	LRahmen *rahmen;
	AlphaFeld *auswahlBuffer;
	TextFeld *name;
	TextFeld *status;
	Knopf *entfernen;
	Knopf *ansehen;
	Knopf *nachricht;
	Knopf *einladen;
	int accountId;
	bool einladenSichtbar;
	bool online;
	bool ausgewählt;
	int höhe;
	int animation;
	unsigned char auswahlAlpha;
	double tickVal;
	bool rend;
	int ref;

public:
	// Konstruktor
	FreundData( int accountId, LRahmen *rahmen, AlphaFeld *auswahlBuffer, Schrift *zSchrift );
	// Destruktor
	~FreundData();
	// nicht constant
	void thread();
	void setName( char *txt );
	void setStatus( char *txt );
	void setOnline( bool online );
	void setAusgewählt( bool ausw );
	void löschen();
	void zeigeEinladeKnopf( bool zeigen );
	void doMausEreignis( MausEreignis &me );
	bool tick( double tickVal );
	void render( int yPos, Bild &zRObj );
	// constant
	bool istOnline() const;
	bool istAusgewählt() const;
	char *zName() const;
	Text *getName() const;
	char *zStatus() const;
	Text *getStatus() const;
	int getAccountId() const;
	int getHöhe() const;
	// reference Counting
	FreundData *getThis();
	FreundData *release();
};

class FreundesListeObj : public Zeichnung
{
private:
	RCArray< FreundData > *members;
	LRahmen *memberRahmen;
	AlphaFeld *auswahlBuffer;
	Schrift *schrift;
	VScrollBar *vsb;
	Punkt bildschirmGröße;
	bool einladenSichtbar;
	int memberNummer;
	int ref;

public:
	// Konstruktor
	FreundesListeObj( Schrift *zSchrift );
	// Destruktor
	~FreundesListeObj();
	// nicht constant
	void addMember( int accountId );
	void removeMember( int accountId );
	void removeMember( FreundData *member );
	void removeAll();
	void setName( int accountId, char *txt );
	void setStatus( int accountId, char *txt );
	void setOnline( int accountId, bool online );
	void zeigeEinladeKnopf( bool zeigen );
	bool tick( double tickVal ) override;
	void doMausEreignis( MausEreignis &me ) override;
	void render( Bild &zRObj ) override;
	// constant
	bool istFreund( int accId ) const;
	// reference Counting
	FreundesListeObj *getThis();
	FreundesListeObj *release();
};

class FreundesListe : private Thread
{
private:
	Fenster *fenster;
	TextFeld *überschrift;
	TextFeld *accountName;
	Knopf *minMax;
	Knopf *neuerFreund;
	Knopf *neuerChat;
	FreundesListeObj *freundesListe;
	Punkt bildschirmGröße;
	Fenster *neuerFreundFenster;
	TextFeld *neuerFreundSpielerName;
	Knopf *neuerFreundFertig;
	Fenster *neuerChatFenster;
	TextFeld *neuerChatName;
	Knopf *neuerChatFertig;
	TextFeld *neuesChatroomName;
	Knopf *neuesChatroomFertig;
	Bild *minimierenBild;
	Bild *maximierenBild;
	int animation;
	double tickVal;
	bool neuerFreundSichtbar;
	bool neuerChatSichtbar;
	bool rend;
	int ref;

public:
	// Konstruktor
	FreundesListe( Schrift *zSchrift, Fenster *zNachLoginFenster );
	// Destruktor
	~FreundesListe();
	// nicht constant
	void addMember( int accountId );
	void removeMember( int accountId );
	void removeMember( FreundData *member );
	void removeAll();
	void setName( int accountId, char *txt );
	void setStatus( int accountId, char *txt );
	void setOnline( int accountId, bool online );
	void setAnimation( int animation );
	void thread();
	void zeigeEinladeKnopf( bool zeigen );
	bool tick( double tickVal );
	bool druckMinMax( MausEreignis &me );
	bool druckName( TastaturEreignis &te );
	bool druckNeuerFreund( MausEreignis &me );
	bool druckNeuerChat( MausEreignis &me );
	bool druckNeuerFreundSpielerName( TastaturEreignis &te );
	bool druckNeuerFreundFertig( MausEreignis &me );
	bool druckNeuerChatName( TastaturEreignis &te );
	bool druckNeuerChatFertig( MausEreignis &me );
	bool druckNeuesChatroomName( TastaturEreignis &te );
	bool druckNeuesChatroomFertig( MausEreignis &me );
	// constant
	bool istFreund( int accId ) const;
	// reference Counting
	FreundesListe *getThis();
	FreundesListe *release();
};

// Nachrichten
bool freundesListeMinMaxME( void *p, void *obj, MausEreignis me );
bool freundesListeNameTE( void *p, void *obj, TastaturEreignis te );
bool freundesListeNeuerFreundME( void *p, void *obj, MausEreignis me );
bool freundesListeNeuerChatME( void *p, void *obj, MausEreignis me );
bool freundesListeNeuerFreundSpielerNameTE( void *p, void *obj, TastaturEreignis te );
bool freundesListeNeuerFreundFertigME( void *p, void *obj, MausEreignis me );
bool freundesListeNeuerChatNameTE( void *p, void *obj, TastaturEreignis te );
bool freundesListeNeuerChatFertigME( void *p, void *obj, MausEreignis me );
bool freundesListeNeuesChatroomNameTE( void *p, void *obj, TastaturEreignis te );
bool freundesListeNeuesChatroomFertigME( void *p, void *obj, MausEreignis me );

#endif