#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QString>
#include <iostream>
#include <fstream>
#include <qregexp.h> ///
#include "loadfile.h"
#include <QProcess>
#include <QTextDocument>
#include <QTextEdit>
#include <QMessageBox>
#include <QStringList>
#include <QTextStream>
#include "dialog.h"
#include "dialog2.h"

#include "ellipsoids.h"



Widget* Widget::instance = NULL;

Widget* Widget::getInstance()
{
    if (!instance)
        instance = new Widget();
    return instance;
}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    /////////INITIAL SETUP FOR BUTTONS etc./////////////

        ui->tabWidget->setCurrentIndex(0);

        ui->toolBox->setItemEnabled(1,false);
        ui->toolBox->setItemEnabled(2,false);
        ui->toolBox->setItemEnabled(3,false);
        ui->toolBox->setItemEnabled(4,false);
        ui->toolBox->setItemEnabled(5,false);

        ui->lineEdit_2->setEnabled(false);
        ui->lineEdit->setEnabled(true);

        ui->proj_edit_FROM->setEnabled(false); // Disable proj2 line edit
        ui->ellips_edit_FROM->setEnabled(false); // Disable proj2 line edit
        ui->ellips_edit_TO->setEnabled(true);
        ui->list_ellips->setEnabled(true);
        ////////////////////////////////////////////////////

        // Detect proj command
        QProcess *ini = new QProcess(parent);
        ini->start("which proj");
        ini->waitForFinished();
        if(ini->exitCode()==1)

        {
            QMessageBox box(this);
            box.setWindowTitle("Error");
            box.setGeometry(100,100,200,200);
            box.setText("proj has not been found");
            std::cout << "proj has not been found" << std::endl;
            delete ui;
        }
    else
    {
        proj_dir = ini->readAllStandardOutput();
    }

    // SET ALL VARIABLES TO EMPTY
    ui->phi_coordinate->setText("");
    ui->lambda_coordinate->setText("");
    ui->x_coordinate->setText("");
    ui->y_coordinate->setText("");
    file = false;
    file_path = "";

    // SET ALL ELLIPSOIDS TO BOTH WIDGETS
    ui->list_ellips->addItems(*Ellipsoids::getInstance()->getDescriptions());
    ui->listWidget->addItems(*Ellipsoids::getInstance()->getDescriptions());

    // SET ALL PROJECTIONS TO WIDGET
    ui->list_projs->addItems(*Projections::getInstance()->getDescriptions());
    ui->list_projs_2->addItems(*Projections::getInstance()->getDescriptions());

    // SET ALL DATUMS TO WIDGET
    ui->list_datums->addItems(*Datums::getInstance()->getDescriptions());
    ui->list_datums_2->addItems(*Datums::getInstance()->getDescriptions());

    // SET ALL UNITS TO WIDGET
    ui->list_units->addItems(*Units::getInstance()->getDescriptions());

    ui->list_ellips->sortItems();
    ui->listWidget->sortItems();
    ui->list_projs->sortItems();
    ui->list_projs_2->sortItems();
    ui->list_datums->sortItems();
    ui->list_datums_2->sortItems();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_button_proj_clicked()
{
    QMessageBox box;
    box.setWindowTitle("Error");
    box.setGeometry(100,100,200,200);

    QString command;

    if(ui->radioButton_Proj->isChecked())
    {
        command = proj_dir + " " ;
    }
    else if(ui->radioButton_Cs->isChecked())
    {    
    // SOURCE PARAMETERS PROCESSING
        command = "/usr/bin/cs2cs  ";

        QString sourcePar = getSourceParameters();
        if(sourcePar == false)
            return;
        else
            command += sourcePar;
     }

     //TARGET PARAMETERS PROCESSING
     QString tarPar = getTargetParameters();
     if(tarPar == false)
         return;
     else
         command += tarPar;


    if(!file)
    {
        QString coordinates;
        if(ui->phi_coordinate->text().isEmpty())
        {
            box.setText("Phi coordinate not defined");
            box.exec();
            return;
        }
        else
        {
            coordinates += ui->phi_coordinate->text();
        }

        if(ui->lambda_coordinate->text().isEmpty())
        {
            box.setText("Lambda coordinate not defined");
            box.exec();
            return;
            }
        else
        {
                coordinates += " ";
                coordinates += ui->lambda_coordinate->text();
        }

        QFile file("/tmp/proj_input.txt");
        file.open(QIODevice::WriteOnly | QIODevice::Text);
        QTextStream out(&file);
        out << coordinates;
        file.close();
        command += " /tmp/proj_input.txt ";
    }
    else
    {
        command += " ";
        command += file_path;
    }

    // Execute proj command
    std::cout << command.toStdString() << std::endl;
    QProcess *exe = new QProcess();
    exe->start(command);
    exe->waitForFinished();
    // Process the result
    if(exe->exitCode()!=0)
    {
        QMessageBox box(this);
        box.setWindowTitle("Error");
        box.setGeometry(100,100,200,200);
        box.setText("Problem with running command proj");
        box.exec();
    }
    else
    {        
        result = exe->readAllStandardOutput();
        QString proj_result = "output: [X, Y]\n===============================\n";
        proj_result += result;

        if(!file)
        {            
            QStringList list = result.split(QRegExp("\\s+"));
            ui-> x_coordinate->setText(list.at(0));
            ui->y_coordinate->setText(list.at(1));
        }
        ui->textBrowser->setText(proj_result);
        ui->textBrowser->setToolTip("");
    }
}

