#include "Ende.h"
#include <TextFeld.h>
#include <Bild.h>
#include <MausEreignis.h>
#include <Rahmen.h>
#include <Schrift.h>

// Inhalt der Ende Klasse aus Ende.h
// Konstruktor
Ende::Ende( Schrift *zSchrift )
{
	rahmen = new LRahmen();
	rahmen->setSize( 200, 100 );
	rahmen->setRamenBreite( 2 );
	rahmen->setFarbe( 0xFFFFFFFF );
	text = new TextFeld();
	text->setStyle( TextFeld::Style::Text | TextFeld::Style::Center );
	text->setSchriftZ( zSchrift->getThis() );
	text->setText( "" );
	text->setSchriftFarbe( 0xFFFFFFFF );
	text->setSize( 200, 50 );
	warten = new TextFeld();
	warten->setStyle( ( TextFeld::Style::Text | TextFeld::Style::Center ) & ~TextFeld::Style::Sichtbar );
	warten->setSchriftZ( zSchrift->getThis() );
	warten->setText( "Bitte warten..." );
	warten->setSchriftFarbe( 0xFFFFFFFF );
	warten->setSize( 200, 50 );
	ok = new Knopf();
	ok->setStyle( Knopf::Style::Normal );
	ok->setSize( 100, 20 );
	ok->setText( "Weiter" );
	ok->setSchriftZ( zSchrift->getThis() );
	weiter = 0;
	ref = 1;
}

// Destruktor
Ende::~Ende()
{
	rahmen->release();
	text->release();
	warten->release();
	ok->release();
}

// nicht constant
void Ende::setGewonnen( char gewonnen )
{
	if( gewonnen == 1 )
	{
		text->setText( "Du hast gewonnen." );
		text->setSchriftFarbe( 0xFF00FF00 );
	}
	else if( !gewonnen )
	{
		text->setText( "Du hast verloren." );
		text->setSchriftFarbe( 0xFFFF0000 );
	}
	else
	{
		text->setText( "Unentschieden." );
		text->setSchriftFarbe( 0xFFFFFFFF );
	}
}

void Ende::doTastaturEreignis( TastaturEreignis &te )
{
    if( te.taste == T_Enter && te.id == TE_Release )
    {
        ok->removeStyle( Knopf::Style::Sichtbar );
        warten->addStyle( TextFeld::Style::Sichtbar );
        weiter = 1;
    }
}

void Ende::doPublicMausEreignis( MausEreignis &me )
{
	bool vera = me.verarbeitet;
	ok->doPublicMausEreignis( me );
	if( !vera && me.verarbeitet && me.id == ME_RLinks )
	{
		ok->removeStyle( Knopf::Style::Sichtbar );
		warten->addStyle( TextFeld::Style::Sichtbar );
		weiter = 1;
	}
	me.verarbeitet = 1;
}

void Ende::render( Bild &zRObj )
{
	rahmen->setPosition( zRObj.getBreite() / 2 - rahmen->getBreite() / 2, zRObj.getHeight() / 2 - rahmen->getHeight() / 2 );
	zRObj.alphaRegion( rahmen->getX(), rahmen->getY(), rahmen->getBreite(), rahmen->getHeight(), 0xA0000000 );
	rahmen->render( zRObj );
	text->setPosition( rahmen->getX(), rahmen->getY() );
	text->render( zRObj );
	warten->setPosition( rahmen->getX(), rahmen->getY() + 50 );
	warten->render( zRObj );
	ok->setPosition( rahmen->getX() + rahmen->getBreite() / 2 - ok->getBreite() / 2, rahmen->getY() + 65 );
	ok->render( zRObj );
}

// constant
bool Ende::getWeiter() const
{
	return weiter;
}

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

Ende *Ende::release()
{
	ref--;
	if( !ref )
		delete this;
	return 0;
}