All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DataSetSelectorWidget.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2011-2012 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 <QtGui/QMessageBox>
51 #include <QtGui/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::copy(m_checkedDatasets.begin(), m_checkedDatasets.end(), std::back_inserter(datasets));
171 
172  return datasets;
173 }
174 
176 {
177  return !m_checkedDatasets.empty();
178 }
179 
180 std::list<te::da::DataSetTypePtr> te::qt::widgets::DataSetSelectorWidget::getSelectedDataSets() const
181 {
182  std::list<te::da::DataSetTypePtr> datasets;
183 
184  std::list<DataSetItem*> items = m_datasetTreeView->getSelectedDataSets();
185 
186  for(std::list<DataSetItem*>::iterator it = items.begin(); it != items.end(); ++it)
187  {
188  DataSetItem* ditem = *it;
189 
190  if(ditem == 0)
191  continue;
192 
193  if(ditem->getDataSet().get() == 0)
194  continue;
195 
196  datasets.push_back(ditem->getDataSet());
197  }
198 
199  return datasets;
200 }
201 
203 {
204  return m_datasetTreeView->hasSelectedDataSets();
205 }
206 
208 {
209  return m_datasetTreeView.get();
210 }
211 
213 {
214  if(dataset.get() == 0)
215  return;
216 
217  try
218  {
219  if(m_ui->m_mapPreviewGroupBox->isChecked())
220  {
221  m_mapPreview->clear();
222  m_mapPreview->draw(dataset, m_datasource);
223  }
224  }
225  catch(...)
226  {
227  }
228 }
229 
231 {
232  if((dataset.get() == 0) || (m_datasource.get() == 0))
233  return;
234 
235  if(!m_ui->m_dataPreviewGroupBox->isChecked())
236  return;
237 
238  try
239  {
240  te::da::DataSourcePtr ds = te::da::DataSourceManager::getInstance().get(m_datasource->getId(), m_datasource->getAccessDriver(), m_datasource->getConnInfo());
241 
242  if(ds.get() == 0)
243  return;
244 
245  std::auto_ptr<te::da::DataSet> feature(ds->getDataSet(dataset->getName()));
246 
247  std::vector<std::size_t> properties;
248  for(std::size_t i = 0; i < feature->getNumProperties(); ++i)
249  properties.push_back(i);
250 
251  std::auto_ptr<te::mem::DataSet> memFeature((new te::mem::DataSet(*feature.get(), properties, m_nPreviewRows)));
252 
253  m_tblView->setDataSet(memFeature.release());
254  }
255  catch(...)
256  {
257  }
258 }
259 
261 {
262  if(item == 0)
263  return;
264 
265  if(item->isChecked())
266  m_checkedDatasets.insert(item->getDataSet());
267  else
268  m_checkedDatasets.erase(item->getDataSet());
269 }
270 
272 {
273  if(item == 0)
274  return;
275 
276  previewMap(item->getDataSet());
277  previewData(item->getDataSet());
278 }
279 
281 {
282  if(item == 0)
283  return;
284 
285  const std::vector<DataSetItem*>& items = item->getDataSetItems();
286 
287  for(std::size_t i = 0; i < items.size(); ++i)
288  onDataSetToggled(items[i]);
289 }
290 
292 {
293  if(on)
294  {
295  QModelIndex current = m_datasetTreeView->currentIndex();
296 
297  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(current.internalPointer());
298 
299  if(item == 0)
300  return;
301 
302  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
303 
304  if(ditem == 0)
305  return;
306 
307  previewMap(ditem->getDataSet());
308  }
309  else
310  {
311  m_mapPreview->clear();
312  }
313 }
314 
316 {
317  if(on)
318  {
319  QModelIndex current = m_datasetTreeView->currentIndex();
320 
321  AbstractDataSourceTreeItem* item = static_cast<AbstractDataSourceTreeItem*>(current.internalPointer());
322 
323  if(item == 0)
324  return;
325 
326  DataSetItem* ditem = dynamic_cast<DataSetItem*>(item);
327 
328  if(ditem == 0)
329  return;
330 
331  previewData(ditem->getDataSet());
332  }
333  else
334  {
335  QAbstractItemModel* oldModel = m_tblView->model();
336  m_tblView->setModel(0);
337  delete oldModel;
338  }
339 }
340 
342 {
343  return first->getName() < second->getName();
344 }
A tree view for datasets of a data source.
DataSetSelectorWidget(QWidget *parent=0, Qt::WindowFlags f=0)
Implementation of a random-access dataset class for the TerraLib In-Memory Data Access driver...
Definition: DataSet.h:64
const std::vector< DataSetItem * > & getDataSetItems() const
void previewMap(const te::da::DataSetTypePtr &dataset)
#define TE_QTWIDGETS_DEFAULT_TREEVIEW_IDENTATION
Definition: Config.h:34
std::auto_ptr< DataSetTreeView > m_datasetTreeView
std::list< te::da::DataSetTypePtr > getSelectedDataSets() const
bool operator()(const te::da::DataSetTypePtr &first, const te::da::DataSetTypePtr &second) const
A map display for a dataset.
std::list< te::da::DataSetTypePtr > getCheckedDataSets() const
std::auto_ptr< DataSetTableView > m_tblView
boost::shared_ptr< DataSource > DataSourcePtr
Definition: DataSource.h:1395
std::auto_ptr< Ui::DataSetSelectorWidgetForm > m_ui
std::auto_ptr< te::qt::widgets::DataSetDisplay > m_mapPreview
A customized table view for te::map::AbstractLayer objects. Uses a te::qt::widgets::DataSetModel as i...
void onDataSetGroupToggled(DataSetGroupItem *item)
boost::shared_ptr< DataSetType > DataSetTypePtr
Definition: DataSetType.h:653
void set(const te::da::DataSourceInfoPtr &ds, bool useCheckableItems=false)
static DataSourceManager & getInstance()
It returns a reference to the singleton instance.
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr
void previewData(const te::da::DataSetTypePtr &dataset)
A wizard for selecting datasets from a data source.
const te::da::DataSetTypePtr & getDataSet() const