void Widget::on_button_invproj_clicked()
{
    QMessageBox box;
    box.setWindowTitle("Error");
    box.setGeometry(100,100,200,200);

    QString command;

  if(ui->radioButton_Proj->isChecked())    {
        command = proj_dir + " -I ";
  }
  else if(ui->radioButton_Cs->isChecked())
  {
      // SOURCE PARAMETERS PROCESSING
        command = "/usr/bin/cs2cs -I  ";

        QString sourcePar = getSourceParameters();
        if(sourcePar == false)
            return;
        else
            command += sourcePar;
   }

   //TARGET PARAMETERS PROCESSING
   QString tarPar = getTargetParameters();
   if(tarPar == false)
       return;
   else
       command += tarPar;

   if(!file)
   {
        QString coordinates;
        if(ui->x_coordinate->text().isEmpty())
        {
            box.setText("X coordinate not defined");
            box.exec();
            return;
        }
        else
        {
            coordinates += ui->x_coordinate->text();
        }

        if(ui->y_coordinate->text().isEmpty())
        {
            box.setText("Y coordinate not defined");
            box.exec();
            return;
        }
        else
        {
            coordinates += " ";
            coordinates += ui->y_coordinate->text();
        }

        QFile file("/tmp/proj_input.txt");
        file.open(QIODevice::WriteOnly | QIODevice::Text);
        QTextStream out(&file);
        out << coordinates;
        file.close();
        command += " /tmp/proj_input.txt";
    }
    else
    {
        command += " ";
        command += file_path;
    }

    // Execute proj command
    QProcess *exe = new QProcess();
    exe->start(command);
    exe->waitForFinished();
    //std::cout << "exit code: " << exe->exitCode() << " exit status: " << exe->exitStatus() << std::endl;

    if(exe->exitCode()!=0)
    {
        QMessageBox box(this);
        box.setWindowTitle("Error");
        box.setGeometry(100,100,200,200);
        box.setText("Problem with running command - probably invproj is not supported" );
        box.exec();
        return;
    }
    else
    {
        result = exe->readAllStandardOutput();
        if(!result.isNull())
        {
            QString proj_result = "output: [Phi, Lam]\n===============================\n";
            proj_result += result;

            if(!file)
            {
                QStringList list = result.split(QRegExp("\\s+"));
                ui-> phi_coordinate->setText(list.at(0));
                ui->lambda_coordinate->setText(list.at(1));
            }
            ui->textBrowser->setText(proj_result);
            ui->textBrowser->setToolTip("Phi = Longitude\nLam = Latitude");
        }
        else
        {
            QMessageBox box(this);
            box.setWindowTitle("Error");
            box.setGeometry(100,100,200,200);
            box.setText("Undefined problem with running command");
            box.exec();
            return;
        }
    }
}

