Ejemplo n.º 1
0
void CSVAtlasWindow::sMapChanged( int )
{
    CSVMap map;
    if(!_selectedMap.isEmpty())
    {
        map = _atlas->map(_selectedMap);
        if(tr("Insert") == _action->currentText())
            map.setAction(CSVMap::Insert);
        else if(tr("Update") == _action->currentText())
            map.setAction(CSVMap::Update);
        else if(tr("Append") == _action->currentText())
            map.setAction(CSVMap::Append);
        map.setDelimiter(_delimiter->currentText());
        map.setDescription(_description->toPlainText());
        map.setSqlPre(_preSql->toPlainText().trimmed());
        map.setSqlPreContinueOnError(_sqlPreContinueOnError->isChecked());
        map.setSqlPost(_postSql->toPlainText().trimmed());
        for(int r = 0; r < _fields->rowCount(); r++)
        {
            CSVMapField field = map.field(_fields->item(r, 1)->data(Qt::EditRole).toString());
            field.setName(_fields->item(r, 1)->data(Qt::EditRole).toString());

            if (qobject_cast<QCheckBox*>(_fields->cellWidget(r, 0)))
                field.setIsKey(qobject_cast<QCheckBox*>(_fields->cellWidget(r,0))->isChecked());
            else
                field.setIsKey(FALSE);

            field.setType(QVariant::nameToType(_fields->item(r, 2)->data(Qt::EditRole).toString().toAscii().data()));

            if (qobject_cast<QComboBox*>(_fields->cellWidget(r, 4)))
                field.setAction(CSVMapField::nameToAction(qobject_cast<QComboBox*>(_fields->cellWidget(r, 4))->currentText()));
            else
                field.setAction(CSVMapField::Action_Default);

            if (qobject_cast<QSpinBox*>(_fields->cellWidget(r, 5)))
                field.setColumn(qobject_cast<QSpinBox*>(_fields->cellWidget(r,5))->value());
            else
                field.setColumn(0);

            if (qobject_cast<QComboBox*>(_fields->cellWidget(r, 6)))
                field.setIfNullAction(CSVMapField::nameToIfNull(qobject_cast<QComboBox*>(_fields->cellWidget(r, 6))->currentText()));
            else
                field.setIfNullAction(CSVMapField::Nothing);

            if (qobject_cast<QSpinBox*>(_fields->cellWidget(r, 7)))
                field.setColumnAlt(qobject_cast<QSpinBox*>(_fields->cellWidget(r, 7))->value());
            else
                field.setColumnAlt(1);

            if (qobject_cast<QComboBox*>(_fields->cellWidget(r, 8)))
                field.setIfNullActionAlt(CSVMapField::nameToIfNull(qobject_cast<QComboBox*>(_fields->cellWidget(r, 8))->currentText()));
            else
                field.setIfNullActionAlt(CSVMapField::Nothing);

            field.setValueAlt(_fields->item(r, 9)->data(Qt::EditRole).toString());
            map.setField(field);
        }
        map.simplify();
        _atlas->setMap(map);
    }

    QSqlDatabase db = QSqlDatabase::database();
    if (db.isValid())
    {
        _fields->setRowCount(0);
        if(_map->count() && ! _map->currentText().isEmpty())
        {
            // CODE TO SELECT MAP
            _selectedMap = _map->currentText();
            map = _atlas->map(_selectedMap);

            _table->setTitle(tr("Table: ") + map.table());
            _table->setEnabled(TRUE);

            _action->setCurrentIndex(map.action());
            _description->setText(map.description());

            int delimidx = _delimiter->findText(map.delimiter());
            if (delimidx >= 0)
                _delimiter->setCurrentIndex(delimidx);
            else if (! map.delimiter().isEmpty())
                _delimiter->addItem(map.delimiter());
            else
                _delimiter->setCurrentIndex(0);

            _preSql->setText(map.sqlPre());
            _sqlPreContinueOnError->setChecked(map.sqlPreContinueOnError());
            _postSql->setText(map.sqlPost());

            QSqlRecord record = db.record(map.table());
            QStringList fieldnames;
            if (record.isEmpty())
            {
                _msghandler->message(QtWarningMsg, tr("No Existing Table"),
                                     tr("<p>The table %1 does not exist in this "
                                        "database. You may continue to use and edit "
                                        "this map but only those fields that are known "
                                        "will be shown.").arg(map.table()),
                                     QUrl(), QSourceLocation());
                fieldnames = map.fieldList();
            }
            else
            {
                QStringList fList = map.fieldList();

                for(int i = 0; i < fList.size(); ++i)
                {
                    CSVMapField f = map.field(fList.at(i));
                    if(!record.contains(fList.at(i)))
                    {
                        map.removeField(fList.at(i));
                        MissingField diag(this, f.name(), record);
                        if(diag.exec() == QDialog::Accepted)
                        {
                            f.setName(diag._fields->currentText());
                            map.setField(f);
                        }
                        _atlas->setMap(map);
                    }
                }

                for (int i = 0; i < record.count(); i++)
                    fieldnames.append(record.fieldName(i));
            }

            _fields->setRowCount(fieldnames.size());
            for(int row = 0; row < fieldnames.size(); ++row)
            {
                CSVMapField mf = map.field(fieldnames.at(row));

                QCheckBox *check = new QCheckBox(_fields);
                if(!mf.isEmpty())
                    check->setChecked(mf.isKey());
                _fields->setCellWidget(row, 0, check);

                _fields->setItem(row, 1, new QTableWidgetItem(fieldnames.at(row)));
                if (record.isEmpty())
                {
                    _fields->setItem(row, 2,
                                     new QTableWidgetItem(QVariant::typeToName(mf.type())));
                    _fields->setItem(row, 3, new QTableWidgetItem(tr("Unknown")));
                }
                else
                {
                    if (record.field(row).type() == QVariant::String &&
                            record.field(row).length() > 0)
                        _fields->setItem(row, 2,
                                         new QTableWidgetItem(QVariant::typeToName(record.field(row).type()) +
                                                              QString("(%1)").arg(record.field(row).length())));
                    else
                        _fields->setItem(row, 2,
                                         new QTableWidgetItem(QVariant::typeToName(record.field(row).type())));
                    _fields->setItem(row, 3, new QTableWidgetItem(
                                         (record.field(row).requiredStatus() == QSqlField::Required) ? tr("Yes") :
                                         (record.field(row).requiredStatus() == QSqlField::Optional) ? tr("No")  :
                                         tr("Unknown")));
                }

                QComboBox *actcombo = new QComboBox(_fields);
                actcombo->addItems(CSVMapField::actionList());
                if (! mf.isEmpty())
                    actcombo->setCurrentIndex(mf.action());
                _fields->setCellWidget(row, 4, actcombo);

                QSpinBox *colspinner = new QSpinBox(_fields);
                colspinner->setRange(1, 999);
                colspinner->setPrefix(tr("Column "));
                if(!mf.isEmpty())
                    colspinner->setValue(mf.column());
                _fields->setCellWidget(row, 5, colspinner);

                QComboBox *nullcombo = new QComboBox(_fields);
                nullcombo->addItems(CSVMapField::ifNullList());
                if (! mf.isEmpty())
                    nullcombo->setCurrentIndex(mf.ifNullAction());
                _fields->setCellWidget(row, 6, nullcombo);

                QSpinBox *altspinner = new QSpinBox(_fields);
                altspinner->setRange(1, 999);
                altspinner->setPrefix(tr("Column "));
                if (! mf.isEmpty())
                    altspinner->setValue(mf.columnAlt());
                _fields->setCellWidget(row, 7, altspinner);

                QComboBox *altnullcombo = new QComboBox(_fields);
                altnullcombo->addItems(CSVMapField::ifNullList(TRUE));
                if (! mf.isEmpty())
                    altnullcombo->setCurrentIndex(mf.ifNullActionAlt());
                _fields->setCellWidget(row, 8, altnullcombo);

                _fields->setItem(row, 9, new QTableWidgetItem(mf.valueAlt()));

                RowController *control = new RowController(_fields, row, colspinner);
                control->setAction(actcombo);
                control->setColumn(colspinner);
                control->setIfNull(nullcombo);
                control->setAltColumn(altspinner);
                control->setAltIfNull(altnullcombo);
                control->setAltValue(_fields->item(row, 9));
                control->finishSetup();
            }
        }
        else
        {
            _selectedMap = QString::null;
            _table->setTitle(tr("Table: "));
            _table->setEnabled(FALSE);
        }
    }
    else
        _msghandler->message(QtCriticalMsg, tr("No Database"),
                             tr("Could not get the database connection."));
}