/***************************************************************
 * Name:      wxkit16Main.cpp
 * Purpose:   Code for Application Frame
 * Author:     ()
 * Created:   2016-09-06
 * Copyright:  ()
 * License:
 **************************************************************/

#include "wxkit16Main.h"
#include <wx/msgdlg.h>
#include "sstream"

//(*InternalHeaders(wxkit16Frame)
#include <wx/intl.h>
#include <wx/string.h>
//*)

//helper functions
enum wxbuildinfoformat {
    short_f, long_f };

wxString wxbuildinfo(wxbuildinfoformat format)
{
    wxString wxbuild(wxVERSION_STRING);

    if (format == long_f )
    {
#if defined(__WXMSW__)
        wxbuild << _T("-Windows");
#elif defined(__UNIX__)
        wxbuild << _T("-Linux");
#endif

#if wxUSE_UNICODE
        wxbuild << _T("-Unicode build");
#else
        wxbuild << _T("-ANSI build");
#endif // wxUSE_UNICODE
    }

    return wxbuild;
}

//(*IdInit(wxkit16Frame)
const long wxkit16Frame::ID_BUTTON1 = wxNewId();
const long wxkit16Frame::ID_TEXTCTRL1 = wxNewId();
const long wxkit16Frame::ID_BUTTON2 = wxNewId();
const long wxkit16Frame::ID_LISTCTRL1 = wxNewId();
const long wxkit16Frame::ID_LISTCTRL2 = wxNewId();
const long wxkit16Frame::ID_TEXTCTRL2 = wxNewId();
const long wxkit16Frame::idMenuQuit = wxNewId();
const long wxkit16Frame::idMenuAbout = wxNewId();
const long wxkit16Frame::ID_STATUSBAR1 = wxNewId();
//*)

BEGIN_EVENT_TABLE(wxkit16Frame,wxFrame)
    //(*EventTable(wxkit16Frame)
    //*)
END_EVENT_TABLE()

wxkit16Frame::wxkit16Frame(wxWindow* parent,wxWindowID id)
{
    //(*Initialize(wxkit16Frame)
    wxMenuItem* MenuItem2;
    wxMenuItem* MenuItem1;
    wxMenu* Menu1;
    wxMenuBar* MenuBar1;
    wxMenu* Menu2;

    Create(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("id"));
    ButtonAdd = new wxButton(this, ID_BUTTON1, _("Hozzaad"), wxPoint(152,120), wxSize(83,23), 0, wxDefaultValidator, _T("ID_BUTTON1"));
    NameCtrl = new wxTextCtrl(this, ID_TEXTCTRL1, wxEmptyString, wxPoint(88,88), wxDefaultSize, 0, wxDefaultValidator, _T("ID_TEXTCTRL1"));
    ButtonTransfer = new wxButton(this, ID_BUTTON2, _("->"), wxPoint(152,192), wxSize(80,23), 0, wxDefaultValidator, _T("ID_BUTTON2"));
    ListCtrl1 = new wxListCtrl(this, ID_LISTCTRL1, wxPoint(16,168), wxSize(120,248), wxLC_REPORT, wxDefaultValidator, _T("ID_LISTCTRL1"));
    ListCtrl2 = new wxListCtrl(this, ID_LISTCTRL2, wxPoint(248,168), wxSize(128,248), wxLC_REPORT, wxDefaultValidator, _T("ID_LISTCTRL2"));
    AgeCtrl = new wxTextCtrl(this, ID_TEXTCTRL2, wxEmptyString, wxPoint(200,88), wxDefaultSize, 0, wxDefaultValidator, _T("ID_TEXTCTRL2"));
    MenuBar1 = new wxMenuBar();
    Menu1 = new wxMenu();
    MenuItem1 = new wxMenuItem(Menu1, idMenuQuit, _("Quit\tAlt-F4"), _("Quit the application"), wxITEM_NORMAL);
    Menu1->Append(MenuItem1);
    MenuBar1->Append(Menu1, _("&File"));
    Menu2 = new wxMenu();
    MenuItem2 = new wxMenuItem(Menu2, idMenuAbout, _("About\tF1"), _("Show info about this application"), wxITEM_NORMAL);
    Menu2->Append(MenuItem2);
    MenuBar1->Append(Menu2, _("Help"));
    SetMenuBar(MenuBar1);
    StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1, 0, _T("ID_STATUSBAR1"));
    int __wxStatusBarWidths_1[1] = { -1 };
    int __wxStatusBarStyles_1[1] = { wxSB_NORMAL };
    StatusBar1->SetFieldsCount(1,__wxStatusBarWidths_1);
    StatusBar1->SetStatusStyles(1,__wxStatusBarStyles_1);
    SetStatusBar(StatusBar1);

    Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&wxkit16Frame::OnButtonAddClick);
    Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&wxkit16Frame::OnButtonTransferClick);
    Connect(idMenuQuit,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&wxkit16Frame::OnQuit);
    Connect(idMenuAbout,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&wxkit16Frame::OnAbout);
    //*)
    //ChoiceBox->SetColumns(1);
    //item_num = 0;
    init_list();    ///Elkészítjük az oszlopokat és a fejléceket a listCtrl-oknak. Lásd: Main.h
    init_vector();  ///Inicializáljuk a vektort pár kezdeti értékkel. Ez csak a szemléltetéshez kell, egyébként mindent be kéne írni kézzel;
    frissit(elemek, ListCtrl1); ///Egy paraméterként megadott ListCtrl-t lefrissít egy paraméterként megadott vektor tartalmával.
}