void Widget::on_load_file_button_clicked()
{
    ui->file_path->clear();
    ui->file_path->setStyleSheet("background-color: white");

    QFileDialog fd(this, tr("Open file with data"), QDir::homePath(), tr("Phi, Lambda or X, Y (*.*);;Phi, Lambda, Azimuth, Distance or Phi, Lambda, Phi, Lambda (*.*)"));
    if( fd.exec() ) {
        file_path = fd.selectedFiles()[0];

        if(file_path.isEmpty())
            return;

        QString file_format = fd.selectedNameFilter();
        QString file_path2 = LoadFile::parseFile(file_path, file_format);

        if(file_path2[0] != QChar('!'))
        {
            ui->file_path->setText(file_path);
            ui->x_coordinate->setDisabled(true);
            ui->y_coordinate->setDisabled(true);
            ui->phi_coordinate->setDisabled(true);
            ui->lambda_coordinate->setDisabled(true);
            file = true;
            file_path = file_path2;
        }
        else
        {
            file = false;
            ui->file_path->setText(file_path2);
            ui->file_path->setStyleSheet("background-color: red");
            ui->x_coordinate->setDisabled(false);
            ui->y_coordinate->setDisabled(false);
            ui->phi_coordinate->setDisabled(false);
            ui->lambda_coordinate->setDisabled(false);
            file_path = "";
        }
    }
}

void Widget::on_button_export_clicked()
{
    QFileDialog fd(this, tr("Save File"), QDir::homePath(), tr("CSV - comma separator (*.csv);;CSV - semicolon separator (*.csv)"));
    if( fd.exec() ) {
        QString output_path = fd.selectedFiles()[0];
        QString file_format = fd.selectedNameFilter();

        QString suffix = ".csv";
        QStringRef op_suffix = output_path.rightRef(4);
        if (op_suffix != suffix) {
            output_path += suffix;
        }
        LoadFile::saveAsCSV(output_path, file_format, result);
    }
}

QStringList SearchInList(QString search_proj,QStringList list_names) //Function search string in list
{
    QStringList container;

    for(int i=0;i<list_names.length();i++)
    {
        QString slovo=list_names.at(i);
        int a = slovo.toLower().indexOf(search_proj);
        int b = slovo.indexOf(search_proj);

        if(a>0||b>0)
           {
           container.append(list_names.at(i));
           }
    }

    return container;

}

void Widget::on_proj_edit_TO_textChanged(QString) //Line edit for projection-TO search
{
 QString read_proj=ui->proj_edit_TO->text();
 QStringList cont;
 cont=SearchInList(read_proj,*Projections::getInstance()->getDescriptions());

   ui->list_projs->clear();

   if(read_proj.isEmpty())
   {
       ui->list_projs->addItems(*Projections::getInstance()->getDescriptions());
   }
   ui->list_projs->addItems(cont);
}

void Widget::on_ellips_edit_TO_textChanged(QString) //Line edit for ellipsoid-TO search
{
    QString read_ellips=ui->ellips_edit_TO->text();
    ui->list_ellips->clear();
    if(read_ellips.isEmpty())
    {
        ui->list_ellips->addItems(*Ellipsoids::getInstance()->getDescriptions());
    }
    else
    {
        QStringList description = *Ellipsoids::getInstance()->getDescriptions();
        Qt::CaseSensitivity cs = Qt::CaseInsensitive;
        ui->list_ellips->addItems(description.filter(read_ellips, cs));
    }
}

