#include "RightTools.h"
#include "../../../Initialisierung/Initialisierung.h"


RightTool::RightTool()
    : Zeichnung()
{
    ref = 1;
}

RightTool::~RightTool()
{}

RightTool *RightTool::getThis()
{
    ref++;
    return this;
}

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


RightTools::RightTools( Schrift *zSchrift, Punkt maxSize )
    : ZeichnungHintergrund()
{
    ref = 1;
    this->maxSize = maxSize;
    toolAuswahl = initAuswahlBox( 5, 5, 290, 20, zSchrift, AuswahlBox::Style::Normal, {} );
    toolAuswahl->setEventAktion( [ this ]( void *, AuswahlBox *, int, int neu )
    {
        this->selectTool( neu );
    } );
    tools = new RCArray< RightTool >();
    setSize( 300, maxSize.y );
    setPosition( maxSize.x - 300, 0 );
    setStyle( ZeichnungHintergrund::Style::Sichtbar | ZeichnungHintergrund::Style::Rahmen |
              ZeichnungHintergrund::Style::Hintergrund );
    setHintergrundFarbe( 0xFF000000 );
    setLinienRahmenBreite( 1 );
    setLinienRahmenFarbe( 0xFFFFFFFF );
}

RightTools::~RightTools()
{
    tools->release();
    toolAuswahl->release();
}

void RightTools::addTool( RightTool *tool, char *name )
{
    if( !toolAuswahl->getEintragAnzahl() )
        tool->addStyle( Zeichnung::Style::Sichtbar );
    toolAuswahl->addEintrag( name );
    tools->add( tool );
    tool->setPosition( 5, 30 );
    tool->setSize( 290, maxSize.y - 35 );
}

void RightTools::doMausEreignis( MausEreignis &me )
{
    me.mx -= pos.x, me.my -= pos.y;
    toolAuswahl->doMausEreignis( me );
    int anz = tools->getEintragAnzahl();
    for( int i = 0; i < anz; i++ )
    {
        tools->z( i )->doMausEreignis( me );
    }
    me.mx += pos.x, me.my += pos.y;
}

void RightTools::doTastaturEreignis( TastaturEreignis &te )
{
    toolAuswahl->doTastaturEreignis( te );
    int anz = tools->getEintragAnzahl();
    for( int i = 0; i < anz; i++ )
    {
        tools->z( i )->doTastaturEreignis( te );
    }
}

bool RightTools::tick( double tickVal )
{
    bool ret = __super::tick( tickVal );
    ret |= toolAuswahl->tick( tickVal );
    int anz = tools->getEintragAnzahl();
    for( int i = 0; i < anz; i++ )
    {
        ret |= tools->z( i )->tick( tickVal );
    }
    return ret;
}

void RightTools::render( Bild &rObj )
{
    __super::render( rObj );
    if( rObj.setDrawOptions( pos, gr ) )
    {
        toolAuswahl->render( rObj );
        int anz = tools->getEintragAnzahl();
        for( int i = 0; i < anz; i++ )
        {
            tools->z( i )->render( rObj );
        }
        rObj.releaseDrawOptions();
    }
}

void RightTools::selectTool( int index )
{
    int i = 0;
    for( auto e = tools->getIterator(); e; e++ )
        e->setStyle( Zeichnung::Style::Sichtbar, i++ == index );
}

RightTools *RightTools::getThis()
{
    ref++;
    return this;
}

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