#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( UIInit &uiFactory )
    : ReferenceCounter()
{
    rahmen = new LRahmen();
    rahmen->setFarbe( 0xFF909090 );
    rahmen->setRamenBreite( 1 );
    rahmen->setSize( 450, 200 );
    verlauf = uiFactory.createTextFeld( uiFactory.initParam );
    verlauf->setStyle( TextFeld::Style::TextGebiet & ~( TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Hintergrund ) );
    verlauf->setText( "" );
    verlauf->setSize( 446, 174 );
    nachricht = uiFactory.createTextFeld( uiFactory.initParam );
    nachricht->setStyle( TextFeld::Style::TextFeld & ~TextFeld::Style::Buffered );
    nachricht->setText( "Dr�cke TAB um die Bestenliste anzuzeigen.\n" );
    nachricht->setSchriftFarbe( 0xFF909090 );
    nachricht->setRahmenBreite( 1 );
    nachricht->setRahmenFarbe( 0xFF909090 );
    nachricht->setSize( 446, 20 );
}

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

// nicht constant
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 );
}