void Widget::on_proj_edit_FROM_textChanged(QString) //Line edit for projection-FROM search
{
    QString read_proj=ui->proj_edit_FROM->text();
    QStringList cont;
    cont=SearchInList(read_proj,*Projections::getInstance()->getDescriptions());

      ui->list_projs_2->clear();

      if(read_proj.isEmpty())
      {
          ui->list_projs_2->addItems(*Projections::getInstance()->getDescriptions());
      }
      ui->list_projs_2->addItems(cont);
}

void Widget::on_ellips_edit_FROM_textChanged(QString ) //Line edit for ellipsoid-FROM search
{
    QString read_ellips=ui->ellips_edit_FROM->text();
    ui->listWidget->clear();
    if(read_ellips.isEmpty())
    {
        ui->listWidget->addItems(*Ellipsoids::getInstance()->getDescriptions());
    }
    else
    {
        QStringList description = *Ellipsoids::getInstance()->getDescriptions();
        Qt::CaseSensitivity cs = Qt::CaseInsensitive;
        ui->listWidget->addItems(description.filter(read_ellips, cs));
    }
}

void Widget::on_button_cancel_lod_clicked()
{
    ui->file_path->clear();
    ui->file_path->setStyleSheet("background-color: white");
    file=false;
    ui->x_coordinate->setDisabled(false);
    ui->y_coordinate->setDisabled(false);
    ui->phi_coordinate->setDisabled(false);
    ui->lambda_coordinate->setDisabled(false);
}

void Widget::on_button_add_ellips_FROM_clicked()
{
    Dialog d;
    d.exec();
    ui->list_ellips->clear();
    ui->list_ellips->addItems(*Ellipsoids::getInstance()->getDescriptions());
    ui->list_ellips->sortItems();
    ui->listWidget->clear();
    ui->listWidget->addItems(*Ellipsoids::getInstance()->getDescriptions());
    ui->listWidget->sortItems();
}

void Widget::on_compute_button_clicked()
{
    QMessageBox box;
    box.setWindowTitle("Error");
    box.setGeometry(100,100,200,200);

    QString command;

    if(ui->geod->isChecked())
    {
        command += "geod";
    }
    else
    {
        command += "invgeod";
    }

    if(ui->list_ellips->currentItem() )
    {
        command += " +ellps=";
        command += Ellipsoids::getInstance()->findEllipsoid(ui->list_ellips->currentItem()->text());
    }
    else
    {
        box.setText("Ellipsoid not defined");
        box.exec();
        return;
    }

    if(ui->list_units->currentItem() )
    {
        command += " +units=";
        command += Units::getInstance()->findUnit(ui->list_units->currentItem()->text());
    }

    if(!file)
    {
        QString coordinates;
        if(ui->start_phi->text().isEmpty())
        {
            box.setText("Start PHI coordinate not defined");
            box.exec();
            return;
        }
        else
        {
            coordinates += ui->start_phi->text();
        }

        if(ui->start_lambda->text().isEmpty())
        {
            box.setText("Start LAMBDA coordinate not defined");
            box.exec();
            return;
            }
        else
        {
                coordinates += " ";
                coordinates += ui->start_lambda->text();
        }

        if(ui->geod->isChecked())
        {
            if(ui->start_azimut->text().isEmpty())
            {
                box.setText("Start AZIMUT not defined");
                box.exec();
                return;
            }
            else
            {
                coordinates += " ";
                coordinates += ui->start_azimut->text();
            }
            if(ui->distance->text().isEmpty())
            {
                box.setText("Distance");
                box.exec();
                return;
            }
            else
            {
                coordinates += " ";
                coordinates += ui->distance->text();
            }
        }
        else
        {
            if(ui->end_phi->text().isEmpty())
            {
                box.setText("End PHI coordinate not defined");
                box.exec();
                return;
            }
            else
            {
                coordinates += " ";
                coordinates += ui->end_phi->text();
            }
            if(ui->end_lambda->text().isEmpty())
            {
                box.setText("End LAMBDA coordinate not defined");
                box.exec();
                return;
                }
            else
            {
                    coordinates += " ";
                    coordinates += ui->end_lambda->text();
            }
        }

        QFile file("/tmp/proj_input.txt");
        file.open(QIODevice::WriteOnly | QIODevice::Text);
        QTextStream out(&file);
        out << coordinates;
        file.close();
        command += " /tmp/proj_input.txt ";
    }
    else
    {
        command += " ";
        command += file_path;
    }

    // Execute proj command
    QProcess *exe = new QProcess();
    exe->start(command);
    exe->waitForFinished();
    // Process the result
    if(exe->exitCode()==1)
    {
        QMessageBox box(this);
        box.setWindowTitle("Error");
        box.setGeometry(100,100,200,200);
        box.setText("Problem with running command proj");
        box.exec();
    }
    else
    {
        result = exe->readAllStandardOutput();
        QString geod_result = "";
        if(!file)
        {
            QStringList list = result.split(QRegExp("\\s+"));
            if(ui->geod->isChecked())
            {
                ui->end_phi->setText(list.at(0));
                ui->end_lambda->setText(list.at(1));
                ui->end_azimut->setText(list.at(2));
                geod_result = "output: [Phi, Lam, A]\n===============================\n";
                ui->textBrowser->setToolTip("Phi = Longitude\nLam = Latitude\nA = Azimuth from end point to start point");
            }
            else
            {
                ui->start_azimut->setText(list.at(0));
                ui->end_azimut->setText(list.at(1));
                ui->distance->setText(list.at(2));
                geod_result = "output: [A1, A2, D]\n===============================\n";
                ui->textBrowser->setToolTip("A1 = Azimuth from start point to end point\nA2 = Azimuth from end point to start point\nD  = Distance");
            }
        }
        geod_result += result;
        ui->textBrowser->setText(geod_result);
    }

    //std::cout << "/usr/bin/proj " << " +proj=" << projection.toStdString() << " +ellps=" << ellipsoid.toStdString() << "\n" << phi.toStdString() << " " << lambda.toStdString() << std::endl;

}

