27 #include "../../../dataaccess/dataset/DataSetAdapter.h"
28 #include "../../../dataaccess/dataset/DataSetType.h"
29 #include "../../../dataaccess/dataset/DataSetTypeConverter.h"
30 #include "../../../dataaccess/dataset/PrimaryKey.h"
31 #include "../../../dataaccess/datasource/DataSourceFactory.h"
32 #include "../../../dataaccess/datasource/DataSourceInfo.h"
33 #include "../../../dataaccess/datasource/DataSourceInfoManager.h"
34 #include "../../../dataaccess/datasource/DataSourceManager.h"
35 #include "../../../dataaccess/utils/Utils.h"
36 #include "../../../datatype/Property.h"
37 #include "../../../datatype/DateTimeProperty.h"
38 #include "../../../datatype/NumericProperty.h"
39 #include "../../../datatype/SimpleProperty.h"
40 #include "../../../datatype/StringProperty.h"
41 #include "../../../geometry/GeometryProperty.h"
42 #include "../../../memory/DataSet.h"
43 #include "../property/DataSetAdapterWidget.h"
44 #include "../srs/SRSManagerDialog.h"
45 #include "../table/DataSetTableView.h"
48 #include "ui_DataPropertiesWidgetForm.h"
53 #include <QFileDialog>
55 #include <QMessageBox>
58 #include <boost/filesystem.hpp>
59 #include <boost/lexical_cast.hpp>
60 #include <boost/uuid/random_generator.hpp>
61 #include <boost/uuid/uuid_io.hpp>
68 typeMap.insert(std::map<int, std::string>::value_type(
te::dt::ARRAY_TYPE, QObject::tr(
"Array").toStdString()));
69 typeMap.insert(std::map<int, std::string>::value_type(
te::dt::BYTE_ARRAY_TYPE, QObject::tr(
"Byte Array").toStdString()));
70 typeMap.insert(std::map<int, std::string>::value_type(
te::dt::DATETIME_TYPE, QObject::tr(
"Date and Time").toStdString()));
71 typeMap.insert(std::map<int, std::string>::value_type(
te::dt::DOUBLE_TYPE, QObject::tr(
"Double").toStdString()));
72 typeMap.insert(std::map<int, std::string>::value_type(
te::dt::GEOMETRY_TYPE, QObject::tr(
"Geometry").toStdString()));
73 typeMap.insert(std::map<int, std::string>::value_type(
te::dt::INT32_TYPE, QObject::tr(
"Int 32").toStdString()));
74 typeMap.insert(std::map<int, std::string>::value_type(
te::dt::NUMERIC_TYPE, QObject::tr(
"Numeric").toStdString()));
75 typeMap.insert(std::map<int, std::string>::value_type(
te::dt::STRING_TYPE, QObject::tr(
"String").toStdString()));
137 for(std::map<int, std::string>::iterator it = typeMap.begin(); it != typeMap.end(); ++it)
139 box->addItem(QString::fromStdString(it->second), QVariant(it->first));
144 : QWidget(parent, f),
145 m_ui(new Ui::DataPropertiesWidgetForm)
156 QGridLayout* dataPreviewLayout =
new QGridLayout(
m_ui->m_dataPreviewFrame);
157 dataPreviewLayout->addWidget(
m_tblView.get());
158 dataPreviewLayout->setContentsMargins(0, 0, 0, 0);
160 m_tblView->setAlternatingRowColors(
true);
161 m_tblView->verticalHeader()->setVisible(
false);
162 m_tblView->setSelectionMode(QAbstractItemView::NoSelection);
164 m_ui->m_dataPropertiesTableWidget->setSelectionMode(QAbstractItemView::NoSelection);
167 m_ui->m_imgLabel->setPixmap(QIcon::fromTheme(
"tabular-import-hint").pixmap(112,48));
168 m_ui->m_sridPushButton->setIcon(QIcon::fromTheme(
"srs"));
186 for (
int i = 0; i < m_ui->m_dataPropertiesTableWidget->rowCount(); ++i)
188 if(dynamic_cast<QCheckBox*>(m_ui->m_dataPropertiesTableWidget->cellWidget(i, 0))->isChecked())
190 QComboBox* box =
dynamic_cast<QComboBox*
>(m_ui->m_dataPropertiesTableWidget->cellWidget(i, 1));
191 int type = box->itemData(box->currentIndex()).toInt();
193 m_dsConverter->
add(m_dataType->getProperty(i)->getName(),
getConvertedproperty(m_dataType->getProperty(i)->getName(), type));
197 std::vector<te::dt::Property*> props = pkIn->getProperties();
199 for(std::size_t t= 0; t < props.size(); ++t)
201 if(props[t]->getName() == m_dataType->getProperty(i)->getName())
214 if(m_ui->m_geometryGroupBox->isCheckable() && m_ui->m_geometryGroupBox->isChecked())
218 std::vector<std::string> names;
219 names.push_back(m_ui->m_xAxisComboBox->currentText().toStdString());
220 names.push_back(m_ui->m_yAxisComboBox->currentText().toStdString());
224 m_dsConverter->add(names, newGeom,
"XYToPointConverter");
229 if(gp && !m_ui->m_sridLineEdit->text().isEmpty())
230 gp->
setSRID(boost::lexical_cast<int>(m_ui->m_sridLineEdit->text().trimmed().toStdString()));
233 return m_dsConverter;
238 return m_dataSet.get();
243 return m_dataType.get();
248 return m_dataSource.get();
255 QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Open Textual File"),
te::qt::widgets::GetFilePathFromSettings(
"tabular"), tr(
"Comma Separated Value (*.csv *.CSV);; dBASE (*.dbf *.DBF)"),
256 0, QFileDialog::ReadOnly);
258 if(fileName.isEmpty())
261 QFileInfo info(fileName);
266 std::string ogrInfo(
"connection_string=" + fileName.toStdString());
267 std::map<std::string, std::string> connInfo;
268 connInfo[
"URI"] = fileName.toStdString();
270 boost::filesystem::path uri(fileName.toStdString());
271 std::string file = uri.stem().string();
274 static boost::uuids::basic_random_generator<boost::mt19937> gen;
275 boost::uuids::uuid u = gen();
278 dsInfo->setConnInfo(connInfo);
279 dsInfo->setId(boost::uuids::to_string(u));
280 dsInfo->setTitle(fileName.toStdString());
281 dsInfo->setDescription(
"");
282 dsInfo->setAccessDriver(
"OGR");
283 dsInfo->setType(
"OGR");
288 m_dataSource->setConnectionInfo(dsInfo->getConnInfo());
290 m_dataSource->setId(boost::uuids::to_string(u));
291 m_dataSource->open();
294 m_dataSet = m_dataSource->getDataSet(file);
295 std::vector<std::string> datasetNames = m_dataSource->getDataSetNames();
297 if(!datasetNames.empty())
298 m_dataType = m_dataSource->getDataSetType(datasetNames[0]);
301 QMessageBox::critical(
this, tr(
"Error"),tr(
"The file could not be read!"));
305 m_ui->m_inputDataLineEdit->setText(fileName);
311 std::vector<std::size_t> properties;
312 for(std::size_t i = 0; i < m_dataSet->getNumProperties(); ++i)
313 properties.push_back(i);
316 std::auto_ptr<te::mem::DataSet> memFeature((
new te::mem::DataSet(*m_dataSet.get(), properties, 5)));
318 m_tblView->setDataSet(memFeature.release());
319 m_tblView->resizeColumnsToContents();
322 m_ui->m_dataPropertiesTableWidget->setRowCount(0);
325 for(
size_t t = 0; t < m_dataType->size(); ++t)
327 int newrow = m_ui->m_dataPropertiesTableWidget->rowCount();
328 m_ui->m_dataPropertiesTableWidget->insertRow(newrow);
331 std::string propName = m_dataType->getProperty(t)->getName();
334 QCheckBox* impCheck =
new QCheckBox();
335 impCheck->setText(QString::fromStdString(propName));
336 impCheck->setCheckState(Qt::Checked);
339 connect(impCheck, SIGNAL(stateChanged (
int )),
this, SLOT(onGeomPropertyChecked(
int)));
341 m_ui->m_dataPropertiesTableWidget->setCellWidget(newrow, 0, impCheck);
344 QComboBox* typeCB =
new QComboBox();
346 typeCB->setCurrentIndex(typeCB->findText(m_typeMap[m_dataType->getProperty(t)->getType()].c_str()));
348 m_mapper->setMapping(typeCB, newrow);
349 connect(typeCB, SIGNAL(currentIndexChanged (
int)), m_mapper, SLOT(map()));
351 m_ui->m_dataPropertiesTableWidget->setCellWidget(newrow, 1, typeCB);
354 if(m_dataType->hasGeom())
358 if(gp && gp->
getName() == propName)
362 m_ui->m_sridLineEdit->setText(srid);
364 typeCB->setEnabled(
false);
376 for(std::size_t t= 0; t < props.size(); ++t)
378 if(props[t]->getName() == propName)
380 typeCB->setEnabled(
false);
381 impCheck->setEnabled(
false);
388 m_ui->m_dataPropertiesTableWidget->resizeColumnsToContents();
389 m_ui->m_dataPropertiesTableWidget->resizeRowsToContents();
390 #if (QT_VERSION >= 0x050000)
391 m_ui->m_dataPropertiesTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
393 m_ui->m_dataPropertiesTableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
397 m_ui->m_xAxisComboBox->clear();
398 m_ui->m_yAxisComboBox->clear();
400 if(m_dataType->hasGeom())
402 m_ui->m_geometryGroupBox->setCheckable(
false);
403 m_ui->m_xAxisComboBox->setEnabled(
false);
404 m_ui->m_yAxisComboBox->setEnabled(
false);
405 m_ui->m_geometryGroupBox->setChecked(
true);
409 m_ui->m_geometryGroupBox->setCheckable(
true);
410 m_ui->m_xAxisComboBox->setEnabled(
true);
411 m_ui->m_yAxisComboBox->setEnabled(
true);
412 m_ui->m_geometryGroupBox->setChecked(
false);
416 for(
size_t t = 0; t < m_dataType->size(); ++t)
418 std::string propName = m_dataType->getProperty(t)->getName();
419 int type = m_dataType->getProperty(t)->getType();
423 m_ui->m_xAxisComboBox->addItem(QString::fromStdString(propName));
424 m_ui->m_yAxisComboBox->addItem(QString::fromStdString(propName));
428 catch(
const std::exception& e)
430 QMessageBox::warning(
this, tr(
"Tabular File"), e.what());
437 srsDialog.setWindowTitle(tr(
"Choose the SRS"));
439 if(srsDialog.exec() != QDialog::Rejected)
442 m_ui->m_sridLineEdit->setText(QString::number(srid.first));
448 if(checked == Qt::Unchecked)
450 m_ui->m_geometryGroupBox->setCheckable(
true);
451 m_ui->m_xAxisComboBox->setEnabled(
true);
452 m_ui->m_yAxisComboBox->setEnabled(
true);
453 m_ui->m_geometryGroupBox->setChecked(
true);
457 m_ui->m_geometryGroupBox->setCheckable(
false);
458 m_ui->m_xAxisComboBox->setEnabled(
false);
459 m_ui->m_yAxisComboBox->setEnabled(
false);
460 m_ui->m_geometryGroupBox->setChecked(
false);
467 QCheckBox* check =
dynamic_cast<QCheckBox*
>(m_ui->m_dataPropertiesTableWidget->cellWidget(row, 0));
468 QComboBox* box =
dynamic_cast<QComboBox*
>(m_ui->m_dataPropertiesTableWidget->cellWidget(row, 1));
469 std::string propName = check->text().toStdString();
470 int type = box->itemData(box->currentIndex()).toInt();
473 int xyAxis = m_ui->m_xAxisComboBox->findText(QString::fromStdString(propName));
481 m_ui->m_xAxisComboBox->addItem(QString::fromStdString(propName));
482 m_ui->m_yAxisComboBox->addItem(QString::fromStdString(propName));
489 m_ui->m_xAxisComboBox->removeItem(xyAxis);
490 m_ui->m_yAxisComboBox->removeItem(xyAxis);
void setAutoNumber(bool a)
It tells if the property is an autonumber or not.
void add(te::dt::Property *p)
It adds a property to the list of properties of the primary key.
void setSRID(int srid)
It sets the spatial reference system identifier associated to this property.
void setGeometryType(GeomType t)
It sets the geometry subtype.
An atomic property like an integer or double.
A class that models the description of a dataset.
An abstract class for data providers like a DBMS, Web Services or a regular file. ...
const std::vector< te::dt::Property * > & getProperties() const
It returns the properties that take part of the primary key.
An converter for DataSetType.
The type for arbitrary precison numbers, like numeric(p, q).
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
int getSRID() const
It returns the spatial reference system identifier associated to this property.
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
static std::auto_ptr< DataSource > make(const std::string &dsType)
The type for string types: FIXED_STRING, VAR_STRING or STRING.
A dataset is the unit of information manipulated by the data access module of TerraLib.
It describes a primary key (pk) constraint.
The type for date and time types: date, date period, date duration, time duration, time instant, time period, time instant with time zone or time period with time zone.
A class that represents a data source component.
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr
const std::string & getName() const
It returns the property name.