#include "DialogosMain.h"
#include "FrameArquivo.h"

#include <sstream>
#include <iostream>
#include <iomanip>
#include <wx/msgdlg.h>

#include "Principal.h"
#include "Arquivo.h"
#include "Utils.h"

void iniciaCelulas(wxGrid *tabela)
{
    int i,j,lins=tabela->GetNumberRows(),
            cols=tabela->GetNumberCols(),
            nelemT=sizeof(T)/sizeof(double)-1;

    for (i=0; i<cols; ++i) {
        for (j=0; j<lins; ++j) {
            /*
            if (i==0) {
                tabela->SetCellRenderer(j, i, new wxGridCellNumberRenderer);
                tabela->SetCellEditor(j, i, new wxGridCellNumberEditor);
            }
            else */ if (i>0 and i<3) {
                tabela->SetCellRenderer(j, i, new wxGridCellAutoWrapStringRenderer);
                tabela->SetCellEditor(j, i, new wxGridCellAutoWrapStringEditor);
            }
            /*
            else {
                if (i < cols-nelemT) {
                    tabela->SetCellRenderer(j, i, new wxGridCellFloatRenderer);
                    tabela->SetCellEditor(j, i, new wxGridCellFloatEditor);
                }
            }

            if (i < cols-nelemT) {
                tabela->SetGridCursor(j,i);
                tabela->EnableCellEditControl();
                tabela->ShowCellEditControl();
            }
            else
            */
             if (i >= cols-nelemT)   tabela->SetReadOnly(j,i);
        }
    }
}

int limpaEntrada(wxGrid *tabela)
{
    int linha;
    tabela->AppendRows(1);
    linha = tabela->GetNumberRows() - 1;

    return linha;
}

void limpaSaida(wxGrid *tabela, int linha)
{
    int i;

    for(i=tabela->GetNumberCols()-(sizeof(T)/sizeof(double)-1); i < tabela->GetNumberRows(); ++i) {
        tabela->SetCellValue(linha,i,"");
        tabela->SetCellBackgroundColour(linha, i, *wxWHITE);
    }
}

void SetSaida(wxGrid *tabela, int linha)
{
    int i;
    wxString Tstr[RES];

    for (i=1; i < RES; ++i) {
        Tstr[i] << T[i];
        tabela->SetCellValue(linha, i+7, Tstr[i]);
        tabela->SetCellBackgroundColour(linha, i+7, *wxLIGHT_GREY);
    }
}

void SetEntrada(wxGrid *tabela, int linha)
{
    int i;
    wxString Nstr, Xstr, Ystr, DSSstr, DPstr, USstr, E1str, E2str,
             formato =_("%" + wxString::Format("%d",CAMPO) + "." + wxString::Format("%d",PRECISAO)+"f");

    Nstr << N;
    for (i = 1; i <= N; ++i) {
        Xstr << wxString::Format(formato, X[i]) << "\n";
        Ystr << wxString::Format(formato, Y[i]) << "\n";
    }
    DSSstr << DSS;
    DPstr << DP;
    USstr << US;
    E1str << E1;
    E2str << E2;

    tabela->SetCellValue(linha,0, Nstr);
    tabela->SetCellValue(linha,1, Xstr);
    tabela->SetCellValue(linha,2, Ystr);
    tabela->SetCellValue(linha,3, DSSstr);
    tabela->SetCellValue(linha,4, DPstr);
    tabela->SetCellValue(linha,5, USstr);
    tabela->SetCellValue(linha,6, E1str);
    tabela->SetCellValue(linha,7, E2str);
}

wxString valorDefault(wxGrid *tabela, int lin, int col)
{
    wxString val = tabela->GetCellValue(lin,col);

    if (val.IsEmpty())  val = _("0");

    return val;
}

void GetEntrada(wxGrid *tabela, int linha)
{
    int i;
    std::istringstream Xval(tabela->GetCellValue(linha,1).ToStdString()),
                       Yval(tabela->GetCellValue(linha,2).ToStdString());

    valorDefault(tabela,linha,0).ToLong(&N);
    for (i = 1; i <=N; ++i) {
        Xval >> X[i];
        Yval >> Y[i];
    }
    valorDefault(tabela,linha,3).ToDouble(&DSS);
    valorDefault(tabela,linha,4).ToDouble(&DP);
    valorDefault(tabela,linha,5).ToDouble(&US);
    valorDefault(tabela,linha,6).ToDouble(&E1);
    valorDefault(tabela,linha,7).ToDouble(&E2);
}