void Widget::on_geod_clicked(bool checked)
{
    if(checked)
    {
        ui->end_phi->setDisabled(true);
        ui->end_lambda->setDisabled(true);
        ui->end_azimut->setDisabled(true);
        ui->start_phi->setDisabled(false);
        ui->start_lambda->setDisabled(false);
        ui->distance->setDisabled(false);
        ui->start_azimut->setDisabled(false);
    }
}

void Widget::on_invgeod_clicked(bool checked)
{
    if(checked)
    {
        ui->end_phi->setDisabled(false);
        ui->end_lambda->setDisabled(false);
        ui->end_azimut->setDisabled(true);
        ui->start_phi->setDisabled(false);
        ui->start_lambda->setDisabled(false);
        ui->distance->setDisabled(true);
        ui->start_azimut->setDisabled(true);
    }
}

void Widget::on_tabWidget_currentChanged(int index)
{
    if(index==0) //Projection
    {
        ui->advanced->setEnabled(true);

        if(ui->radioButton_Cs->isChecked())
        {
            ui->listWidget->setDisabled(false);
            ui->ellips_edit_FROM->setDisabled(false);
        }

        if(!ui->advanced->isChecked())
        {

            ui->toolBox->setItemEnabled(0,true);
            ui->toolBox->setItemEnabled(1,false);
            ui->toolBox->setItemEnabled(2,false);
            ui->toolBox->setItemEnabled(3,false);
            ui->toolBox->setItemEnabled(4,false);
            ui->toolBox->setItemEnabled(5,false);

            ui->toolBox->setCurrentIndex(0);
        }
        else
        {

            ui->toolBox->setItemEnabled(0,false);
            ui->toolBox->setItemEnabled(1,true);
            ui->toolBox->setItemEnabled(2,true);
            ui->toolBox->setItemEnabled(3,true);
            ui->toolBox->setItemEnabled(4,true);
            ui->toolBox->setItemEnabled(5,true);

            ui->toolBox->setCurrentIndex(1);
        }
    }
    else if (index==1) //Geod
    {
        ui->advanced->setEnabled(false);
        //MAIN WIDGETS

        ui->toolBox->setItemEnabled(0,false);
        ui->toolBox->setItemEnabled(1,false);
        ui->toolBox->setItemEnabled(2,true);
        ui->toolBox->setItemEnabled(3,true);
        ui->toolBox->setItemEnabled(4,false);
        ui->toolBox->setItemEnabled(5,false);

        ui->toolBox->setCurrentIndex(2);

        if(ui->radioButton_Cs->isChecked())
        {
            ui->listWidget->setDisabled(true);
            ui->ellips_edit_FROM->setDisabled(true);
        }

        //OTHER WIDGETS
        if(ui->geod->isChecked())
        {
            ui->end_phi->setDisabled(true);
            ui->end_lambda->setDisabled(true);
            ui->end_azimut->setDisabled(true);
            ui->start_phi->setDisabled(false);
            ui->start_lambda->setDisabled(false);
            ui->distance->setDisabled(false);
            ui->start_azimut->setDisabled(false);
        }
        else if(ui->invgeod->isChecked())
        {
            ui->end_phi->setDisabled(false);
            ui->end_lambda->setDisabled(false);
            ui->end_azimut->setDisabled(true);
            ui->start_phi->setDisabled(false);
            ui->start_lambda->setDisabled(false);
            ui->distance->setDisabled(true);
            ui->start_azimut->setDisabled(true);
        }
    }
}