wxkit16Frame::~wxkit16Frame()
{
    //(*Destroy(wxkit16Frame)
    //*)
}

void wxkit16Frame::OnQuit(wxCommandEvent& event)
{
    Close();
}

void wxkit16Frame::OnAbout(wxCommandEvent& event)
{
    wxString msg = wxbuildinfo(long_f);
    wxMessageBox(msg, _("Welcome to..."));
}

void wxkit16Frame::OnButtonAddClick(wxCommandEvent& event)
{
    if(NameCtrl->GetValue() != "" && AgeCtrl->GetValue() != ""){
        ember temp;
        temp.nev = NameCtrl->GetValue();
        temp.kor = konvertal(AgeCtrl->GetValue());  ///A nevet és a kort bekérjük TextCtrl-ekről, majd egy ember class-ú változó mezőibe berakjuk, azt pedig push_back-eljuk az elemek vektorunkba.
        elemek.push_back(temp);
        frissit(elemek, ListCtrl1);
        NameCtrl->SetValue("");
        AgeCtrl->SetValue("");
    }
}

void wxkit16Frame::OnButtonTransferClick(wxCommandEvent& event) ///Megjegyzés: Több elemet kiválasztani úgy tudsz, ha a kontrol-gombot lenyomva tartod, miközben bal-klikkelsz, vagy hogy bal gomb lenyomva tartásával kijelölsz ötbb elemet.
{
    int kivalasztott_elem = ListCtrl1->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); ///A GetNextItem függvény elkezd keresni az első paramétertől, a második paraméter szerint (következő, alatta, fölötte, stb.), és olyan elemeket keres, amik megfelelnek a harmadik paraméternek (kijelölt, fókuszban van, bármi, stb.). Ha talál valamit, visszaadja az idexét. ha nem talált semmit, -1-et ad vissza.
    hossz_korrekcio = 0;    ///A hossz korrekcióra (Flugi példájában int C) azért van szükség, mert ahogy tölünk a vektorból, az egyre rövidebb lesz, de a lista nem rövidül. Ezért, ha van egy 5 elemű vektorunk, és először a 3. elemet jelöltük ki, akkor a vektor 3. eleme törlődik. Ha másodiknak a lista 5. elemét jelöltük ki, akkor a program megpróbálja majd a vektor 5. elemét törölni, de MÁR NINCS 5. ELEM, MERT A VEKTOR MÁR CSAK 4 HOSSZÚ. Ezért ilyenkor ki kell vonni a törölt elemek számát. ha ezt nem tennénk meg, jó esetben csak rossz elemet kapnánk vissza, rossz esetben egy hatalmas crash-t a rosszul indexelt vektor miatt.
    while(kivalasztott_elem != -1){ ///Ha van kiválasztott elem, akkor kezdje el a ciklust.
        kiv_elemek.push_back(elemek[kivalasztott_elem-hossz_korrekcio]);
        elemek.erase(elemek.begin()+kivalasztott_elem-hossz_korrekcio);
        ++hossz_korrekcio;
        kivalasztott_elem = ListCtrl1->GetNextItem(kivalasztott_elem, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); /// Itt a kiválasztott elemtől kezdünk el keresni. Mivel az, hogy a program megtalálja a keresett elemet még nem állítja át az adott elemet "nem kiválasztott"-ra, ha mindig a lista elejéről keresnénk, végtelen ciklust kapnánk, mert az első elemet mindig megtalálnánk.
    }
    frissit(kiv_elemek, ListCtrl2);
    frissit(elemek, ListCtrl1);

}
