#include "Interface.h"
#include "../../Initialisierung/Initialisierung.h"
#include "RightTools\SpielerOptionen\SpielerOptionen.h"
#include "RightTools\TeamOptionen\TeamOptionen.h"
#include "RightTools/ObjektOptionen/ObjektOptionen.h"
#include <MausEreignis.h>

using namespace Editor;

// Inhalt der Interface Klasse aus Interface.h
// Konstruktor
//  zS: Ein Zeiger auf die zu verwendende Schrift
Interface::Interface( Schrift *zS, Punkt maxSize )
{
    beenden = initKnopf( 10, 10, 100, 20, zS, Knopf::Style::Normal, "beenden" );
    right = new RightTools( zS, maxSize );
    verlassen = 0;
    schrift = zS->getThis();
    daten = 0;
    ref = 1;
}

// Destruktor
Interface::~Interface()
{
    if( daten )
        daten->release();
    schrift->release();
    beenden->release();
    right->release();
}

void Interface::setDaten( KarteDaten * daten )
{
    if( this->daten )
        this->daten->release();
    this->daten = daten;
    right->addTool( new SpielerTool( schrift, (KarteDaten *)daten->getThis() ), "Spieler" );
    right->addTool( new TeamTool( schrift, (KarteDaten *)daten->getThis() ), "Teams" );
    right->addTool( new ObjektTool( schrift, (KarteDaten *)daten->getThis() ), "Objekte" );
}

// Verarbeitet eine Mausnachricht
//  me: Die Nachricht die verarbeitet werden soll
void Interface::doMausEreignis( MausEreignis & me )
{
    bool vera = me.verarbeitet;
    beenden->doMausEreignis( me );
    if( me.verarbeitet && !vera && me.id == ME_RLinks )
    {
        verlassen = 1;
    }
    right->doMausEreignis( me );
}

// Verarbeitet eine Tastaturnachricht
//  te: Die Nachricht die verarbeitet werden soll
void Interface::doTastaturEreignis( TastaturEreignis & te )
{
    right->doTastaturEreignis( te );
}

bool Interface::tick( double time )
{
    rend |= beenden->tick( time );
    rend |= right->tick( time );
    return __super::tick( time );
}

// Zeichnet das Interface nach uRObj
//  zRObj: Das Bild in das gezeichnet werden soll
void Interface::render( Bild & zRObj )
{
    beenden->render( zRObj );
    right->render( zRObj );
}

// Setzt das Interface in den Initialisierungszustand zur�ck
void Interface::reset()
{
    verlassen = 0;
}

// Gibt zur�ck, ob der Benutzer den Editor verlassen m�chte
bool Interface::hatVerlassen() const
{
    return verlassen;
}

// erh�ht den Reference Counter
//  return: this
Interface *Interface::getThis()
{
    ref++;
    return this;
}

// verringert den Reference Counter und l�scht das Objekt wenn es nicht mehr gebraucht wird.
//  return: 0
Interface *Interface::release()
{
    if( !--ref )
        delete this;
    return 0;
}