void Widget::on_advanced_stateChanged(int advanced)
{
    //std::cout << advanced <<std::endl;
    if(advanced == 2)
    {
        ui->toolBox->setCurrentIndex(1); //resize proj item

        if(ui->radioButton_Proj->isChecked())
        {

            ui->toolBox->setItemEnabled(0,false);
            ui->toolBox->setItemEnabled(1,true);
            ui->toolBox->setItemEnabled(2,true);
            ui->toolBox->setItemEnabled(3,true);
            ui->toolBox->setItemEnabled(4,true);
            ui->toolBox->setItemEnabled(5,true);

            ui->list_projs_2->setEnabled(false);
            ui->listWidget->setEnabled(false);
            ui->proj_edit_FROM->setEnabled(false);
            ui->ellips_edit_FROM->setEnabled(false);
            ui->ellips_edit_TO->setEnabled(true);
            ui->list_ellips->setEnabled(true);
            ui->list_datums->setEnabled(true);
            ui->list_datums_2->setEnabled(false);

        }

        else if(ui->radioButton_Cs->isChecked())
        {

            // IF ADVANCED
            ui->toolBox->setItemEnabled(0,false);
            ui->toolBox->setItemEnabled(1,true);
            ui->toolBox->setItemEnabled(2,true);
            ui->toolBox->setItemEnabled(3,true);
            ui->toolBox->setItemEnabled(4,true);
            ui->toolBox->setItemEnabled(5,true);


            ui->proj_edit_FROM->setEnabled(true);
            ui->ellips_edit_FROM->setEnabled(true);
            ui->ellips_edit_TO->setEnabled(true);
            ui->list_ellips->setEnabled(true);
            ui->list_projs_2->setEnabled(true);
            ui->listWidget->setEnabled(true);
            ui->list_datums->setEnabled(true);
            ui->list_datums_2->setEnabled(true);
        }
}
    else
    {
        ui->toolBox->setItemEnabled(0,true);
        ui->toolBox->setItemEnabled(1,false);
        ui->toolBox->setItemEnabled(2,false);
        ui->toolBox->setItemEnabled(3,false);
        ui->toolBox->setItemEnabled(4,false);
        ui->toolBox->setItemEnabled(5,false);

        if(ui->radioButton_Proj->isChecked())
        {
            ui->lineEdit->setEnabled(true);
            ui->lineEdit_2->setEnabled(false);
        }
        else
        {
            ui->lineEdit->setEnabled(true);
            ui->lineEdit_2->setEnabled(true);
        }
    }
}

