#include "Chat.h"
#include <Rahmen.h>
#include <MausEreignis.h>
#include <TastaturEreignis.h>
#include <Text.h>
#include <Schrift.h>
#include <Punkt.h>
#include <Bild.h>

// Inhalt der SpielChat Klasse aus Chat.h
// Konstruktor
SpielChat::SpielChat()
{
	rahmen = new LRahmen();
	rahmen->setFarbe( 0xFF909090 );
	rahmen->setRamenBreite( 1 );
	rahmen->setSize( 450, 200 );
	verlauf = new TextFeld();
	verlauf->setStyle( TextFeld::Style::TextGebiet & ~( TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Hintergrund ) );
	verlauf->setText( "" );
	verlauf->setSchriftFarbe( 0xFFFFFFFF );
	verlauf->setSchriftSize( 12 );
	verlauf->setSize( 446, 174 );
	nachricht = new TextFeld();
	nachricht->setStyle( TextFeld::Style::TextFeld & ~TextFeld::Style::Buffered );
	nachricht->setText( "Dr�cke TAB um die Bestenliste anzuzeigen.\n" );
	nachricht->setSchriftFarbe( 0xFF909090 );
	nachricht->setSchriftSize( 12 );
	nachricht->setRahmenBreite( 1 );
	nachricht->setRahmenFarbe( 0xFF909090 );
	nachricht->setSize( 446, 20 );
	ref = 1;
}

// Destruktor
SpielChat::~SpielChat()
{
	rahmen->release();
	verlauf->release();
	nachricht->release();
}

// nicht constant
void SpielChat::setSchrift( Schrift *zSchrift )
{
	verlauf->setSchriftZ( zSchrift->getThis() );
	nachricht->setSchriftZ( zSchrift->getThis() );
}

void SpielChat::addNachricht( char *nachricht )
{
	verlauf->addZeile( nachricht, 0xFFFFFFFF );
	verlauf->updateVScroll();
}

void SpielChat::addNachricht( char *nachricht, int farbe )
{
	verlauf->addZeile( nachricht, farbe );
	verlauf->updateVScroll();
}

void SpielChat::doPublicMausEreignis( MausEreignis &me )
{
	bool vera = me.verarbeitet;
	verlauf->doPublicMausEreignis( me );
	nachricht->doPublicMausEreignis( me );
	if( !vera && me.verarbeitet )
	{
		nachricht->setRahmenFarbe( 0xFFFFFFFF );
		nachricht->setSchriftFarbe( 0xFFFFFFFF );
		verlauf->setVertikalScrollFarbe( 0xFF808080, 0 );
		rahmen->setFarbe( 0xFFFFFFFF );
	}
	else
	{
		nachricht->setRahmenFarbe( 0xFF909090 );
		nachricht->setSchriftFarbe( 0xFF909090 );
		verlauf->setVertikalScrollFarbe( 0xFF404040, 0 );
		rahmen->setFarbe( 0xFF909090 );
	}
}

void SpielChat::doTastaturEreignis( TastaturEreignis &te, KSGClient::SpielServerClient *zKlient )
{
	if( te.taste == T_Esc )
		nachricht->removeStyle( TextFeld::Style::Fokus );
	if( te.id == TE_Release && te.taste == T_Enter && !te.verarbeitet )
	{
		if( nachricht->hatStyle( TextFeld::Style::Fokus ) )
		{
			if( nachricht->zText()->getLength() )
			{
				short l�n = 1 + nachricht->zText()->getLength();
				char *bytes = new char[ l�n + 1 ];
				*bytes = 8;
				for( int i = 1; i <= l�n; i++ )
					bytes[ i ] = nachricht->zText()->getText()[ i - 1 ];
				nachricht->setText( "" );
				nachricht->setAuswahl( 0, 0 );
				nachricht->removeStyle( TextFeld::Style::Fokus );
				zKlient->spielNachricht( l�n, bytes );
				delete[] bytes;
				te.verarbeitet = 1;
			}
		}
		else
		{
			nachricht->addStyle( TextFeld::Style::Fokus );
			nachricht->setAuswahl( 0, nachricht->zText()->getLength() );
			te.verarbeitet = 1;
		}
	}
	if( !te.verarbeitet )
		nachricht->doTastaturEreignis( te );
	if( nachricht->hatStyle( TextFeld::Style::Fokus ) )
	{
		nachricht->setRahmenFarbe( 0xFFFFFFFF );
		nachricht->setSchriftFarbe( 0xFFFFFFFF );
		verlauf->setVertikalScrollFarbe( 0xFF808080, 0 );
		rahmen->setFarbe( 0xFFFFFFFF );
	}
	else
	{
		nachricht->setRahmenFarbe( 0xFF909090 );
		nachricht->setSchriftFarbe( 0xFF909090 );
		verlauf->setVertikalScrollFarbe( 0xFF404040, 0 );
		rahmen->setFarbe( 0xFF909090 );
	}
}

void SpielChat::tick( double z )
{
	nachricht->tick( z );
}

void SpielChat::render( Bild &zRObj )
{
    rahmen->setPosition( Punkt( 10, zRObj.getHeight() - 210 ) );
    verlauf->setPosition( rahmen->getX() + 2, rahmen->getY() + 2 );
    nachricht->setPosition( rahmen->getX() + 2, rahmen->getY() + 178 );
	rahmen->render( zRObj );
	verlauf->render( zRObj );
	nachricht->render( zRObj );
}

// constant
bool SpielChat::istAktiv() const
{
	return nachricht->hatStyle( TextFeld::Style::Fokus );
}

// Reference Counting
SpielChat *SpielChat::getThis()
{
	ref++;
	return this;
}

SpielChat *SpielChat::relese()
{
	ref--;
	if( !ref )
		delete this;
	return 0;
}