#include "group.h"

#include "label.h"
#include "checkbox.h"
#include "textbox.h"
#include "scrollBar.h"
#include "listBox.h"
#include "button.h"
#include "radioButton.h"

using namespace std;
using namespace std::placeholders;

member::member (const widget &_memberWidget)
{
    memberWidget = (widget*) &_memberWidget;
    eventClick = _memberWidget.eventClick;
    eventKeyPress = _memberWidget.eventKeyPress;
}

group::group(application *_app)
{
    eventGroupClick = [] (int x, int y, char button, int index) {};
    eventGroupKeyPress = [] (int keyCode, int index) {};
    eventGroupChanged = [] (int index) {};
    app = _app;
}

void group::eventClickForward (int x, int y, char button, widget* me)
{
    unsigned int i;
    for ( i = 0; i < members.size(); i++ )
        if ( members[i]->memberWidget == me ) break;
    eventGroupClick(x, y, button, i);
    members[i]->eventClick(x, y, button, me);
}

void group::eventKeyPressForward (int keyCode, widget* me)
{
    unsigned int i;
    for ( i = 0; i < members.size(); i++ )
        if ( members[i]->memberWidget == me ) break;
    eventGroupKeyPress(keyCode, i);
    members[i]->eventKeyPress(keyCode, me);
}

void group::eventChangedForward(widget* me)
{
    unsigned int i;
    for ( i = 0; i < members.size(); i++ )
        if ( members[i]->memberWidget == me ) break;

    // Ha rádiógombtól jön az esemény, akkor biztos azt jelenti, hogy igazra állítottuk az értékét,
    //     ezért a többit hamisra kell állítani
    if ( dynamic_cast <radioButton*> (me) )
    {
        for ( unsigned int j = 0; j < members.size(); j++ )
        {
            if ( j != i && dynamic_cast <radioButton*> (members[j]->memberWidget) )
                ((radioButton*)members[j]->memberWidget)->checked = false;
        }
    }

    eventGroupChanged(i);
}

void group::add(widget *newMember)
{
    members.push_back( new member(*newMember) );
    newMember->eventClick = [=] (int x, int y, char button, widget* me) { this->eventClickForward(x, y, button, me); };
    newMember->eventKeyPress = [=] (int keyCode, widget* me) { this->eventKeyPressForward(keyCode, me); };
    newMember->eventGroupChanged = [=] (widget* me) { this->eventChangedForward(me); };

    app->add(newMember);
}

widget& group::operator[] (int index)
{
    return *(members[index]->memberWidget);
}

group& operator<< (group &G, widget *newMember)
{
    G.add(newMember);
    return G;
}

group::~group()
{
    for ( unsigned int i = 0; i < members.size(); i++ ) delete members[i];
}