void Widget::on_radioButton_Proj_clicked()
{
    if(!ui->advanced->isChecked())
        ui->lineEdit_2->setEnabled(false);
    else
    {
        ui->list_projs_2->setEnabled(false);
        ui->listWidget->setEnabled(false);
        ui->proj_edit_FROM->setEnabled(false);
        ui->ellips_edit_FROM->setEnabled(false);
        ui->list_datums_2->setEnabled(false);
    }
}

void Widget::on_radioButton_Cs_clicked()
{
    if(!ui->advanced->isChecked())
            ui->lineEdit_2->setEnabled(true);
    else
    {

    ui->proj_edit_FROM->setEnabled(true);
    ui->ellips_edit_FROM->setEnabled(true);
    ui->list_projs_2->setEnabled(true);
    ui->listWidget->setEnabled(true);
    ui->list_datums_2->setEnabled(true);

    }
}

QString Widget::getTargetParameters()
{
    QMessageBox box;
    box.setWindowTitle("Error");
    box.setGeometry(100,100,200,200);

    QString parameters= "";
    // PROCESS TARGET PARAMETERS
    if(ui->advanced->isChecked())
    {
        if( ui->list_projs->currentItem() )
        {
            parameters += "+proj=";
            parameters += Projections::getInstance()->findProjection(ui->list_projs->currentItem()->text());
        }
        else
        {
            box.setText("Projection not defined");
            box.exec();
            return false;
        }


        if(ui->list_ellips->currentItem() )
        {
            parameters += " +ellps=";
            parameters += Ellipsoids::getInstance()->findEllipsoid(ui->list_ellips->currentItem()->text());
        }
        else
        {
            box.setText("Ellipsoid not defined");
            box.exec();
            return false;
        }
        if(ui->list_units->currentItem() )
        {
            parameters += " +units=";
            parameters += Units::getInstance()->findUnit(ui->list_units->currentItem()->text());
        }
        if(ui->list_datums->currentItem())
        {
            parameters += " +datum=";
            parameters += Datums::getInstance()->findDatum(ui->list_datums->currentItem()->text());
        }
        if(!ui->lon0->text().isEmpty())
        {
            parameters += " +lon_0=";
            parameters += ui->lon0->text();
        }
        if(!ui->lat0->text().isEmpty())
        {
            parameters += " +lat_0=";
            parameters += ui->lat0->text();
        }
    }
    else
    {
        if(!ui->lineEdit->text().isEmpty())
        {
            parameters += " +init=epsg:";
            parameters += ui->lineEdit->text();
        }
        else
        {
            box.setText("Target EPSG code not defined");
            box.exec();
            return false;
        }
    }
    return parameters;
}

QString Widget::getSourceParameters()
{
    QMessageBox box;
    box.setWindowTitle("Error");
    box.setGeometry(100,100,200,200);

    QString parameters = "";
    if(ui->advanced->isChecked())
    {
        if(ui->list_projs_2->currentItem())
        {
            parameters += "+proj=";
            parameters += Projections::getInstance()->findProjection(ui->list_projs_2->currentItem()->text());
        }
        else
            {
            box.setText("Source projectoin not defined");
            box.exec();
            return false;
            }
        if(ui->listWidget->currentItem() )
        {
            parameters += " +ellps=";
            parameters += Ellipsoids::getInstance()->findEllipsoid(ui->listWidget->currentItem()->text());
        }
        else
        {
            box.setText("Source ellipsoid not defined");
            box.exec();
            return false;
        }
        if(ui->list_datums_2->currentItem())
        {
            parameters += " +datum=";
            parameters += Datums::getInstance()->findDatum(ui->list_datums->currentItem()->text());
        }
    }
    else
    {
        if(!ui->lineEdit_2->text().isEmpty())
        {
            parameters += " +init=epsg:";
            parameters += ui->lineEdit_2->text();
        }
        else
        {
            box.setText("Source EPSG code not defined");
            box.exec();
            return false;
        }
    }
    parameters += " +to ";

    return parameters;
}
