All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 {
58 // add controls
59  m_ui->setupUi(this);
60 
61 // init controls
62  m_datasetTreeView.reset(new DataSetTreeView(m_ui->m_datasetGroupBox));
63  m_datasetTreeView->setHeaderHidden(true);
65 
66  QVBoxLayout* datasetGroupBoxLayout = new QVBoxLayout(m_ui->m_datasetGroupBox);
67  datasetGroupBoxLayout->addWidget(m_datasetTreeView.get(), 1);
68 
69  m_mapPreview.reset(new te::qt::widgets::DataSetDisplay(m_ui->m_mapPreviewGroupBox));
70  QVBoxLayout* mapPreviewGroupBoxLayout = new QVBoxLayout(m_ui->m_mapPreviewGroupBox);
71  mapPreviewGroupBoxLayout->addWidget(m_mapPreview.get(), 1);
72  m_mapPreview->show();
73 
74  m_ui->m_mapPreviewGroupBox->setChecked(false);
75 
76  m_tblView.reset(new DataSetTableView(m_ui->m_dataPreviewGroupBox));
77  QVBoxLayout* dataPreviewGroupBoxLayout = new QVBoxLayout(m_ui->m_dataPreviewGroupBox);
78  dataPreviewGroupBoxLayout->addWidget(m_tblView.get(), 1);
79 
80  QFont font;
81  font.setPointSize(8);
82 
83  m_tblView->setFont(font);
84 
85  m_tblView->setAlternatingRowColors(true);
86  m_tblView->verticalHeader()->setVisible(false);
87  m_tblView->setSelectionMode(QAbstractItemView::NoSelection);
88  m_ui->m_dataPreviewGroupBox->setChecked(false);
89 
90  m_tblView->show();
91 
92 // connect signals and slots
93  connect(m_datasetTreeView.get(), SIGNAL(clicked(DataSetItem*)), this, SLOT(onDataSetClicked(DataSetItem*)));
94  connect(m_datasetTreeView.get(), SIGNAL(toggled(DataSetItem*)), this, SLOT(onDataSetToggled(DataSetItem*)));
95  connect(m_datasetTreeView.get(), SIGNAL(toggled(DataSetGroupItem*)), this, SLOT(onDataSetGroupToggled(DataSetGroupItem*)));
96  connect(m_ui->m_mapPreviewGroupBox, SIGNAL(toggled(bool)), this, SLOT(onMapPreviewToggled(bool)));
97  connect(m_ui->m_dataPreviewGroupBox, SIGNAL(toggled(bool)), this, SLOT(onDataPreviewToggled(bool)));
98 }
99 
101 {
102 }
103 
105 {
106  m_datasource = ds;
107 
108  if(ds.get() == 0)
109  return;
110 
111  m_ui->m_datasetGroupBox->setTitle(QString::fromStdString(ds->getTitle()));
112 
113  try
114  {
115  m_datasetTreeView->set(m_datasource, useCheckableItems);
116 
117  QAbstractItemModel* nmodel = m_datasetTreeView->model();
118 
119  QModelIndex idx = nmodel->index(0, 0);
120 
121  m_datasetTreeView->expand(idx);
122  }
123  catch(const std::exception& e)
124  {
125  QMessageBox::warning(this,
126  tr("TerraLib Qt Components"),
127  tr(e.what()));
128  }
129  catch(...)
130  {
131  QMessageBox::warning(this,
132  tr("TerraLib Qt Components"),
133  tr("Unknown error when showing datasets!"));
134  }
135 }
136 
138 {
139  QMessageBox::warning(this,
140  tr("TerraLib Qt Components"),
141  tr("Not implemented yet!\nWe will provide it soon!"));
142 }
143 
145 {
146  m_ui->m_mapPreviewGroupBox->setChecked(false);
147 }
148 
150 {
151  QMessageBox::warning(this,
152  tr("TerraLib Qt Components"),
153  tr("Not implemented yet!\nWe will provide it soon!"));
154 }
155 
157 {
158  m_ui->m_dataPreviewGroupBox->setChecked(false);
159 }
160 
162 {
163  m_nPreviewRows = nrows;
164 }
165 
166 std::list<te::da::DataSetTypePtr> te::qt::widgets::DataSetSelectorWidget::getCheckedDataSets() const
167 {
168  std::list<te::da::DataSetTypePtr> datasets;
169 
170  std::map<te::da::DataSetTypePtr, std::string, DataSetComparer>::const_iterator it;
171  for(it = m_checkedDatasets.begin(); it != m_checkedDatasets.end(); ++it)
172  datasets.push_back(it->first);
173 
174  return datasets;
175 }
176 
178 {
179  return !m_checkedDatasets.empty();
180 }
181 
183 {
184  std::list<std::string> gp;
185 
186  std::map<te::da::DataSetTypePtr, std::string, DataSetComparer>::const_iterator it;
187  for(it = m_checkedDatasets.begin(); it != m_checkedDatasets.end(); ++it)
188  gp.push_back(it->second);
189 
190  return gp;
191 }
192 
193 std::list<te::da::DataSetTypePtr> te::qt::widgets::DataSetSelectorWidget::getSelectedDataSets() const
194 {
195  std::list<te::da::DataSetTypePtr> datasets;
196 
197  std::list<DataSetItem*> items = m_datasetTreeView->getSelectedDataSets();
198 
199  for(std::list<DataSetItem*>::iterator it = items.begin(); it != items.end(); ++it)
200  {
201  DataSetItem* ditem = *it;
202 
203  if(ditem == 0)
204  continue;
205 
206  if(ditem->getDataSet().get() == 0)
207  continue;
208 
209  datasets.push_back(ditem->getDataSet());
210  }
211 
212  return datasets;
213 }
214 
216 {
217  return m_datasetTreeView->hasSelectedDataSets();
218 }
219 
221 {
222  std::list<std::string> gp;
223 
224  std::list<DataSetItem*> items = m_datasetTreeView->getSelectedDataSets();
225 
226  for(std::list<DataSetItem*>::iterator it = items.begin(); it != items.end(); ++it)
227  {
228  DataSetItem* ditem = *it;
229 
230  if(ditem == 0)
231  continue;
232 
233  if(ditem->getDataSet().get() == 0)
234  continue;
235 
236  gp.push_back(ditem->getGeomPropertyName());
237  }
238 
239  return gp;
240 }
241 
243 {
244  return m_datasetTreeView.get();
245 }
246 
248 {
249  if(dataset.get() == 0)
250  return;
251 
252  try
253  {
254  if(m_ui->m_mapPreviewGroupBox->isChecked())
255  {
256  m_mapPreview->clear();
257  m_mapPreview->draw(dataset, m_datasource);
258  }
259  }
260  catch(...)
261  {
262  }
263 }
264 
266 {
267  if((dataset.get() == 0) || (m_datasource.get() == 0))
268  return;
269 
270  if(!m_ui->m_dataPreviewGroupBox->isChecked())
271  return;
272 
273  try
274  {
275  te::da::DataSourcePtr ds = te::da::DataSourceManager::getInstance().get(m_datasource->getId(), m_datasource->getAccessDriver(), m_datasource->getConnInfo());
276 
277  if(ds.get() == 0)
278  return;
279 
280  std::auto_ptr<te::da::DataSet> feature(ds->getDataSet(dataset->getName()));
281 
282  std::vector<std::size_t> properties;
283  for(std::size_t i = 0; i < feature->getNumProperties(); ++i)
284  properties.push_back(i);
285 
286  std::size_t previewrows = m_nPreviewRows; //Usually 10
287  std::size_t dsetsize = feature->size();
288 
289  if(dsetsize < previewrows)
290  previewrows = dsetsize;
291 
292  std::auto_ptr<te::mem::DataSet> memFeature((new te::mem::DataSet(*feature.get(), properties, previewrows)));
293 
294  if(memFeature.get())
295  m_tblView->setDataSet(memFeature.release(), ds->getEncoding());
296  }
297  catch(...)
298  {
299  }
300 }
301 
303 {
304  if(item == 0)
305  return;
306 
307  if(item->isChecked())
308  //m_checkedDatasets.insert(std::make_pair<te::da::DataSetTypePtr, std::string>(item->getDataSet(), item->getGeomPropertyName()));
309  m_checkedDatasets.insert(std::make_pair(item->getDataSet(), item->getGeomPropertyName()));
310  else
311  m_checkedDatasets.erase(item->getDataSet());
312 }
313 
315 {
316  if(item == 0)
317  return;
318 
319  previewMap(item->getDataSet());
320  previewData(item->getDataSet());
321 }
322 
324 {
325  if(item == 0)
326  return;
327 
328  const std::vector<DataSetItem*>& items = item->getDataSetItems();
329 
330  for(std::size_t i = 0; i < items.size(); ++i)
331  onDataSetToggled(items[i]);
332 }
333 
335 {
336  if(on)
337  {
338  QModelIndex current = m_datasetTreeView->currentIndex();
339 
340  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(current.internalPointer());
341 
342  if(item == 0)
343  return;
344 
345  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
346 
347  if(ditem == 0)
348  return;
349 
350  previewMap(ditem->getDataSet());
351  }
352  else
353  {
354  m_mapPreview->clear();
355  }
356 }
357 
359 {
360  if(on)
361  {
362  QModelIndex current = m_datasetTreeView->currentIndex();
363 
364  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(current.internalPointer());
365 
366  if(item == 0)
367  return;
368 
369  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
370 
371  if(ditem == 0)
372  return;
373 
374  previewData(ditem->getDataSet());
375  }
376 }
377 
379 {
380  return first->getName() < second->getName();
381 }
void previewData(const te::da::DataSetTypePtr &dataset)
boost::shared_ptr< DataSetType > DataSetTypePtr
Definition: DataSetType.h:653
boost::shared_ptr< DataSource > DataSourcePtr
Definition: DataSource.h:1435
std::auto_ptr< DataSetTreeView > m_datasetTreeView
const std::vector< DataSetItem * > & getDataSetItems() const
A wizard for selecting datasets from a data source.
std::list< std::string > getSelectedGeomProperties() const
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
Definition: DataSet.h:65
std::list< te::da::DataSetTypePtr > getSelectedDataSets() const
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
const std::string & getGeomPropertyName() const
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.
std::auto_ptr< DataSetTableView > m_tblView
const te::da::DataSetTypePtr & getDataSet() const
A customized table view for te::map::AbstractLayer objects. Uses a te::qt::widgets::DataSetModel as i...
std::auto_ptr< te::qt::widgets::DataSetDisplay > m_mapPreview
std::auto_ptr< Ui::DataSetSelectorWidgetForm > m_ui
std::list< std::string > getCheckedGeomProperties() const
#define TE_QTWIDGETS_DEFAULT_TREEVIEW_IDENTATION
Definition: Config.h:34
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