void limpaEntrada(DialogosDialog *dialogo)
{
    dialogo->TextCtrl12->Clear();
    dialogo->TextCtrl6->Clear();  dialogo->TextCtrl7->Clear();
    dialogo->TextCtrl10->Clear(); dialogo->TextCtrl11->Clear();
    dialogo->TextCtrl9->Clear();  dialogo->TextCtrl8->Clear();  dialogo->TextCtrl1->Clear();

    dialogo->TextCtrl6->Disable();  dialogo->TextCtrl7->Disable();
    dialogo->TextCtrl10->Disable(); dialogo->TextCtrl11->Disable();
    dialogo->TextCtrl9->Disable();  dialogo->TextCtrl8->Disable();  dialogo->TextCtrl1->Disable();

    dialogo->TextCtrl12->SetFocus();
}

void limpaSaida(DialogosDialog *dialogo)
{
    dialogo->TextCtrl2->Clear();   dialogo->TextCtrl3->Clear();
    dialogo->TextCtrl4->Clear();   dialogo->TextCtrl5->Clear();
    dialogo->TextCtrl13->Clear();
    dialogo->TextCtrl14->Clear(); dialogo->TextCtrl15->Clear();
}

void saidaFormatada(wxTextCtrl *campo, double valor, int precisao, int tamValor)
{
    std::ostream stream(campo);
    stream.precision(precisao);
    stream << setw(tamValor) << valor;
}

void SetSaida(DialogosDialog *dialogo)
{
    /*
    saidaFormatada(dialogo->TextCtrl2, T[1], 4, 7);
    saidaFormatada(dialogo->TextCtrl3, T[2], 4, 7);
    saidaFormatada(dialogo->TextCtrl4, T[3], 4, 7);
    saidaFormatada(dialogo->TextCtrl5, T[4], 4, 7);
    saidaFormatada(dialogo->TextCtrl13, T[5], 4, 7);
    */

    *(dialogo->TextCtrl2) << T[1];
    *(dialogo->TextCtrl3) << T[2];
    *(dialogo->TextCtrl4) << T[3];
    *(dialogo->TextCtrl5) << T[4];
    *(dialogo->TextCtrl13) << T[5];
    *(dialogo->TextCtrl14) << R2;
    *(dialogo->TextCtrl15) << RMS;
}

void SetEntrada(DialogosDialog *dialogo)
{
    int i;

    *(dialogo->TextCtrl12) << simul[regIdx].N;  *(dialogo->TextCtrl10) << simul[regIdx].DSS;
    *(dialogo->TextCtrl11) << simul[regIdx].DP;
    *(dialogo->TextCtrl9) << simul[regIdx].US;
    *(dialogo->TextCtrl8) << simul[regIdx].E1;   *(dialogo->TextCtrl1) << simul[regIdx].E2;

    for (i = 1; i <= N; ++i) {
        *(dialogo->TextCtrl6) << simul[regIdx].X[i] << "\n";
        *(dialogo->TextCtrl7) << simul[regIdx].Y[i] << "\n";
    }

    dialogo->TextCtrl12->Enable();
    dialogo->TextCtrl6->Enable();  dialogo->TextCtrl7->Enable();
    dialogo->TextCtrl10->Enable(); dialogo->TextCtrl11->Enable();
    dialogo->TextCtrl9->Enable();  dialogo->TextCtrl8->Enable();  dialogo->TextCtrl1->Enable();

    dialogo->TextCtrl12->SetFocus();
}

void validaCampo (wxTextCtrl *campo, wxTextCtrl *proxCampo, INTG *valor)
{
     if (campo->GetValue().ToLong(valor)) {
        proxCampo->Enable();
        proxCampo->SetFocus();
     }
     else
        wxMessageBox(_("Digite valor numérico !!! "));
}

void validaCampo (wxTextCtrl *campo, wxTextCtrl *proxCampo, REAL *valor)
{
     if (campo->GetValue().ToDouble(valor)) {
        proxCampo->Enable();
        proxCampo->SetFocus();
     }
     else
        wxMessageBox(_("Digite valor numérico !!! "));
}

void procLista(wxTextCtrl *campo, wxTextCtrl *proxCampo, REAL VET[])
{
    int i;
    wxString msg;

    if (campo->GetNumberOfLines() > N) {
        for (i=0; i < N and campo->GetLineText(i).ToDouble(VET+i+1); ++i);

        if (i < N) {
            msg.Printf(_("Digite valor numérico na linha %d"), i+1);
            wxMessageBox(msg);
            campo->Clear();
        }
        else {
            proxCampo->Enable();
            proxCampo->SetFocus();
        }
    }
}

