DataSetSelectorWidget.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/qt/widgets/dataset/selector/DataSetSelectorWidget.cpp
22 
23  \brief A wizard for selecting datasets from a data source.
24 */
25 
26 // TerraLib
27 #include "../../../../dataaccess/dataset/DataSet.h"
28 #include "../../../../dataaccess/dataset/DataSetType.h"
29 #include "../../../../dataaccess/datasource/DataSource.h"
30 #include "../../../../dataaccess/datasource/DataSourceManager.h"
31 #include "../../../../dataaccess/datasource/DataSourceTransactor.h"
32 #include "../../../../memory/DataSet.h"
33 #include "../../datasource/explorer/AbstractDataSourceTreeItem.h"
34 #include "../../datasource/explorer/DataSetItem.h"
35 #include "../../datasource/explorer/DataSetGroupItem.h"
36 #include "../../mapdisplay/DataSetDisplay.h"
37 #include "../../table/DataSetTableView.h"
38 #include "../explorer/DataSetTreeView.h"
39 #include "../explorer/DataSetTreeModel.h"
40 #include "DataSetSelectorWidget.h"
41 #include "ui_DataSetSelectorWidgetForm.h"
42 
43 // STL
44 #include <algorithm>
45 #include <iterator>
46 #include <string>
47 #include <vector>
48 
49 // Qt
50 #include <QMessageBox>
51 #include <QVBoxLayout>
52 
54  : QWidget(parent, f),
55  m_ui(new Ui::DataSetSelectorWidgetForm),
56  m_nPreviewRows(10),
57  m_useCheckableItems(true)
58 {
59 // add controls
60  m_ui->setupUi(this);
61 
62 // init controls
63  m_datasetTreeView.reset(new DataSetTreeView(m_ui->m_datasetGroupBox));
64  m_datasetTreeView->setHeaderHidden(true);
66 
67  QVBoxLayout* datasetGroupBoxLayout = new QVBoxLayout(m_ui->m_treeViewFrame);
68  datasetGroupBoxLayout->addWidget(m_datasetTreeView.get(), 1);
69 
70  m_mapPreview.reset(new te::qt::widgets::DataSetDisplay(m_ui->m_mapPreviewGroupBox));
71  QVBoxLayout* mapPreviewGroupBoxLayout = new QVBoxLayout(m_ui->m_mapPreviewGroupBox);
72  mapPreviewGroupBoxLayout->addWidget(m_mapPreview.get(), 1);
73  m_mapPreview->show();
74 
75  m_ui->m_mapPreviewGroupBox->setChecked(false);
76 
77  m_tblView.reset(new DataSetTableView(m_ui->m_dataPreviewGroupBox));
78  QVBoxLayout* dataPreviewGroupBoxLayout = new QVBoxLayout(m_ui->m_dataPreviewGroupBox);
79  dataPreviewGroupBoxLayout->addWidget(m_tblView.get(), 1);
80 
81  QFont font;
82  font.setPointSize(8);
83 
84  m_tblView->setFont(font);
85 
86  m_tblView->setAlternatingRowColors(true);
87  m_tblView->verticalHeader()->setVisible(false);
88  m_tblView->setSelectionMode(QAbstractItemView::NoSelection);
89  m_ui->m_dataPreviewGroupBox->setChecked(false);
90 
91  m_tblView->show();
92 
93 // connect signals and slots
94  connect(m_datasetTreeView.get(), SIGNAL(clicked(DataSetItem*)), this, SLOT(onDataSetClicked(DataSetItem*)));
95  connect(m_datasetTreeView.get(), SIGNAL(toggled(DataSetItem*)), this, SLOT(onDataSetToggled(DataSetItem*)));
96  connect(m_datasetTreeView.get(), SIGNAL(toggled(DataSetGroupItem*)), this, SLOT(onDataSetGroupToggled(DataSetGroupItem*)));
97  connect(m_ui->m_mapPreviewGroupBox, SIGNAL(toggled(bool)), this, SLOT(onMapPreviewToggled(bool)));
98  connect(m_ui->m_dataPreviewGroupBox, SIGNAL(toggled(bool)), this, SLOT(onDataPreviewToggled(bool)));
99  connect(m_ui->m_filterLineEdit, SIGNAL(textChanged(const QString&)), SLOT(onFilterLineEditTextChanged(const QString&)));
100 }
101 
103 
105 {
106  m_datasource = ds;
107  m_useCheckableItems = useCheckableItems;
108 
109  if(ds.get() == nullptr)
110  return;
111 
112  m_ui->m_datasetGroupBox->setTitle(QString::fromUtf8(ds->getTitle().c_str()));
113 
114  try
115  {
116  m_datasetTreeView->set(m_datasource, useCheckableItems);
117 
118  QAbstractItemModel* nmodel = m_datasetTreeView->model();
119 
120  QModelIndex idx = nmodel->index(0, 0);
121 
122  m_datasetTreeView->expand(idx);
123  }
124  catch(const std::exception& e)
125  {
126  QMessageBox::warning(this,
127  tr("TerraLib Qt Components"),
128  tr(e.what()));
129  }
130  catch(...)
131  {
132  QMessageBox::warning(this,
133  tr("TerraLib Qt Components"),
134  tr("Unknown error when showing datasets!"));
135  }
136 }
137 
139 {
140  QMessageBox::warning(this,
141  tr("TerraLib Qt Components"),
142  tr("Not implemented yet!\nWe will provide it soon!"));
143 }
144 
146  bool /*enabled*/)
147 {
148  m_ui->m_mapPreviewGroupBox->setChecked(false);
149 }
150 
152 {
153  QMessageBox::warning(this,
154  tr("TerraLib Qt Components"),
155  tr("Not implemented yet!\nWe will provide it soon!"));
156 }
157 
159  bool /*enabled*/)
160 {
161  m_ui->m_dataPreviewGroupBox->setChecked(false);
162 }
163 
165 {
166  m_nPreviewRows = nrows;
167 }
168 
169 std::list<te::da::DataSetTypePtr> te::qt::widgets::DataSetSelectorWidget::getCheckedDataSets() const
170 {
171  std::list<te::da::DataSetTypePtr> datasets;
172 
173  std::map<te::da::DataSetTypePtr, std::string, DataSetComparer>::const_iterator it;
174  for(it = m_checkedDatasets.begin(); it != m_checkedDatasets.end(); ++it)
175  datasets.push_back(it->first);
176 
177  return datasets;
178 }
179 
181 {
182  return !m_checkedDatasets.empty();
183 }
184 
186 {
187  std::list<std::string> gp;
188 
189  std::map<te::da::DataSetTypePtr, std::string, DataSetComparer>::const_iterator it;
190  for(it = m_checkedDatasets.begin(); it != m_checkedDatasets.end(); ++it)
191  gp.push_back(it->second);
192 
193  return gp;
194 }
195 
196 std::list<te::da::DataSetTypePtr> te::qt::widgets::DataSetSelectorWidget::getSelectedDataSets() const
197 {
198  std::list<te::da::DataSetTypePtr> datasets;
199 
200  std::list<DataSetItem*> items = m_datasetTreeView->getSelectedDataSets();
201 
202  for(std::list<DataSetItem*>::iterator it = items.begin(); it != items.end(); ++it)
203  {
204  DataSetItem* ditem = *it;
205 
206  if(ditem == nullptr)
207  continue;
208 
209  if(ditem->getDataSet().get() == nullptr)
210  continue;
211 
212  datasets.push_back(ditem->getDataSet());
213  }
214 
215  return datasets;
216 }
217 
219 {
220  return m_datasetTreeView->hasSelectedDataSets();
221 }
222 
224 {
225  std::list<std::string> gp;
226 
227  std::list<DataSetItem*> items = m_datasetTreeView->getSelectedDataSets();
228 
229  for(std::list<DataSetItem*>::iterator it = items.begin(); it != items.end(); ++it)
230  {
231  DataSetItem* ditem = *it;
232 
233  if(ditem == nullptr)
234  continue;
235 
236  if(ditem->getDataSet().get() == nullptr)
237  continue;
238 
239  gp.push_back(ditem->getGeomPropertyName());
240  }
241 
242  return gp;
243 }
244 
246 {
247  return m_datasetTreeView.get();
248 }
249 
251 {
252  if(dataset.get() == nullptr)
253  return;
254 
255  try
256  {
257  if(m_ui->m_mapPreviewGroupBox->isChecked())
258  {
259  m_mapPreview->clear();
260  m_mapPreview->draw(dataset, m_datasource);
261  }
262  }
263  catch(...)
264  {
265  }
266 }
267 
269 {
270  if((dataset.get() == nullptr) || (m_datasource.get() == nullptr))
271  return;
272 
273  if(!m_ui->m_dataPreviewGroupBox->isChecked())
274  return;
275 
276  try
277  {
278  te::da::DataSourcePtr ds = te::da::DataSourceManager::getInstance().get(m_datasource->getId(), m_datasource->getAccessDriver(), m_datasource->getConnInfo());
279 
280  if(ds.get() == nullptr)
281  return;
282 
283  std::unique_ptr<te::da::DataSet> feature(ds->getDataSet(dataset->getName()));
284 
285  std::vector<std::size_t> properties;
286  for(std::size_t i = 0; i < feature->getNumProperties(); ++i)
287  properties.push_back(i);
288 
289  std::size_t previewrows = m_nPreviewRows; //Usually 10
290  std::size_t dsetsize = feature->size();
291 
292  if(dsetsize < previewrows)
293  previewrows = dsetsize;
294 
295  std::unique_ptr<te::mem::DataSet> memFeature((new te::mem::DataSet(*feature.get(), properties, previewrows)));
296 
297  if(memFeature.get())
298  m_tblView->setDataSet(memFeature.release());
299  }
300  catch(...)
301  {
302  }
303 }
304 
306 {
307  if(item == nullptr)
308  return;
309 
310  if(item->isChecked())
311  m_checkedDatasets.insert(std::make_pair(item->getDataSet(), item->getGeomPropertyName()));
312  else
313  m_checkedDatasets.erase(item->getDataSet());
314 }
315 
317 {
318  if(item == nullptr)
319  return;
320 
321  previewMap(item->getDataSet());
322  previewData(item->getDataSet());
323 }
324 
326 {
327  if(item == nullptr)
328  return;
329 
330  const std::vector<DataSetItem*>& items = item->getDataSetItems();
331 
332  for(std::size_t i = 0; i < items.size(); ++i)
333  onDataSetToggled(items[i]);
334 }
335 
337 {
338  if(on)
339  {
340  QModelIndex current = m_datasetTreeView->currentIndex();
341 
342  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(current.internalPointer());
343 
344  if(item == nullptr)
345  return;
346 
347  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
348 
349  if(ditem == nullptr)
350  return;
351 
352  previewMap(ditem->getDataSet());
353  }
354  else
355  {
356  m_mapPreview->clear();
357  }
358 }
359 
361 {
362  if(on)
363  {
364  QModelIndex current = m_datasetTreeView->currentIndex();
365 
366  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(current.internalPointer());
367 
368  if(item == nullptr)
369  return;
370 
371  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
372 
373  if(ditem == nullptr)
374  return;
375 
376  previewData(ditem->getDataSet());
377  }
378 }
379 
381 {
382  return first->getName() < second->getName();
383 }
384 
386 {
388 
390 
391  newModel->setFilter(text.toUtf8().data());
392 
393  m_datasetTreeView->setModel(newModel);
394 
395  m_datasetTreeView->expand(newModel->index(0,0));
396 }
void previewData(const te::da::DataSetTypePtr &dataset)
boost::shared_ptr< DataSetType > DataSetTypePtr
Definition: DataSetType.h:653
#define TE_QTWIDGETS_DEFAULT_TREEVIEW_IDENTATION
boost::shared_ptr< DataSource > DataSourcePtr
const std::vector< DataSetItem * > & getDataSetItems() const
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
void setFilter(const std::string &filter)
static te::dt::Date ds(2010, 01, 01)
A wizard for selecting datasets from a data source.
std::list< std::string > getSelectedGeomProperties() const
std::unique_ptr< te::qt::widgets::DataSetDisplay > m_mapPreview
void onFilterLineEditTextChanged(const QString &text)
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
std::list< te::da::DataSetTypePtr > getSelectedDataSets() const
std::map< te::da::DataSetTypePtr, std::string, DataSetComparer > m_checkedDatasets
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
std::unique_ptr< Ui::DataSetSelectorWidgetForm > m_ui
std::unique_ptr< DataSetTreeView > m_datasetTreeView
std::unique_ptr< DataSetTableView > m_tblView
void set(const te::da::DataSourceInfoPtr &ds, bool useCheckableItems=false)
void onDataSetGroupToggled(DataSetGroupItem *item)
A tree view for datasets of a data source.
std::list< te::da::DataSetTypePtr > getCheckedDataSets() const
DataSetSelectorWidget(QWidget *parent=0, Qt::WindowFlags f=0)
A map display for a dataset.
A customized table view for te::map::AbstractLayer objects. Uses a te::qt::widgets::DataSetModel as i...
void setCheckable(const bool checkable)
std::list< std::string > getCheckedGeomProperties() const
bool operator()(const te::da::DataSetTypePtr &first, const te::da::DataSetTypePtr &second) const
void previewMap(const te::da::DataSetTypePtr &dataset)
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr