All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
BaseApplication.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/af/BaseApplication.cpp
22 
23  \brief A main window to be used as the basis for TerraLib applications.
24 */
25 
26 // TerraLib
27 #include "../../common/Logger.h"
28 #include "../../common/progress/ProgressManager.h"
29 #include "../../common/progress/TaskProgress.h"
30 #include "../../common/SystemApplicationSettings.h"
31 #include "../../common/STLUtils.h"
32 #include "../../common/Translator.h"
33 #include "../../common/UserApplicationSettings.h"
34 #include "../../dataaccess/datasource/DataSourceInfoManager.h"
35 #include "../../dataaccess/dataset/ObjectIdSet.h"
36 #include "../../maptools/DataSetLayer.h"
37 #include "../../maptools/Utils.h"
38 #include "../../srs/Config.h"
39 #include "../../srs/SpatialReferenceSystemManager.h"
40 #include "../widgets/canvas/EyeBirdMapDisplayWidget.h"
41 #include "../widgets/canvas/MultiThreadMapDisplay.h"
42 #include "../widgets/canvas/ZoomInMapDisplayWidget.h"
43 #include "../widgets/charts/ChartLayerDialog.h"
44 #include "../widgets/charts/HistogramDialog.h"
45 #include "../widgets/charts/ScatterDialog.h"
46 #include "../widgets/datasource/core/DataSourceType.h"
47 #include "../widgets/datasource/core/DataSourceTypeManager.h"
48 #include "../widgets/datasource/connector/AbstractDataSourceConnector.h"
49 #include "../widgets/datasource/selector/DataSourceExplorerDialog.h"
50 #include "../widgets/datasource/selector/DataSourceSelectorDialog.h"
51 #include "../widgets/exchanger/DataExchangerWizard.h"
52 #include "../widgets/exchanger/DirectExchangerDialog.h"
53 #include "../widgets/externalTable/DataPropertiesDialog.h"
54 #include "../widgets/externalTable/TableLinkDialog.h"
55 #include "../widgets/help/HelpManager.h"
56 #include "../widgets/layer/explorer/ColorMapItem.h"
57 #include "../widgets/layer/explorer/ChartItem.h"
58 #include "../widgets/layer/explorer/GroupingItem.h"
59 #include "../widgets/layer/explorer/LayerExplorer.h"
60 #include "../widgets/layer/explorer/LayerTreeView.h"
61 #include "../widgets/layer/explorer/AbstractTreeItem.h"
62 #include "../widgets/layer/explorer/FolderLayerItem.h"
63 #include "../widgets/layer/info/LayerPropertiesInfoWidget.h"
64 #include "../widgets/layer/selector/AbstractLayerSelector.h"
65 #include "../widgets/layer/utils/CompositionModeMenuWidget.h"
66 #include "../widgets/plugin/manager/PluginManagerDialog.h"
67 #include "../widgets/progress/ProgressViewerBar.h"
68 #include "../widgets/progress/ProgressViewerDialog.h"
69 #include "../widgets/progress/ProgressViewerWidget.h"
70 #include "../widgets/query/QueryDataSourceDialog.h"
71 #include "../widgets/query/QueryDialog.h"
72 #include "../widgets/query/QueryLayerBuilderWizard.h"
73 #include "../widgets/raster/MultiResolutionDialog.h"
74 #include "../widgets/se/GroupingDialog.h"
75 #include "../widgets/se/StyleDockWidget.h"
76 #include "../widgets/tools/Info.h"
77 #include "../widgets/tools/Measure.h"
78 #include "../widgets/tools/Pan.h"
79 #include "../widgets/tools/Selection.h"
80 #include "../widgets/tools/ZoomArea.h"
81 #include "../widgets/tools/ZoomClick.h"
82 #include "../widgets/srs/SRSManagerDialog.h"
83 #include "../widgets/vector/FixGeometryDialog.h"
88 #include "connectors/MapDisplay.h"
91 #include "events/LayerEvents.h"
92 #include "events/MapEvents.h"
93 #include "events/ProjectEvents.h"
94 #include "events/ToolEvents.h"
96 #include "ApplicationController.h"
97 #include "BaseApplication.h"
98 #include "Exception.h"
99 #include "Project.h"
100 #include "ProjectInfoDialog.h"
101 #include "SplashScreenManager.h"
102 #include "Utils.h"
103 
104 // Qt
105 #include <QDir>
106 #include <QActionGroup>
107 #include <QApplication>
108 #include <QCloseEvent>
109 #include <QDockWidget>
110 #include <QFileDialog>
111 #include <QInputDialog>
112 #include <QLabel>
113 #include <QMenu>
114 #include <QMenuBar>
115 #include <QStatusBar>
116 #include <QToolBar>
117 #include <QToolButton>
118 
119 // STL
120 #include <list>
121 #include <memory>
122 #include <utility>
123 
124 // Boost
125 #include <boost/filesystem.hpp>
126 #include <boost/format.hpp>
127 #include <boost/uuid/random_generator.hpp>
128 #include <boost/uuid/uuid_io.hpp>
129 
130 
131 te::qt::af::DataSetTableDockWidget* GetLayerDock(const te::map::AbstractLayer* layer, const std::vector<te::qt::af::DataSetTableDockWidget*>& docs)
132 {
133  std::vector<te::qt::af::DataSetTableDockWidget*>::const_iterator it;
134 
135  for(it=docs.begin(); it!=docs.end(); ++it)
136  if((*it)->getLayer() == layer)
137  return *it;
138 
139  return 0;
140 }
141 
142 void CloseAllTables(std::vector<te::qt::af::DataSetTableDockWidget*>& tables)
143 {
144  std::vector<te::qt::af::DataSetTableDockWidget*>::iterator it;
145 
146  for(it=tables.begin(); it!=tables.end(); ++it)
147  (*it)->close();
148 
149  tables.clear();
150 }
151 
153  : QMainWindow(parent, 0),
154  m_mapCursorSize(QSize(20, 20)),
155  m_iController(0),
156  m_explorer(0),
157  m_display(0),
158  m_styleExplorer(0),
159  m_queryDlg(0),
160  m_compModeMenu(0),
161  m_project(0),
162  m_progressDockWidget(0),
163  m_zoomInDisplaysDockWidget(0),
164  m_eyeBirdDisplaysDockWidget(0),
165  m_restartTerraLib(false)
166 // m_controller(0)
167 {
168 // m_controller = new ApplicationController;
169 
170  if (objectName().isEmpty())
171  setObjectName("BaseApplicationForm");
172 
173  resize(640, 480);
174  setMinimumSize(QSize(640, 480));
175 
176  m_centralwidget = new QWidget(this);
177  m_centralwidget->setObjectName("centralwidget");
178  setCentralWidget(m_centralwidget);
179 
180  // Initilazing menus
181  m_menubar = new QMenuBar(this);
182  m_fileMenu = new QMenu(m_menubar);
183  m_recentProjectsMenu = new QMenu(m_fileMenu);
184  m_menubar->addAction(m_fileMenu->menuAction());
185  m_viewMenu = new QMenu(m_menubar);
186  m_menubar->addAction(m_viewMenu->menuAction());
187  m_viewToolBarsMenu = new QMenu(m_viewMenu);
188  m_viewMenu->addMenu(m_viewToolBarsMenu);
189  m_projectMenu = new QMenu(m_menubar);
191  m_menubar->addAction(m_projectMenu->menuAction());
192  //m_projectMenu->addAction(m_projectAddLayerMenu->menuAction());
194  m_layerMenu = new QMenu(m_menubar);
195  m_menubar->addAction(m_layerMenu->menuAction());
196  m_mapMenu = new QMenu(m_menubar);
197  m_menubar->addAction(m_mapMenu->menuAction());
198  m_toolsMenu = new QMenu(m_menubar);
199  m_toolsExchangerMenu = new QMenu(m_toolsMenu);
200  m_toolsMenu->addAction(m_toolsExchangerMenu->menuAction());
201  m_menubar->addAction(m_toolsMenu->menuAction());
202  m_pluginsMenu = new QMenu(m_menubar);
203  m_menubar->addAction(m_pluginsMenu->menuAction());
204  m_helpMenu = new QMenu(m_menubar);
205  m_menubar->addAction(m_helpMenu->menuAction());
206 
207  te::qt::af::ApplicationController::getInstance().setMsgBoxParentWidget(this);
208 }
209 
211 {
212  te::qt::af::SaveState(this);
213 
214  if(m_iController)
215  m_iController->removeInteface(m_queryDlg);
216 
217  delete m_iController;
218  delete m_explorer;
219  delete m_display;
220  delete m_styleExplorer;
221  delete m_queryDlg;
222  delete m_compModeMenu;
223  delete m_project;
224  delete m_progressDockWidget;
225  delete m_zoomInDisplaysDockWidget;
226  delete m_eyeBirdDisplaysDockWidget;
227 
228  while(!m_tableDocks.empty())
229  delete *m_tableDocks.begin();
230 
232 
234 }
235 
237 {
238  throw Exception("Not implemented yet!");
239 }
240 
241 void te::qt::af::BaseApplication::init(const std::string& configFile)
242 {
244 
245  try
246  {
248  }
249  catch(const std::exception& e)
250  {
251  QString msgErr(tr("Could not initialize the application: %1"));
252 
253  msgErr = msgErr.arg(e.what());
254 
255  QMessageBox::critical(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msgErr);
256 
257  throw;
258  }
259 
260  setWindowIcon(QIcon::fromTheme(te::qt::af::ApplicationController::getInstance().getAppIconName()));
261 
262  setWindowTitle(te::qt::af::ApplicationController::getInstance().getAppTitle());
263 
264  makeDialog();
265 
267 
268  try
269  {
271  }
272  catch(const std::exception& e)
273  {
274  QString msgErr(tr("Error loading plugins: %1"));
275 
276  msgErr = msgErr.arg(e.what());
277 
278  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msgErr);
279  }
280 
281 // try to load the last opened project
283 
284  if(recentProject.isEmpty() || !te::qt::af::GetOpenLastProjectFromSettings())
285  newProject();
286  else
287  {
288  try
289  {
290  openProject(recentProject);
291  }
292  catch (const te::common::Exception& ex)
293  {
294  QString msgErr(tr("Error loading the project: %1!"));
295 
296  msgErr = msgErr.arg(ex.what());
297 
298  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msgErr);
299 
300  newProject();
301  }
302  }
303 
304  // The selection tool come active as default
305  onSelectionToggled(true);
306  m_mapSelection->setChecked(true);
307 
308  m_viewDataTable->setChecked(false);
309  m_viewDataTable->setEnabled(false);
310 }
311 
313 {
315 }
316 
318 {
319  return m_display;
320 }
322 {
323  return m_iController;
324 }
325 
327 {
328  m_restartTerraLib = !status;
330 }
331 
333 {
334  switch(evt->m_id)
335  {
337  {
338  // Add the unsave asterisk
339  setWindowTitle(te::qt::af::UnsavedStar(windowTitle(), true));
340 
341  m_project->setProjectAsChanged(true);
342  }
343  break;
344 
346  {
348  QMainWindow::addToolBar(Qt::TopToolBarArea, e->m_toolbar);
349  }
350  break;
351 
353  {
355  QString text = "(" + QString::number(e->m_x, 'f', 5) + " , " + QString::number(e->m_y, 'f', 5) + ")";
356  m_coordinateLineEdit->setText(text);
357  }
358  break;
359 
361  {
363 
364  std::pair<int, std::string> srid = e->m_srid;
365 
366  if (srid.first != TE_UNKNOWN_SRS)
367  {
368  QString sridText(srid.second.c_str());
369  sridText += ":" + QString::number(srid.first);
370  m_mapSRIDLineEdit->setText(sridText);
371  }
372  else
373  {
374  m_mapSRIDLineEdit->setText("Unknown SRS");
375  m_coordinateLineEdit->setText("Coordinates");
376  }
377  }
378  break;
379 
381  {
383  if(lEvt->m_layer == 0 || lEvt->m_layer->getSelected() == 0)
384  return;
385 
386  m_selected->setText(tr("Selected rows: ")+QString::number(lEvt->m_layer->getSelected()->size()));
387  }
388  break;
389 
390  default:
391  break;
392  }
393 }
394 
396 {
397  try
398  {
399  QApplication::setOverrideCursor(Qt::WaitCursor);
400 
401  // Get the parent layer where the dataset layer(s) will be added.
402  te::map::AbstractLayerPtr parentLayer(0);
403 
404  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
405 
406  if(selectedLayerItems.size() == 1 && selectedLayerItems.front()->getItemType() == "FOLDER_LAYER_ITEM")
407  parentLayer = selectedLayerItems.front()->getLayer();
408 
409  // Get the layer(s) to be added
410  std::auto_ptr<te::qt::widgets::DataSourceSelectorDialog> dselector(new te::qt::widgets::DataSourceSelectorDialog(this));
411 
412  QString dsTypeSett = GetLastDatasourceFromSettings();
413 
414  if(!dsTypeSett.isNull() && !dsTypeSett.isEmpty())
415  dselector->setDataSourceToUse(dsTypeSett);
416 
417  QApplication::restoreOverrideCursor();
418 
419  int retval = dselector->exec();
420 
421  QApplication::setOverrideCursor(Qt::WaitCursor);
422 
423  if(retval == QDialog::Rejected)
424  {
425  QApplication::restoreOverrideCursor();
426  return;
427  }
428 
429  std::list<te::da::DataSourceInfoPtr> selectedDatasources = dselector->getSelecteds();
430 
431  if(selectedDatasources.empty())
432  {
433  QApplication::restoreOverrideCursor();
434  return;
435  }
436 
437  dselector.reset(0);
438 
439  const std::string& dsTypeId = selectedDatasources.front()->getType();
440 
442 
443  std::auto_ptr<QWidget> lselectorw(dsType->getWidget(te::qt::widgets::DataSourceType::WIDGET_LAYER_SELECTOR, this));
444 
445  if(lselectorw.get() == 0)
446  {
447  QApplication::restoreOverrideCursor();
448  throw Exception((boost::format(TE_TR("No layer selector widget found for this type of data source: %1%!")) % dsTypeId).str());
449  }
450 
451  te::qt::widgets::AbstractLayerSelector* lselector = dynamic_cast<te::qt::widgets::AbstractLayerSelector*>(lselectorw.get());
452 
453  if(lselector == 0)
454  {
455  QApplication::restoreOverrideCursor();
456  throw Exception(TE_TR("Wrong type of object for layer selection!"));
457  }
458 
459  lselector->set(selectedDatasources);
460 
461  QApplication::restoreOverrideCursor();
462 
463  std::list<te::map::AbstractLayerPtr> layers = lselector->getLayers();
464 
465  QApplication::setOverrideCursor(Qt::WaitCursor);
466 
467  lselectorw.reset(0);
468 
469  if(m_project == 0)
470  {
471  QApplication::restoreOverrideCursor();
472  throw Exception(TE_TR("Error: there is no opened project!"));
473  }
474 
475  std::list<te::map::AbstractLayerPtr>::const_iterator it = layers.begin();
476  std::list<te::map::AbstractLayerPtr>::const_iterator itend = layers.end();
477 
478  while(it != itend)
479  {
480  if((m_explorer != 0) && (m_explorer->getExplorer() != 0))
481  {
482  te::qt::af::evt::LayerAdded evt(*it, parentLayer);
484  }
485  ++it;
486  }
487 
488  SaveLastDatasourceOnSettings(dsTypeId.c_str());
489 
490  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
491  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
492  }
493  catch(const std::exception& e)
494  {
495  QApplication::restoreOverrideCursor();
496  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
497  }
498  catch(...)
499  {
500  QApplication::restoreOverrideCursor();
501  QMessageBox::warning(this,
503  tr("Unknown error while trying to add a layer from a dataset!"));
504  }
505  QApplication::restoreOverrideCursor();
506 }
507 
509 {
510  try
511  {
512  if(m_project == 0)
513  throw Exception(TE_TR("Error: there is no opened project!"));
514 
515  // Get the parent layer where the dataset layer(s) will be added.
516  te::map::AbstractLayerPtr parentLayer(0);
517 
518  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
519 
520  if(selectedLayerItems.size() == 1 && selectedLayerItems.front()->getItemType() == "FOLDER_LAYER_ITEM")
521  parentLayer = selectedLayerItems.front()->getLayer();
522 
523  std::auto_ptr<te::qt::widgets::QueryLayerBuilderWizard> qlb(new te::qt::widgets::QueryLayerBuilderWizard(this));
524 
525  std::list<te::map::AbstractLayerPtr> layers = te::qt::af::ApplicationController::getInstance().getProject()->getAllLayers(false);
526 
527  qlb->setLayerList(layers);
528 
529  int retval = qlb->exec();
530 
531  if(retval == QDialog::Rejected)
532  return;
533 
534  te::map::AbstractLayerPtr layer = qlb->getQueryLayer();
535 
536  if((m_explorer != 0) && (m_explorer->getExplorer() != 0))
537  {
538  te::qt::af::evt::LayerAdded evt(layer, parentLayer);
540  }
541 
542  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
543  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
544  }
545  catch(const std::exception& e)
546  {
547  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
548  }
549  catch(...)
550  {
551  QMessageBox::warning(this,
553  tr("Unknown error while trying to add a layer from a queried dataset!"));
554  }
555 }
556 
558 {
559  try
560  {
561  if(m_project == 0)
562  throw Exception(TE_TR("Error: there is no opened project!"));
563 
564  // Get the parent layer where the tabular layer will be added.
565  te::map::AbstractLayerPtr parentLayer(0);
566 
567  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
568 
569  if(selectedLayerItems.size() == 1 && selectedLayerItems.front()->getItemType() == "FOLDER_LAYER_ITEM")
570  parentLayer = selectedLayerItems.front()->getLayer();
571 
573  int res = dlg.exec();
574  if (res == QDialog::Accepted)
575  {
576  if((m_explorer != 0) && (m_explorer->getExplorer() != 0))
577  {
578  te::qt::af::evt::LayerAdded evt(dlg.getDataSetAdapterLayer(), parentLayer);
580  }
581 
582  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
583  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
584  }
585  }
586  catch(const std::exception& e)
587  {
588  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
589  }
590  catch(...)
591  {
592  QMessageBox::warning(this,
594  tr("Unknown error while trying to add a layer from a queried dataset!"));
595  }
596 }
597 
599 {
600  try
601  {
602  ChartDisplayDockWidget* doc = new ChartDisplayDockWidget(chartDisplay, this);
603  doc->setSelectionColor(ApplicationController::getInstance().getSelectionColor());
604  doc->setWindowTitle("Histogram");
605  doc->setWindowIcon(QIcon::fromTheme("chart-bar"));
606  doc->setLayer(layer);
607 
609  addDockWidget(Qt::RightDockWidgetArea, doc, Qt::Horizontal);
610  doc->show();
611  }
612  catch(const std::exception& e)
613  {
614  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
615  }
616 }
617 
619 {
620  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
621 
622  if(selectedLayerItems.empty())
623  {
624  QString msg = tr("Select at least one layer to be removed!");
625  QMessageBox::warning(this, tr("Remove Layer"), msg);
626 
627  return;
628  }
629 
630  QString msg;
631  QString questionTitle;
632 
633  if(selectedLayerItems.size() == 1)
634  {
635  msg = tr("Do you really want to remove the selected layer?");
636  questionTitle = tr("Remove Layer");
637  }
638  else
639  {
640  msg = tr("Do you really want to remove the selected layers?");
641  questionTitle = tr("Remove Layers");
642  }
643 
644  int reply = QMessageBox::question(this, questionTitle, msg, QMessageBox::No, QMessageBox::Yes);
645 
646  if(reply == QMessageBox::No)
647  return;
648 
649  std::list<te::qt::widgets::AbstractTreeItem*>::const_iterator it;
650  for(it = selectedLayerItems.begin(); it != selectedLayerItems.end(); ++it)
651  {
652  te::qt::af::evt::LayerRemoved evt((*it)->getLayer());
654  }
655 }
656 
658 {
659  try
660  {
661  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
662 
663  // Get Data Source
664  std::auto_ptr<te::qt::widgets::DataSourceSelectorDialog> dselector(new te::qt::widgets::DataSourceSelectorDialog(this));
665 
666  QString dsTypeSett = GetLastDatasourceFromSettings();
667 
668  if(!dsTypeSett.isNull() && !dsTypeSett.isEmpty())
669  dselector->setDataSourceToUse(dsTypeSett);
670 
671  int retval = dselector->exec();
672 
673  if(retval == QDialog::Rejected)
674  return;
675 
676  std::list<te::da::DataSourceInfoPtr> selectedDatasources = dselector->getSelecteds();
677 
678  if(selectedDatasources.empty())
679  return;
680 
681  dselector.reset(0);
682 
683  const std::string& dsId = selectedDatasources.front()->getId();
684 
685  te::map::AbstractLayerPtr layer = selectedLayerItems.front()->getLayer();
686 
687  te::map::DataSetLayer* dsl = (te::map::DataSetLayer*)layer.get();
688 
689  if(dsl)
690  dsl->setDataSourceId(dsId);
691 
692  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
693  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
694  }
695  catch(const std::exception& e)
696  {
697  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
698  }
699  catch(...)
700  {
701  QMessageBox::warning(this,
703  tr("Unknown error while trying to change a layer data source!"));
704  }
705 }
706 
708 {
709  try
710  {
711  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
712 
713  if(selectedLayerItems.empty())
714  return;
715 
716  te::map::AbstractLayerPtr layer = selectedLayerItems.front()->getLayer();
717 
718  te::map::DataSetLayer* dsl = (te::map::DataSetLayer*)layer.get();
719 
720  if(!dsl)
721  return;
722 
723  std::list<te::da::DataSourceInfoPtr> selecteds;
724 
726 
727  selecteds.push_back(ds);
728 
729  const std::string& dsTypeId = selecteds.front()->getType();
730 
732 
733  std::auto_ptr<QWidget> connectorw(dsType->getWidget(te::qt::widgets::DataSourceType::WIDGET_DATASOURCE_CONNECTOR, this));
734 
735  if(connectorw.get() == 0)
736  {
737  throw Exception((boost::format(TE_TR("No layer selector widget found for this type of data source: %1%!")) % dsTypeId).str());
738  }
739 
741 
742  if(connector == 0)
743  {
744  throw Exception(TE_TR("Wrong type of object for layer selection!"));
745  }
746 
747  connector->update(selecteds);
748  }
749  catch(const std::exception& e)
750  {
751  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
752  }
753  catch(...)
754  {
755  QMessageBox::warning(this,
757  tr("Unknown error while trying to update a layer data source!"));
758  }
759 }
760 
762 {
763  std::list<te::qt::widgets::AbstractTreeItem*> selectedItems = m_explorer->getExplorer()->getSelectedItems();
764 
765  std::list<te::qt::widgets::AbstractTreeItem*>::const_iterator it;
766  for(it = selectedItems.begin(); it != selectedItems.end(); ++it)
767  {
770  }
771 }
772 
774 {
775  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
776 
777  if(selectedLayerItems.empty() ||
778  (selectedLayerItems.size() == 1 && !selectedLayerItems.front()->getLayer()) ||
779  selectedLayerItems.size() > 1)
780  {
781  QString msg = tr("Select only one layer to be renamed!");
782  QMessageBox::warning(this, tr("Rename Layer"), msg);
783 
784  return;
785  }
786 
787  te::qt::widgets::AbstractTreeItem* selectedLayerItem = selectedLayerItems.front();
788  te::map::AbstractLayerPtr layer = selectedLayerItem->getLayer();
789 
790  bool ok;
791  QString text = QInputDialog::getText(this, ApplicationController::getInstance().getAppTitle(),
792  tr("Rename Layer:"), QLineEdit::Normal,
793  layer->getTitle().c_str(), &ok);
794 
795  if (!ok)
796  return;
797 
798  if(text.isEmpty())
799  {
800  QMessageBox::warning(this, ApplicationController::getInstance().getAppTitle(), tr("Enter the new name!"));
801  return;
802  }
803 
804  layer->setTitle(text.toStdString());
805 
806  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
807  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
808 }
809 
811 {
812  try
813  {
815  dlg.exec();
816  }
817  catch(const std::exception& e)
818  {
819  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
820  }
821 }
822 
824 {
825  QString projFile = proj->data().toString();
826 
827  openProject(projFile);
828 }
829 
831 {
832  newProject();
833 
834  //onSaveProjectAsTriggered();
835 }
836 
838 {
839  QString file = QFileDialog::getOpenFileName(this, tr("Open project file"), qApp->applicationDirPath(), te::qt::af::GetExtensionFilter());
840 
841  if(file.isEmpty())
842  return;
843 
844  try
845  {
846  openProject(file);
847  }
848  catch(const te::common::Exception& e)
849  {
850  QString msg = tr("Fail to open project.");
851  msg += " ";
852  msg += e.what();
853  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msg);
854  }
855 }
856 
858 {
859  std::string fName = m_project->getFileName();
860 
861  if(fName.empty())
862  {
863  QString fileName = QFileDialog::getSaveFileName(this, tr("Save Project File"), qApp->applicationDirPath(), te::qt::af::GetExtensionFilter());
864 
865  if(!fileName.isEmpty())
866  {
867  if(m_project->getTitle() == "New Project")
868  m_project->setTitle(boost::filesystem::basename(fileName.toStdString()));
869 
870  QFileInfo info(fileName);
871 
873 
874  if(info.suffix() != appProjectExtension)
875  {
876  QString s(".");
877  s.append(appProjectExtension);
878  fileName.append(s);
879  }
880 
881  fName = fileName.toStdString();
882  m_project->setFileName(fName);
883  }
884  else
885  {
886  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("Project not saved."));
887  return;
888  }
889  }
890 
891  // Set the project title and its status as "no change"
892  //std::string projectTitle = boost::filesystem::basename(m_project->getFileName());
893  //m_project->setTitle(projectTitle);
894 
895  m_project->setProjectAsChanged(false);
896 
897  // Save the project
898  te::qt::af::Save(*m_project, m_project->getFileName());
899 
900  // Set the window title
901  setWindowTitle(te::qt::af::GetWindowTitle(*m_project));
902 
903  te::qt::af::ApplicationController::getInstance().updateRecentProjects(m_project->getFileName().c_str(), m_project->getTitle().c_str());
904 
906 }
907 
909 {
910  if(m_project == 0)
911  return;
912 
913  QString fileName = QFileDialog::getSaveFileName(this, tr("Save Project File"), qApp->applicationDirPath(), te::qt::af::GetExtensionFilter());
914 
915  if(fileName.isEmpty())
916  return;
917 
918  std::string fName = fileName.toStdString();
919 
920  m_project->setFileName(fName);
921 
922  if(!boost::filesystem::exists(fName) && m_project->getTitle() == "New Project")
923  {
924  m_project->setTitle(boost::filesystem::basename(fName));
925  }
926 
927  te::qt::af::Save(*m_project, fName);
928 
929  ApplicationController::getInstance().updateRecentProjects(fileName, m_project->getTitle().c_str());
930 
931  // Set the project title and its status as "no change"
932  //std::string projectTitle = boost::filesystem::basename(m_project->getFileName());
933  //m_project->setTitle(projectTitle);
934 
935  m_project->setProjectAsChanged(false);
936 
937  // Set the window title
938  setWindowTitle(te::qt::af::GetWindowTitle(*m_project));
939 
941 }
942 
944 {
945  QMessageBox msgBox(this);
946 
947  msgBox.setText(tr("The system will be restarted."));
948  msgBox.setInformativeText(tr("Do you want to continue?"));
949  msgBox.setWindowTitle(tr("Restart system"));
950 
951  msgBox.addButton(QMessageBox::No);
952  msgBox.addButton(QMessageBox::Yes);
953 
954  msgBox.setDefaultButton(QMessageBox::Yes);
955 
956  if(msgBox.exec() == QMessageBox::Yes)
957  qApp->exit(1000);
958 }
959 
961 {
962  try
963  {
964  te::qt::af::SettingsDialog dlg(this);
965  dlg.exec();
966  }
967  catch(const std::exception& e)
968  {
969  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
970  }
971 }
972 
974 {
975  try
976  {
978  dlg.exec();
979  }
980  catch(const std::exception& e)
981  {
982  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
983  }
984 }
985 
987 {
988  try
989  {
991 
992  std::list<te::map::AbstractLayerPtr> layers = te::qt::af::ApplicationController::getInstance().getProject()->getAllLayers(false);
993  dlg.setLayers(layers);
994 
995  QString dsTypeSett = GetLastDatasourceFromSettings();
996 
997  if(!dsTypeSett.isNull() && !dsTypeSett.isEmpty())
998  dlg.setLastDataSource(dsTypeSett.toStdString());
999 
1000  dlg.exec();
1001  }
1002  catch(const std::exception& e)
1003  {
1004  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1005  }
1006 }
1007 
1009 {
1010  try
1011  {
1013 
1014  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedSingleLayerItems();
1015 
1016  if(selectedLayerItems.empty())
1017  {
1018  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1019  tr("Select a single layer in the layer explorer!"));
1020  return;
1021  }
1022 
1023  te::qt::widgets::AbstractTreeItem* selectedLayerItem = *(selectedLayerItems.begin());
1024  te::map::AbstractLayerPtr selectedLayer = selectedLayerItem->getLayer();
1025 
1026  std::list<te::map::AbstractLayerPtr> layers;
1027  layers.push_back(selectedLayer);
1028 
1029  dlg.setLayers(layers);
1030 
1031  dlg.exec();
1032  }
1033  catch(const std::exception& e)
1034  {
1035  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1036  }
1037 }
1038 
1040 {
1041  try
1042  {
1044 
1045  connect(&dlg, SIGNAL(createNewLayer(te::map::AbstractLayerPtr)), this, SLOT(onCreateNewLayer(te::map::AbstractLayerPtr)));
1046 
1047  std::list<te::map::AbstractLayerPtr> layers = te::qt::af::ApplicationController::getInstance().getProject()->getAllLayers(false);
1048  dlg.setLayerList(layers);
1049  dlg.setAppMapDisplay(m_display->getDisplay());
1050 
1051  dlg.exec();
1052  }
1053  catch(const std::exception& e)
1054  {
1055  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1056  }
1057 }
1058 
1060 {
1061  try
1062  {
1064 
1065  std::list<te::map::AbstractLayerPtr> layers = te::qt::af::ApplicationController::getInstance().getProject()->getSingleLayers(false);
1066  dlg.setLayerList(layers);
1067 
1068  dlg.exec();
1069  }
1070  catch(const std::exception& e)
1071  {
1072  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1073  }
1074 }
1075 
1077 {
1078  try
1079  {
1081 
1082  std::list<te::map::AbstractLayerPtr> layers = te::qt::af::ApplicationController::getInstance().getProject()->getSingleLayers(false);
1083  dlg.setLayerList(layers);
1084 
1085  dlg.exec();
1086  }
1087  catch (const std::exception& e)
1088  {
1089  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1090  }
1091 }
1092 
1094 {
1095  if(m_project == 0)
1096  {
1097  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no current project!"));
1098  return;
1099  }
1100 
1101  ProjectInfoDialog editor(this);
1102  editor.setProject(m_project);
1103 
1104  if(editor.exec() == QDialog::Accepted)
1105  {
1106  // Set window title
1107  setWindowTitle(te::qt::af::GetWindowTitle(*m_project));
1108  }
1109 }
1110 
1112 {
1113  // Get the parent item where the folder layer will be added.
1114  te::map::AbstractLayerPtr parentLayer(0);
1115 
1116  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
1117 
1118  if(selectedLayerItems.size() == 1 && selectedLayerItems.front()->getItemType() == "FOLDER_LAYER_ITEM")
1119  parentLayer = selectedLayerItems.front()->getLayer();
1120 
1121  // Get the folder layer to be added
1122  bool ok;
1123  QString text = QInputDialog::getText(this, ApplicationController::getInstance().getAppTitle(),
1124  tr("Folder layer name:"), QLineEdit::Normal,
1125  tr("Enter folder layer name"), &ok);
1126 
1127  if (!ok)
1128  return;
1129 
1130  if(text.isEmpty())
1131  {
1132  QMessageBox::warning(this, ApplicationController::getInstance().getAppTitle(), tr("Enter the layer name!"));
1133  return;
1134  }
1135 
1136  static boost::uuids::basic_random_generator<boost::mt19937> gen;
1137  boost::uuids::uuid u = gen();
1138  std::string id = boost::uuids::to_string(u);
1139 
1141  folderLayer->setTitle(text.toStdString());
1142  folderLayer->setId(id);
1143 
1144  te::qt::af::evt::LayerAdded evt(folderLayer, parentLayer);
1146 
1147  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
1148  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
1149 }
1150 
1152 {
1153  std::list<te::qt::widgets::AbstractTreeItem*> layers = m_explorer->getExplorer()->getSelectedItems();
1154 
1155  if(layers.empty())
1156  {
1157  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no selected layer."));
1158  return;
1159  }
1160 
1161  // Docking
1162  QDockWidget* doc = new QDockWidget(this, Qt::Dialog);
1163 
1164  te::qt::widgets::LayerPropertiesInfoWidget* info = new te::qt::widgets::LayerPropertiesInfoWidget((*(layers.begin()))->getLayer().get(), doc);
1165 
1166  doc->setWidget(info);
1167  doc->setWindowTitle(info->windowTitle());
1168  doc->setAttribute(Qt::WA_DeleteOnClose, true);
1169 
1170  doc->show();
1171 }
1172 
1174 {
1175  std::list<te::map::AbstractLayerPtr> layers = m_explorer->getExplorer()->getSelectedSingleLayers();
1176 
1177  if(layers.empty())
1178  {
1179  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no selected layer."));
1180  return;
1181  }
1182 
1183  std::list<te::map::AbstractLayerPtr>::iterator it = layers.begin();
1184 
1185  while(it != layers.end())
1186  {
1187  te::map::AbstractLayerPtr layer = (*it);
1188 
1189  if(!layer->isValid())
1190  {
1191  ++it;
1192  continue;
1193  }
1194 
1195  layer->clearSelected();
1196 
1197  ++it;
1198 
1201  }
1202 }
1203 
1205 {
1206  std::list<te::qt::widgets::AbstractTreeItem*> layers = m_explorer->getExplorer()->getSelectedItems();
1207 
1208  if(layers.empty())
1209  {
1210  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no selected layer."));
1211  return;
1212  }
1213  te::qt::widgets::SRSManagerDialog srsDialog(this);
1214  srsDialog.setWindowTitle(tr("Choose the SRS"));
1215 
1216  if(srsDialog.exec() == QDialog::Rejected)
1217  return;
1218 
1219  std::pair<int, std::string> srid = srsDialog.getSelectedSRS();
1220 
1221  te::map::AbstractLayerPtr lay = (*layers.begin())->getLayer();
1222 
1223  lay->setSRID(srid.first);
1224 }
1225 
1227 {
1228  std::list<te::qt::widgets::AbstractTreeItem*> layers = m_explorer->getExplorer()->getSelectedSingleLayerItems();
1229 
1230  if(layers.empty())
1231  {
1232  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no selected layer."));
1233  return;
1234  }
1235  else
1236  {
1237  std::list<te::qt::widgets::AbstractTreeItem*>::iterator it = layers.begin();
1238 
1239  while(it != layers.end())
1240  {
1241  if(!(*it)->getLayer()->isValid())
1242  {
1243  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1244  tr("There are invalid layers selected!"));
1245  return;
1246  }
1247 
1248  ++it;
1249  }
1250  }
1251 
1252 
1253  te::map::AbstractLayerPtr lay = (*layers.begin())->getLayer();
1254 
1255  if (lay->getSchema()->hasRaster())
1256  return;
1257 
1258  te::qt::af::DataSetTableDockWidget* doc = GetLayerDock(lay.get(), m_tableDocks);
1259 
1260  if(doc == 0)
1261  {
1262  doc = new te::qt::af::DataSetTableDockWidget(this);
1263  doc->setLayer(lay.get());
1264  addDockWidget(Qt::BottomDockWidgetArea, doc);
1265 
1266  connect (doc, SIGNAL(closed(te::qt::af::DataSetTableDockWidget*)), SLOT(onLayerTableClose(te::qt::af::DataSetTableDockWidget*)));
1267  connect (doc, SIGNAL(createChartDisplay(te::qt::widgets::ChartDisplayWidget*, te::map::AbstractLayer*)), SLOT(onChartDisplayCreated(te::qt::widgets::ChartDisplayWidget*, te::map::AbstractLayer*)));
1268 
1269  if(!m_tableDocks.empty())
1270  tabifyDockWidget(m_tableDocks[m_tableDocks.size()-1], doc);
1271 
1272  m_tableDocks.push_back(doc);
1273 
1275  }
1276 
1277 // doc->get
1278 
1279  doc->show();
1280  doc->raise();
1281 
1282  m_viewDataTable->setChecked(true);
1283 
1284  m_viewDataTable->setEnabled(true);
1285 }
1286 
1288 {
1289  try
1290  {
1291  std::list<te::map::AbstractLayerPtr> selectedLayers = m_explorer->getExplorer()->getSelectedSingleLayers();
1292 
1293  if(selectedLayers.empty())
1294  {
1295  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1296  tr("Select a layer in the layer explorer!"));
1297  return;
1298  }
1299  else
1300  {
1301  std::list<te::map::AbstractLayerPtr>::iterator it = selectedLayers.begin();
1302 
1303  while(it != selectedLayers.end())
1304  {
1305  if(!it->get()->isValid())
1306  {
1307  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1308  tr("There are invalid layers selected!"));
1309  return;
1310  }
1311 
1312  ++it;
1313  }
1314  }
1315 
1316  // The histogram will be created based on the first selected layer
1317  te::map::AbstractLayerPtr selectedLayer = *(selectedLayers.begin());
1318 
1319  const te::map::LayerSchema* schema = selectedLayer->getSchema().release();
1320 
1321  te::da::DataSet* dataset = selectedLayer->getData().release();
1322  te::da::DataSetType* dataType = (te::da::DataSetType*) schema;
1323 
1324  te::qt::widgets::HistogramDialog dlg(dataset, dataType, this);
1325 
1326  dlg.setWindowTitle(dlg.windowTitle() + " (" + tr("Layer") + ":" + selectedLayer->getTitle().c_str() +")");
1327 
1328  int res = dlg.exec();
1329  if (res == QDialog::Accepted)
1330  {
1332  doc->setSelectionColor(ApplicationController::getInstance().getSelectionColor());
1333  doc->setWindowTitle(tr("Histogram"));
1334  doc->setWindowIcon(QIcon::fromTheme("chart-bar"));
1335  doc->setLayer(selectedLayer.get());
1336 
1338  addDockWidget(Qt::RightDockWidgetArea, doc, Qt::Horizontal);
1339  doc->show();
1340  }
1341  }
1342  catch(const std::exception& e)
1343  {
1344  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1345  }
1346 }
1347 
1349 {
1350  try
1351  {
1352  if(m_project == 0)
1353  throw Exception(TE_TR("Error: there is no opened project!"));
1354 
1355  // Get the parent layer where the dataset layer(s) will be added.
1356  te::map::AbstractLayerPtr parentLayer(0);
1357 
1358  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
1359 
1360  if(selectedLayerItems.size() == 1 && selectedLayerItems.front()->getItemType() == "FOLDER_LAYER_ITEM")
1361  parentLayer = selectedLayerItems.front()->getLayer();
1362 
1363  std::list<te::map::AbstractLayerPtr> selectedLayers = m_explorer->getExplorer()->getSelectedSingleLayers();
1364 
1365  if(selectedLayers.empty())
1366  {
1367  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1368  tr("Select a layer in the layer explorer!"));
1369  return;
1370  }
1371  else
1372  {
1373  std::list<te::map::AbstractLayerPtr>::iterator it = selectedLayers.begin();
1374 
1375  while(it != selectedLayers.end())
1376  {
1377  if(!it->get()->isValid())
1378  {
1379  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1380  tr("There are invalid layers selected!"));
1381  return;
1382  }
1383 
1384  ++it;
1385  }
1386  }
1387 
1388  te::map::AbstractLayerPtr selectedLayer = *(selectedLayers.begin());
1389 
1390  std::auto_ptr<te::qt::widgets::TableLinkDialog> elb(new te::qt::widgets::TableLinkDialog(this));
1391  elb->setInputLayer(selectedLayer);
1392 
1393  int retval = elb->exec();
1394 
1395  if(retval == QDialog::Rejected)
1396  return;
1397 
1398  te::map::AbstractLayerPtr layer = elb->getQueryLayer();
1399 
1400  if((m_explorer != 0) && (m_explorer->getExplorer() != 0))
1401  {
1402  te::qt::af::evt::LayerAdded evt(layer, parentLayer);
1404  }
1405 
1406  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
1407  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
1408  }
1409  catch(const std::exception& e)
1410  {
1411  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1412  }
1413  catch(...)
1414  {
1415  QMessageBox::warning(this,
1417  tr("Unknown error while trying to add a layer from a queried dataset!"));
1418  }
1419 }
1420 
1422 {
1423  try
1424  {
1425  std::list<te::map::AbstractLayerPtr> selectedLayers = m_explorer->getExplorer()->getSelectedSingleLayers();
1426 
1427  if(selectedLayers.empty())
1428  {
1429  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1430  tr("Select a layer in the layer explorer!"));
1431  return;
1432  }
1433  else
1434  {
1435  std::list<te::map::AbstractLayerPtr>::iterator it = selectedLayers.begin();
1436 
1437  while(it != selectedLayers.end())
1438  {
1439  if(!it->get()->isValid())
1440  {
1441  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1442  tr("There are invalid layers selected!"));
1443  return;
1444  }
1445 
1446  ++it;
1447  }
1448  }
1449 
1450  // The scatter will be created based on the first selected layer
1451  te::map::AbstractLayerPtr selectedLayer = *(selectedLayers.begin());
1452 
1453  const te::map::LayerSchema* schema = selectedLayer->getSchema().release();
1454 
1455  te::da::DataSet* dataset = selectedLayer->getData().release();
1456  te::da::DataSetType* dataType = (te::da::DataSetType*) schema;
1457 
1458  te::qt::widgets::ScatterDialog dlg(dataset, dataType, this);
1459 
1460  dlg.setWindowTitle(dlg.windowTitle() + " (" + tr("Layer") + ":" + selectedLayer->getTitle().c_str() +")");
1461 
1462  int res = dlg.exec();
1463  if (res == QDialog::Accepted)
1464  {
1466 
1467  doc->setSelectionColor(ApplicationController::getInstance().getSelectionColor());
1468  doc->setWindowTitle(tr("Scatter"));
1469  doc->setWindowIcon(QIcon::fromTheme("chart-scatter"));
1471  doc->setLayer(selectedLayer.get());
1472 
1473  addDockWidget(Qt::RightDockWidgetArea, doc, Qt::Horizontal);
1474  doc->show();
1475  }
1476  }
1477  catch(const std::exception& e)
1478  {
1479  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1480  }
1481 }
1482 
1484 {
1485  try
1486  {
1487  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedSingleLayerItems();
1488 
1489  if(selectedLayerItems.empty())
1490  {
1491  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1492  tr("Select a single layer in the layer explorer!"));
1493  return;
1494  }
1495  else
1496  {
1497  std::list<te::qt::widgets::AbstractTreeItem*>::iterator it = selectedLayerItems.begin();
1498 
1499  while(it != selectedLayerItems.end())
1500  {
1501  if(!(*it)->getLayer()->isValid())
1502  {
1503  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1504  tr("There are invalid layers selected!"));
1505  return;
1506  }
1507 
1508  ++it;
1509  }
1510  }
1511 
1512  // The chart will be accomplished only on the first single layer selected
1513  te::qt::widgets::AbstractTreeItem* selectedLayerItem = *(selectedLayerItems.begin());
1514  te::map::AbstractLayerPtr selectedLayer = selectedLayerItem->getLayer();
1515 
1517 
1518  dlg.setWindowTitle(dlg.windowTitle() + " (" + tr("Layer") + ":" + selectedLayer->getTitle().c_str() +")");
1519 
1520  dlg.setLayer(selectedLayer);
1521 
1522  // If the selected layer has a chart associated to it, set the chart layer
1523  // dialog for initializing with this chart.
1524  te::map::Chart* chart = selectedLayer->getChart();
1525 
1526  if(chart)
1527  dlg.setChart(chart);
1528 
1529  // Check if the selected layer item has a chart item; in positive case, remove it from the layer item.
1530  te::qt::widgets::ChartItem* chartItem = selectedLayerItem->findChild<te::qt::widgets::ChartItem*>();
1531 
1532  if(chartItem)
1533  m_explorer->getExplorer()->remove(chartItem);
1534 
1535  // Collapse the selected layer item to allow the new chart item to be generated
1536  // in the next time the selected layer item is expanded.
1537  m_explorer->getExplorer()->collapse(selectedLayerItem);
1538 
1539  if(dlg.exec() == QDialog::Accepted)
1540  {
1541  // Expand the selected layer item and the chart item
1542  m_explorer->getExplorer()->expand(selectedLayerItem);
1543 
1544  chartItem = selectedLayerItem->findChild<te::qt::widgets::ChartItem*>();
1545  if(chartItem)
1546  m_explorer->getExplorer()->expand(chartItem);
1547 
1548  m_display->getDisplay()->refresh();
1549 
1550  // Send out an event informing that the project is not saved
1551  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
1552  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
1553  }
1554  }
1555  catch(const std::exception& e)
1556  {
1557  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1558  }
1559 }
1560 
1562 {
1563  try
1564  {
1565  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedSingleLayerItems();
1566 
1567  if(selectedLayerItems.empty())
1568  {
1569  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1570  tr("Select a single layer in the layer explorer!"));
1571  return;
1572  }
1573  else
1574  {
1575  std::list<te::qt::widgets::AbstractTreeItem*>::iterator it = selectedLayerItems.begin();
1576 
1577  while(it != selectedLayerItems.end())
1578  {
1579  if(!(*it)->getLayer()->isValid())
1580  {
1581  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1582  tr("There are invalid layers selected!"));
1583 
1584  return;
1585  }
1586 
1587  ++it;
1588  }
1589  }
1590 
1591  // The object grouping will be accomplished only on the first layer selected
1592  te::qt::widgets::AbstractTreeItem* selectedLayerItem = *(selectedLayerItems.begin());
1593  te::map::AbstractLayerPtr selectedLayer = selectedLayerItem->getLayer();
1594 
1595  // Get all layer with grouping to dispose to import
1596  std::list<te::map::AbstractLayerPtr> allLayersList = ApplicationController::getInstance().getProject()->getSingleLayers(false);
1597  std::vector<te::map::AbstractLayerPtr> allLayers(allLayersList.begin(), allLayersList.end());
1598 
1600  dlg.setLayers(selectedLayer, allLayers);
1601 
1602  // Check if the selected layer item has a grouping item; in positive case, remove it from the layer item.
1603  te::qt::widgets::GroupingItem* groupingItem = selectedLayerItem->findChild<te::qt::widgets::GroupingItem*>();
1604 
1605  if(groupingItem)
1606  m_explorer->getExplorer()->remove(groupingItem);
1607 
1608  // Check if the selected layer item has a color map item; in positive case, remove it from the layer item.
1609  te::qt::widgets::ColorMapItem* cmi = selectedLayerItem->findChild<te::qt::widgets::ColorMapItem*>();
1610 
1611  if(cmi)
1612  m_explorer->getExplorer()->remove(cmi);
1613 
1614  // Collapse the selected layer item to allow the new grouping item to be generated
1615  // in the next time the selected layer item is expanded.
1616  m_explorer->getExplorer()->collapse(selectedLayerItem);
1617 
1618  if(dlg.exec() == QDialog::Accepted)
1619  {
1620  // Expand the selected layer item and the grouping item
1621  m_explorer->getExplorer()->expand(selectedLayerItem);
1622 
1623  groupingItem = selectedLayerItem->findChild<te::qt::widgets::GroupingItem*>();
1624  if(groupingItem)
1625  m_explorer->getExplorer()->expand(groupingItem);
1626 
1627  cmi = selectedLayerItem->findChild<te::qt::widgets::ColorMapItem*>();
1628  if(cmi)
1629  m_explorer->getExplorer()->expand(cmi);
1630 
1631  m_display->getDisplay()->refresh();
1632 
1633  // Send out an event informing that the project is not saved
1634  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
1635  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
1636  }
1637  }
1638  catch(const std::exception& e)
1639  {
1640  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1641  }
1642 }
1643 
1645 {
1646  te::qt::widgets::SRSManagerDialog srsDialog(this);
1647  srsDialog.setWindowTitle(tr("Choose the SRS"));
1648 
1649  if(srsDialog.exec() == QDialog::Rejected)
1650  return;
1651 
1652  std::pair<int, std::string> srid = srsDialog.getSelectedSRS();
1653 
1654  te::qt::af::evt::MapSRIDChanged mapSRIDChagned(srid);
1655  ApplicationController::getInstance().broadcast(&mapSRIDChagned);
1656 
1657  m_display->getDisplay()->setSRID(srid.first);
1658 }
1659 
1661 {
1662  std::pair<int, std::string> srid = std::make_pair(TE_UNKNOWN_SRS, "");
1663  te::qt::af::evt::MapSRIDChanged mapSRIDChagned(srid);
1664  ApplicationController::getInstance().broadcast(&mapSRIDChagned);
1665 
1666  m_display->getDisplay()->setSRID(TE_UNKNOWN_SRS);
1667 }
1668 
1670 {
1673 
1674  m_display->draw(ApplicationController::getInstance().getProject()->getVisibleSingleLayers());
1675 }
1676 
1678 {
1679  try
1680  {
1681  std::list<te::map::AbstractLayerPtr> selectedLayers = m_explorer->getExplorer()->getSelectedSingleLayers();
1682 
1683  if(selectedLayers.empty())
1684  {
1685  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1686  tr("Select a layer in the layer explorer!"));
1687  return;
1688  }
1689  else
1690  {
1691  std::list<te::map::AbstractLayerPtr>::iterator it = selectedLayers.begin();
1692 
1693  while(it != selectedLayers.end())
1694  {
1695  if(!it->get()->isValid())
1696  {
1697  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1698  tr("There are invalid layers selected!"));
1699 
1700  return;
1701  }
1702 
1703  ++it;
1704  }
1705  }
1706 
1707  // The layer fitting will be accomplished only on the first layer selected
1708  te::map::AbstractLayerPtr selectedLayer = *(selectedLayers.begin());
1709 
1710  te::qt::widgets::MapDisplay* display = m_display->getDisplay();
1711 
1712  te::gm::Envelope env = selectedLayer->getExtent();
1713 
1714  if ((display->getSRID() == TE_UNKNOWN_SRS && selectedLayer->getSRID() == TE_UNKNOWN_SRS) || (display->getSRID() == selectedLayer->getSRID()))
1715  {
1716  display->setExtent(env, true);
1717  return;
1718  }
1719 
1720  if (display->getSRID() == TE_UNKNOWN_SRS && selectedLayer->getSRID() != TE_UNKNOWN_SRS)
1721  {
1722  display->setSRID(selectedLayer->getSRID());
1723  display->setExtent(env, true);
1724  return;
1725  }
1726 
1727  if(display->getSRID() == TE_UNKNOWN_SRS || selectedLayer->getSRID() == TE_UNKNOWN_SRS)
1728  {
1729  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1730  TE_TR("The spatial reference system of the map display and the layer are not compatible!"));
1731  return;
1732  }
1733 
1734  if (display->getSRID() != selectedLayer->getSRID())
1735  env.transform(selectedLayer->getSRID(), display->getSRID());
1736 
1737  display->setExtent(env, true);
1738  }
1739  catch(const std::exception& e)
1740  {
1741  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1742  }
1743 }
1744 
1746 {
1747  std::list<te::map::AbstractLayerPtr> selectedLayers = m_explorer->getExplorer()->getSelectedSingleLayers();
1748  if(selectedLayers.empty())
1749  {
1750  QString msg = tr("Select at least a layer to accomplish this operation!");
1751  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msg);
1752  return;
1753  }
1754  else
1755  {
1756  std::list<te::map::AbstractLayerPtr>::iterator it = selectedLayers.begin();
1757 
1758  while(it != selectedLayers.end())
1759  {
1760  if(!it->get()->isValid())
1761  {
1762  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1763  tr("There are invalid layers selected!"));
1764  return;
1765  }
1766 
1767  ++it;
1768  }
1769  }
1770 
1771  te::gm::Envelope finalEnv = te::map::GetSelectedExtent(selectedLayers, m_display->getDisplay()->getSRID(), false);
1772 
1773  if(!finalEnv.isValid())
1774  {
1775  QString msg = tr("Select object(s) in the selected layer(s) to accomplish this operation!");
1776  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msg);
1777  return;
1778  }
1779 
1780  m_display->getDisplay()->setExtent(finalEnv, true);
1781 }
1782 
1784 {
1785  std::list<te::map::AbstractLayerPtr> selectedLayers = m_explorer->getExplorer()->getSelectedSingleLayers();
1786  if(selectedLayers.empty())
1787  {
1788  QString msg = tr("Select at least a layer to accomplish this operation!");
1789  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msg);
1790  return;
1791  }
1792  else
1793  {
1794  std::list<te::map::AbstractLayerPtr>::iterator it = selectedLayers.begin();
1795 
1796  while(it != selectedLayers.end())
1797  {
1798  if(!it->get()->isValid())
1799  {
1800  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1801  tr("There are invalid layers selected!"));
1802  return;
1803  }
1804 
1805  ++it;
1806  }
1807  }
1808 
1809  te::map::MapDisplay* display = m_display->getDisplay();
1810 
1811  te::gm::Envelope selectedExtent = te::map::GetSelectedExtent(selectedLayers, display->getSRID(), true);
1812 
1813  te::gm::Coord2D centerOfSelectedExtent = selectedExtent.getCenter();
1814 
1815  te::gm::Envelope displayExtent = display->getExtent();
1816 
1817  double halfWidth = displayExtent.getWidth() * 0.5;
1818  double halfHeight = displayExtent.getHeight() * 0.5;
1819 
1820  te::gm::Envelope newExtent;
1821 
1822  newExtent.m_llx = centerOfSelectedExtent.x - halfWidth;
1823  newExtent.m_lly = centerOfSelectedExtent.y - halfHeight;
1824 
1825  newExtent.m_urx = centerOfSelectedExtent.x + halfWidth;
1826  newExtent.m_ury = centerOfSelectedExtent.y + halfHeight;
1827 
1828  display->setExtent(newExtent);
1829 }
1830 
1832 {
1833  std::list<te::map::AbstractLayerPtr> selectedLayers = m_explorer->getExplorer()->getSelectedSingleLayers();
1834 
1835  if(!selectedLayers.empty())
1836  {
1837  std::list<te::map::AbstractLayerPtr>::iterator it = selectedLayers.begin();
1838 
1839  m_compModeMenu->setLayer(*it);
1840  }
1841 }
1842 
1844 {
1845  std::list<te::map::AbstractLayerPtr> selectedLayers = m_explorer->getExplorer()->getSelectedSingleLayers();
1846 
1847  if(selectedLayers.empty())
1848  {
1849  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1850  tr("Select a layer in the layer explorer!"));
1851  return;
1852  }
1853  else
1854  {
1855  std::list<te::map::AbstractLayerPtr>::iterator it = selectedLayers.begin();
1856 
1857  while(it != selectedLayers.end())
1858  {
1859  if(!it->get()->isValid())
1860  {
1861  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1862  tr("There are invalid layers selected!"));
1863  return;
1864  }
1865 
1866  ++it;
1867  }
1868  }
1869 
1870  if(!m_queryDlg)
1871  {
1872  m_queryDlg = new te::qt::widgets::QueryDialog(this);
1873 
1874  connect(m_queryDlg, SIGNAL(highlightLayerObjects(const te::map::AbstractLayerPtr&, te::da::DataSet*, const QColor&)),
1875  SLOT(onHighlightLayerObjects(const te::map::AbstractLayerPtr&, te::da::DataSet*, const QColor&)));
1876 
1877  connect(m_queryDlg, SIGNAL(layerSelectedObjectsChanged(const te::map::AbstractLayerPtr&)),
1878  SLOT(onLayerSelectedObjectsChanged(const te::map::AbstractLayerPtr&)));
1879 
1880  if(m_iController)
1881  m_iController->addInterface(m_queryDlg);
1882  }
1883 
1884  if(m_project)
1885  {
1886  std::list<te::map::AbstractLayerPtr> allLayersList = ApplicationController::getInstance().getProject()->getSingleLayers(false);
1887  m_queryDlg->setLayerList(allLayersList);
1888  }
1889 
1890  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedSingleLayerItems();
1891 
1892  if(!selectedLayerItems.empty())
1893  {
1894  te::qt::widgets::AbstractTreeItem* selectedLayerItem = *(selectedLayerItems.begin());
1895  te::map::AbstractLayerPtr selectedLayer = selectedLayerItem->getLayer();
1896 
1897  m_queryDlg->setCurrentLayer(selectedLayer);
1898  }
1899 
1900  m_queryDlg->show();
1901 }
1902 
1904 {
1905  if(!checked)
1906  return;
1907 
1908  QCursor zoomAreaCursor(QIcon::fromTheme("zoom-in").pixmap(m_mapCursorSize));
1909 
1910  te::qt::widgets::ZoomArea* zoomArea = new te::qt::widgets::ZoomArea(m_display->getDisplay(), zoomAreaCursor);
1911  m_display->setCurrentTool(zoomArea);
1912 
1915 }
1916 
1918 {
1919  if(!checked)
1920  return;
1921 
1922  QCursor zoomOutCursor(QIcon::fromTheme("zoom-out").pixmap(m_mapCursorSize));
1923 
1924  te::qt::widgets::ZoomClick* zoomOut = new te::qt::widgets::ZoomClick(m_display->getDisplay(), zoomOutCursor, 2.0, te::qt::widgets::Zoom::Out);
1925  m_display->setCurrentTool(zoomOut);
1926 
1929 }
1930 
1932 {
1933  m_display->previousExtent();
1934 }
1935 
1937 {
1938  m_display->nextExtent();
1939 }
1940 
1942 {
1943  if(!checked)
1944  return;
1945 
1946  te::qt::widgets::Pan* pan = new te::qt::widgets::Pan(m_display->getDisplay(), Qt::OpenHandCursor, Qt::ClosedHandCursor);
1947  m_display->setCurrentTool(pan);
1948 
1951 }
1952 
1954 {
1955  if(!m_project && m_project->getTopLayers().empty())
1956  return;
1957 
1958  //m_display->fit(m_explorer->getExplorer()->getAllLayers());
1959  m_display->fit(te::qt::af::ApplicationController::getInstance().getProject()->getVisibleSingleLayers());
1960 
1961 }
1962 
1964 {
1965  if(!checked)
1966  return;
1967 
1968  QPixmap pxmap = QIcon::fromTheme("pointer-info").pixmap(m_mapCursorSize);
1969  QCursor infoCursor(pxmap, 0, 0);
1970 
1971  te::qt::widgets::Info* info = new te::qt::widgets::Info(m_display->getDisplay(), infoCursor, m_explorer->getExplorer()->getSelectedSingleLayers());
1972  m_display->setCurrentTool(info);
1973 
1974  connect(m_explorer->getExplorer(), SIGNAL(selectedLayersChanged(const std::list<te::map::AbstractLayerPtr>&)), info, SLOT(setLayers(const std::list<te::map::AbstractLayerPtr>&)));
1975 }
1976 
1978 {
1979  //std::list<te::map::AbstractLayerPtr> layers = m_explorer->getExplorer()->getAllLayers();
1980  std::list<te::map::AbstractLayerPtr> layers = te::qt::af::ApplicationController::getInstance().getProject()->getAllLayers(false);
1981  std::list<te::map::AbstractLayerPtr>::iterator it = layers.begin();
1982 
1983  while(it != layers.end())
1984  {
1985  te::map::AbstractLayerPtr layer = (*it);
1986 
1987  layer->clearSelected();
1988 
1989  ++it;
1990 
1993  }
1994 }
1995 
1997 {
1998  if(!checked)
1999  return;
2000 
2001  te::qt::widgets::Selection* selection = new te::qt::widgets::Selection(m_display->getDisplay(), Qt::ArrowCursor, m_explorer->getExplorer()->getSelectedSingleLayers());
2002  m_display->setCurrentTool(selection);
2003 
2004  connect(m_explorer->getExplorer(), SIGNAL(selectedLayersChanged(const std::list<te::map::AbstractLayerPtr>&)), selection, SLOT(setLayers(const std::list<te::map::AbstractLayerPtr>&)));
2005  connect(selection, SIGNAL(layerSelectedObjectsChanged(const te::map::AbstractLayerPtr&)), SLOT(onLayerSelectedObjectsChanged(const te::map::AbstractLayerPtr&)));
2006 
2009 }
2010 
2012 {
2013  if(!checked)
2014  return;
2015 
2016  QCursor measureDistanceCursor(QIcon::fromTheme("distance-measure-cursor").pixmap(m_mapCursorSize), 0, 0);
2017 
2018  te::qt::widgets::Measure* distance = new te::qt::widgets::Measure(m_display->getDisplay(), te::qt::widgets::Measure::Distance, measureDistanceCursor);
2019  m_display->setCurrentTool(distance);
2020 }
2021 
2023 {
2024  if(!checked)
2025  return;
2026 
2027  QCursor measureAreaCursor(QIcon::fromTheme("area-measure-cursor").pixmap(m_mapCursorSize), 0, 0);
2028 
2029  te::qt::widgets::Measure* area = new te::qt::widgets::Measure(m_display->getDisplay(), te::qt::widgets::Measure::Area, measureAreaCursor);
2030  m_display->setCurrentTool(area);
2031 }
2032 
2034 {
2035  if(!checked)
2036  return;
2037 
2038  QCursor measureAngleCursor(QIcon::fromTheme("angle-measure-cursor").pixmap(m_mapCursorSize), 0, 0);
2039 
2040  te::qt::widgets::Measure* angle = new te::qt::widgets::Measure(m_display->getDisplay(), te::qt::widgets::Measure::Angle,measureAngleCursor);
2041  m_display->setCurrentTool(angle);
2042 }
2043 
2045 {
2047 }
2048 
2050 {
2051  m_progressDockWidget->setVisible(true);
2052 }
2053 
2055 {
2056  std::vector<DataSetTableDockWidget*>::iterator it;
2057 
2058  for(it=m_tableDocks.begin(); it!=m_tableDocks.end(); ++it)
2059  if(*it == wid)
2060  break;
2061 
2062  if(it != m_tableDocks.end())
2063  m_tableDocks.erase(it);
2064 
2065  if(m_tableDocks.empty())
2066  {
2067  m_viewDataTable->setChecked(false);
2068  m_viewDataTable->setEnabled(false);
2069  }
2070 
2072 }
2073 
2075 {
2076  checked ? showFullScreen() : showMaximized();
2077 }
2078 
2080 {
2081  assert(layer.get());
2082 
2085 }
2086 
2088 {
2089  assert(layer.get());
2090  assert(dataset);
2091 
2092  te::qt::af::evt::HighlightLayerObjects e(layer, dataset, color);
2094 }
2095 
2097 {
2098  m_viewLayerExplorer->blockSignals(true);
2099  m_viewLayerExplorer->setChecked(visible);
2100  m_viewLayerExplorer->blockSignals(false);
2101 }
2102 
2104 {
2105  if(m_tableDocks.empty())
2106  return;
2107 
2108  for(std::size_t i = 0; i < m_tableDocks.size(); ++i)
2109  {
2110  if(visible)
2111  m_tableDocks[i]->show();
2112  else
2113  m_tableDocks[i]->hide();
2114  }
2115 
2116  m_viewDataTable->setChecked(visible);
2117 }
2118 
2120 {
2121  m_viewStyleExplorer->blockSignals(true);
2122  m_viewStyleExplorer->setChecked(visible);
2123  m_viewStyleExplorer->blockSignals(false);
2124 }
2125 
2127 {
2128  try
2129  {
2130  std::auto_ptr<te::qt::widgets::DataSourceExplorerDialog> dExplorer(new te::qt::widgets::DataSourceExplorerDialog(this));
2131 
2132  QString dsTypeSett = GetLastDatasourceFromSettings();
2133 
2134  if(!dsTypeSett.isNull() && !dsTypeSett.isEmpty())
2135  dExplorer->setDataSourceToUse(dsTypeSett);
2136 
2137 
2138  int retval = dExplorer->exec();
2139 
2140  if(retval == QDialog::Rejected)
2141  return;
2142 
2143  std::list<te::da::DataSourceInfoPtr> selectedDatasources = dExplorer->getSelecteds();
2144 
2145  if(selectedDatasources.empty())
2146  return;
2147 
2148  dExplorer.reset(0);
2149 
2150  const std::string& dsTypeId = selectedDatasources.front()->getType();
2151 
2152  SaveLastDatasourceOnSettings(dsTypeId.c_str());
2153  }
2154  catch(const std::exception& e)
2155  {
2156  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
2157  }
2158  catch(...)
2159  {
2160  QMessageBox::warning(this,
2162  tr("DataSetExplorer Error!"));
2163  }
2164 }
2165 
2167 {
2168  te::qt::af::evt::LayerAdded evt(layer);
2170 }
2171 
2172 //void te::qt::af::BaseApplication::onTrajectoryAnimationTriggered() // Lauro
2173 //{
2174 // std::list<te::map::AbstractLayerPtr> layers = m_explorer->getExplorer()->getSelectedSingleLayers();
2175 //
2176 // if(layers.empty())
2177 // {
2178 // QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no selected trajectory layer."));
2179 // return;
2180 // }
2181 //
2182 // std::list<te::map::AbstractLayerPtr>::iterator it = layers.begin();
2183 //
2184 // while(it != layers.end())
2185 // {
2186 // te::map::AbstractLayerPtr layer = (*it);
2187 // std::string type = layer->getType();
2188 // ++it;
2189 //
2190 // //te::qt::af::evt::LayerSelectedObjectsChanged e(layer);
2191 // //ApplicationController::getInstance().broadcast(&e);
2192 // }
2193 //}
2194 
2195 void te::qt::af::BaseApplication::openProject(const QString& projectFileName)
2196 {
2197  QApplication::setOverrideCursor(Qt::WaitCursor);
2198  try
2199  {
2200  if(checkProjectSave() == QMessageBox::Cancel)
2201  {
2202  QApplication::restoreOverrideCursor();
2203  return;
2204  }
2205 
2206  if(!boost::filesystem::exists(projectFileName.toStdString()))
2207  {
2208  QApplication::restoreOverrideCursor();
2209  QMessageBox::critical(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), (boost::format(TE_TR("This project could not be found: %1%.")) % projectFileName.toStdString()).str().c_str());
2210  return;
2211  }
2212 
2213  CloseAllTables(m_tableDocks);
2214 
2215  Project* nproject = te::qt::af::ReadProject(projectFileName.toStdString());
2216 
2217  delete m_project;
2218 
2219  m_project = nproject;
2220 
2221  // Set the project title and its status as "no changed"
2222  //std::string projectTitle = boost::filesystem::basename(m_project->getFileName()).c_str();
2223  //m_project->setTitle(projectTitle);
2224 
2225  m_project->setProjectAsChanged(false);
2226 
2227  ApplicationController::getInstance().updateRecentProjects(projectFileName, m_project->getTitle().c_str());
2228 
2229  // Set the window title
2230  setWindowTitle(te::qt::af::GetWindowTitle(*m_project));
2231 
2233 
2234  te::qt::af::evt::ProjectAdded evt(m_project);
2235 
2237  }
2238  catch(const te::common::Exception& e)
2239  {
2240  QApplication::restoreOverrideCursor();
2241  throw e;
2242  }
2243  catch(...)
2244  {
2245  QApplication::restoreOverrideCursor();
2246  QString msg(tr("Fail to open project: %1"));
2247 
2248  msg = msg.arg(projectFileName);
2249 
2250  throw Exception(TE_TR(msg.toStdString()));
2251  }
2252  QApplication::restoreOverrideCursor();
2253 }
2254 
2256 {
2257  if(m_project != 0 && m_project->hasChanged())
2258  {
2259  QString msg("The current project has unsaved changes. Do you want to save them?");
2260  QMessageBox::StandardButton btn = QMessageBox::question(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msg, QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save);
2261 
2262  if(btn == QMessageBox::Save)
2263  onSaveProjectTriggered();
2264 
2265  return btn;
2266  }
2267 
2268  return QMessageBox::NoButton;
2269 }
2270 
2272 {
2273  if(checkProjectSave() == QMessageBox::Cancel)
2274  return;
2275 
2276  CloseAllTables(m_tableDocks);
2277 
2278  delete m_project;
2279 
2280  m_project = new Project;
2281 
2282  QString author;
2283  int maxSaved;
2284 
2285  GetProjectInformationsFromSettings(author, maxSaved);
2286 
2287  m_project->setTitle(tr("New Project").toStdString());
2288 
2289  m_project->setAuthor(author.toStdString());
2290 
2291  // Set the window title
2292  setWindowTitle(te::qt::af::GetWindowTitle(*m_project));
2293 
2295 
2296  m_project->setProjectAsChanged(false);
2297 
2298  te::qt::af::evt::ProjectAdded evt(m_project);
2299 
2301 }
2302 
2304 {
2305  initActions();
2306 
2307  initMenus();
2308 
2309  initToolbars();
2310 
2311  initSlotsConnections();
2312 
2313  // Initializing well known widgets
2314 
2315  // 0. Composition Mode
2316  m_compModeMenu = new te::qt::widgets::CompositionModeMenuWidget();
2317  m_layerCompositionMode->setMenu(m_compModeMenu->getMenu());
2318 
2319  // 1. Layer Explorer
2320  QAction* act = new QAction(this);
2321  act->setSeparator(true);
2322 
2324  lexplorer->setObjectName("LayerExplorerDockWidget");
2325  te::qt::widgets::LayerTreeView* treeView = lexplorer->getTreeView();
2326  treeView->setAnimated(true);
2327 
2328  // **********************************************************************************************
2329  // Add the actions to the context menu of the tree view according to the number of selected items
2330  // **********************************************************************************************
2331 
2332  /****************** Actions to be added to the context menu when there is no item selected ******************/
2333 
2334  treeView->add(m_projectAddLayerMenu->menuAction(), "", "", te::qt::widgets::LayerTreeView::NO_ITEM_SELECTED);
2335 
2336  QAction* noItemSelectedSep = new QAction(this);
2337  noItemSelectedSep->setSeparator(true);
2338  treeView->add(noItemSelectedSep, "", "", te::qt::widgets::LayerTreeView::NO_ITEM_SELECTED);
2339 
2340  treeView->add(m_projectAddFolderLayer, "", "", te::qt::widgets::LayerTreeView::NO_ITEM_SELECTED);
2341 
2342  /****************** Actions to be added to the context menu when there is a unique item selected ******************/
2343 
2344  // Actions for the folder layer item
2345  treeView->add(m_projectAddLayerMenu->menuAction(), "", "FOLDER_LAYER_ITEM");
2346 
2347  QAction* folderSep1 = new QAction(this);
2348  folderSep1->setSeparator(true);
2349  treeView->add(folderSep1, "", "FOLDER_LAYER_ITEM");
2350 
2351  treeView->add(m_projectAddFolderLayer, "", "FOLDER_LAYER_ITEM");
2352 
2353  QAction* folderSep2 = new QAction(this);
2354  folderSep2->setSeparator(true);
2355  treeView->add(folderSep2, "", "FOLDER_LAYER_ITEM");
2356 
2357  treeView->add(m_projectRemoveLayer, "", "FOLDER_LAYER_ITEM");
2358  treeView->add(m_projectRenameLayer, "", "FOLDER_LAYER_ITEM");
2359 
2360  // Actions for the single layer item that is not a raster layer
2361  treeView->add(m_layerObjectGrouping);
2362  treeView->add(m_toolsDataExchangerDirectPopUp);
2363  treeView->add(m_layerChartsHistogram);
2364  treeView->add(m_layerChart);
2365  treeView->add(m_queryLayer);
2366  treeView->add(m_layerChartsScatter);
2367  treeView->add(m_layerLinkTable, "", "DATASET_LAYER_ITEM");
2368 
2369  QAction* actionChartSep = new QAction(this);
2370  actionChartSep->setSeparator(true);
2371  treeView->add(actionChartSep);
2372 
2373  treeView->add(m_layerShowTable);
2374  treeView->add(m_viewStyleExplorer);
2375 
2376  QAction* actionStyleSep = new QAction(this);
2377  actionStyleSep->setSeparator(true);
2378  treeView->add(actionStyleSep);
2379 
2380  treeView->add(m_layerRemoveObjectSelection);
2381  treeView->add(m_projectRemoveLayer);
2382  treeView->add(m_projectRenameLayer);
2383 
2384  QAction* actionRemoveSep = new QAction(this);
2385  actionRemoveSep->setSeparator(true);
2386  treeView->add(actionRemoveSep);
2387 
2388  treeView->add(m_layerFitOnMapDisplay);
2389  treeView->add(m_layerFitSelectedOnMapDisplay);
2390  treeView->add(m_layerPanToSelectedOnMapDisplay);
2391 
2392  QAction* actionFitSep = new QAction(this);
2393  actionFitSep->setSeparator(true);
2394  treeView->add(actionFitSep);
2395 
2396  treeView->add(m_layerSRS);
2397 
2398  QAction* actionSRSSep = new QAction(this);
2399  actionSRSSep->setSeparator(true);
2400  treeView->add(actionSRSSep);
2401 
2402  treeView->add(m_layerCompositionMode);
2403  treeView->add(m_layerProperties);
2404 
2405  // Actions for the items of a layer item such as the chart item and the grouping item
2406  treeView->add(m_layerRemoveItem, "", "ITEM_OF_LAYER");
2407 
2408  // Actions for the raster layer item
2409  treeView->add(m_layerObjectGrouping, "", "RASTER_LAYER_ITEM");
2410  treeView->add(m_layerChartsHistogram, "", "RASTER_LAYER_ITEM");
2411  treeView->add(m_layerChartsScatter, "", "RASTER_LAYER_ITEM");
2412 
2413  QAction* rasterSep1 = new QAction(this);
2414  rasterSep1->setSeparator(true);
2415  treeView->add(rasterSep1, "", "RASTER_LAYER_ITEM");
2416 
2417  treeView->add(m_viewStyleExplorer, "", "RASTER_LAYER_ITEM");
2418 
2419  QAction* rasterSep2 = new QAction(this);
2420  rasterSep2->setSeparator(true);
2421  treeView->add(rasterSep2, "", "RASTER_LAYER_ITEM");
2422 
2423  treeView->add(m_projectRemoveLayer, "", "RASTER_LAYER_ITEM");
2424  treeView->add(m_projectRenameLayer, "", "RASTER_LAYER_ITEM");
2425 
2426  QAction* rasterSep3 = new QAction(this);
2427  rasterSep3->setSeparator(true);
2428  treeView->add(rasterSep3, "", "RASTER_LAYER_ITEM");
2429 
2430  treeView->add(m_layerFitOnMapDisplay, "", "RASTER_LAYER_ITEM");
2431 
2432  QAction* rasterSep4 = new QAction(this);
2433  rasterSep4->setSeparator(true);
2434  treeView->add(rasterSep4, "", "RASTER_LAYER_ITEM");
2435 
2436  treeView->add(m_layerSRS, "", "RASTER_LAYER_ITEM");
2437 
2438  QAction* rasterSep5 = new QAction(this);
2439  rasterSep5->setSeparator(true);
2440  treeView->add(rasterSep5, "", "RASTER_LAYER_ITEM");
2441 
2442  treeView->add(m_layerCompositionMode, "", "RASTER_LAYER_ITEM");
2443  treeView->add(m_layerProperties, "", "RASTER_LAYER_ITEM");
2444 
2445  // Actions for invalid layers
2446 
2447  treeView->add(m_projectChangeLayerDataSource, "", "INVALID_LAYER_ITEM");
2448  treeView->add(m_projectUpdateLayerDataSource, "", "INVALID_LAYER_ITEM");
2449  treeView->add(m_projectRemoveLayer, "", "INVALID_LAYER_ITEM");
2450 
2451  /********* Actions to be added to the context menu when there are multiple items selected ***********/
2452 
2453  treeView->add(m_layerFitSelectedOnMapDisplay, "", "DATASET_LAYER_ITEM", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
2454  treeView->add(m_layerPanToSelectedOnMapDisplay, "", "DATASET_LAYER_ITEM", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
2455 
2456  treeView->add(m_layerFitSelectedOnMapDisplay, "", "QUERY_LAYER_ITEM", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
2457  treeView->add(m_layerPanToSelectedOnMapDisplay, "", "QUERY_LAYER_ITEM", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
2458 
2459  QAction* multipleSelectedSep = new QAction(this);
2460  multipleSelectedSep->setSeparator(true);
2461  treeView->add(multipleSelectedSep, "", "", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
2462 
2463  treeView->add(m_projectRemoveLayer, "", "", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
2464 
2465  // ********** End the actions to be added to the context menu ********
2466 
2467  QMainWindow::addDockWidget(Qt::LeftDockWidgetArea, lexplorer);
2468 
2469  connect(m_viewLayerExplorer, SIGNAL(toggled(bool)), lexplorer, SLOT(setVisible(bool)));
2470  m_viewLayerExplorer->setChecked(true);
2471  connect(lexplorer, SIGNAL(visibilityChanged(bool)), this, SLOT(onLayerExplorerVisibilityChanged(bool)));
2472 
2473  m_explorer = new te::qt::af::LayerExplorer(lexplorer, this);
2474 
2475 // 2. Map Display
2476  te::qt::widgets::MapDisplay* map = new te::qt::widgets::MultiThreadMapDisplay(QSize(512, 512),true, this);
2477  //te::qt::widgets::MapDisplay* map = new te::qt::widgets::MapDisplay(QSize(512, 512),this);
2479  m_display = new te::qt::af::MapDisplay(map);
2480 
2481  QMainWindow::setCentralWidget(map);
2482 
2483  connect(m_display, SIGNAL(hasPreviousExtent(bool)), m_mapPreviousExtent, SLOT(setEnabled(bool)));
2484  connect(m_display, SIGNAL(hasNextExtent(bool)), m_mapNextExtent, SLOT(setEnabled(bool)));
2485 
2486 // 3. Symbolizer Explorer
2487  te::qt::widgets::StyleDockWidget* stylelDock = new te::qt::widgets::StyleDockWidget(tr("Style Explorer"), this);
2488  stylelDock->setObjectName("StyleDockWidget");
2489  QMainWindow::addDockWidget(Qt::RightDockWidgetArea, stylelDock);
2490  stylelDock->connect(m_viewStyleExplorer, SIGNAL(toggled(bool)), SLOT(setVisible(bool)));
2491  m_viewStyleExplorer->setChecked(false);
2492  stylelDock->setVisible(false);
2493  connect(stylelDock, SIGNAL(visibilityChanged(bool)), this, SLOT(onStyleExplorerVisibilityChanged(bool)));
2494  connect(stylelDock, SIGNAL(repaintMapDisplay()), this, SLOT(onDrawTriggered()));
2495 
2496  m_styleExplorer = new te::qt::af::StyleExplorer(stylelDock, this);
2497 
2498  initStatusBar();
2499 
2500 // 4. Interface Controller
2501  m_iController = new te::qt::af::InterfaceController(this);
2502 
2503 
2504 // 3. Data Table
2505 // te::qt::widgets::TabularViewer* view = new te::qt::widgets::TabularViewer(this);
2506 
2507  // m_viewer = new te::qt::af::TabularViewer(view);
2508 
2509 // registering framework listeners
2515  //te::qt::af::ApplicationController::getInstance().addListener(m_viewer);
2516 
2517 // initializing connector widgets
2518  // View Data Table
2519  connect(m_viewDataTable, SIGNAL(toggled(bool)), this, SLOT(onDisplayDataTableChanged(bool)));
2520 
2521 /* doc = new QDockWidget(tr("Data Table"), this);
2522  doc->setWidget(view);
2523  QMainWindow::addDockWidget(Qt::BottomDockWidgetArea, doc);
2524  doc->connect(m_viewDataTable, SIGNAL(toggled(bool)), SLOT(setVisible(bool)));
2525  m_viewDataTable->setChecked(false);
2526  doc->setVisible(false);
2527 */
2528 
2529 // Progress support
2531  pvb->setFixedWidth(220);
2533 
2536 
2537  m_statusbar->addPermanentWidget(pvb);
2538 
2539  connect(pvb, SIGNAL(clicked()), this, SLOT(showProgressDockWidget()));
2540 
2541  m_progressDockWidget = new QDockWidget(this);
2542  m_progressDockWidget->setObjectName("ProgressDockWidget");
2543  m_progressDockWidget->setWidget(pvw);
2544  m_progressDockWidget->setMinimumHeight(300);
2545  m_progressDockWidget->setAllowedAreas(Qt::RightDockWidgetArea);
2546  m_progressDockWidget->setWindowTitle(tr("Tasks Progress"));
2547  addDockWidget(Qt::RightDockWidgetArea, m_progressDockWidget);
2548  m_progressDockWidget->setVisible(false);
2549 }
2550 
2552 {
2553  if(checkProjectSave() == QMessageBox::Cancel)
2554  {
2555  e->ignore();
2556  return;
2557  }
2558 
2559  emit applicationClose(); // it is used to close the ST animation
2560 
2561  e->accept();
2562 }
2563 
2564 void te::qt::af::BaseApplication::initAction(QAction*& act, const QString& icon, const QString& name,
2565  const QString& text, const QString& tooltip,
2566  bool iconVisibleInMenu, bool isCheckable,
2567  bool enabled, QObject* parent)
2568 {
2569  act = new QAction (parent);
2570 
2571  if(!icon.isEmpty())
2572  act->setIcon(QIcon::fromTheme(icon));
2573 
2574  act->setObjectName(name);
2575  act->setText(text);
2576  act->setIconVisibleInMenu(iconVisibleInMenu);
2577  act->setCheckable(isCheckable);
2578  act->setEnabled(enabled);
2579 
2580 #ifndef QT_NO_TOOLTIP
2581  act->setToolTip(tooltip);
2582 #endif
2583 }
2584 
2586 {
2587 // Menu -View- actions
2588  initAction(m_viewLayerExplorer, "view-layer-explorer", "View.Layer Explorer", tr("&Layer Explorer"), tr("Show or hide the layer explorer"), true, true, true, m_menubar);
2589  initAction(m_viewDataTable, "view-data-table", "View.Data Table", tr("&Data Table"), tr("Show or hide the data table"), true, true, true, m_menubar);
2590  initAction(m_viewStyleExplorer, "style", "View.Style Explorer", tr("&Style Explorer"), tr("Show or hide the style explorer"), true, true, true, m_menubar);
2591  initAction(m_viewFullScreen, "view-fullscreen", "View.Full Screen", tr("F&ull Screen"), tr(""), true, true, true, m_menubar);
2592  //initAction(m_viewRefresh, "view-refresh", "View.Refresh", tr("&Refresh"), tr(""), true, false, false, m_menubar); TODO
2593  //initAction(m_viewToolBars, "", "Toolbars", tr("&Toolbars"), tr(""), true, false, false);
2594  //initAction(m_viewGrid, "view-grid", "View.Grid", tr("&Grid"), tr("Show or hide the geographic grid"), true, true, false, m_menubar); TODO
2595 
2596 // Menu -Tools- actions
2597  initAction(m_toolsCustomize, "preferences-system", "Tools.Customize", tr("&Customize..."), tr("Customize the system preferences"), true, false, true, m_menubar);
2598  initAction(m_toolsDataExchanger, "datasource-exchanger", "Tools.Exchanger.All to All", tr("&Advanced..."), tr("Exchange data sets between data sources"), true, false, true, m_menubar);
2599  initAction(m_toolsDataExchangerDirect, "data-exchange-direct-icon", "Tools.Exchanger.Direct", tr("&Layer..."), tr("Exchange data sets from layers"), true, false, true, m_menubar);
2600  initAction(m_toolsDataExchangerDirectPopUp, "data-exchange-direct-icon", "Tools.Exchanger.Direct", tr("&Exchange..."), tr("Exchange data sets from layers"), true, false, true, m_menubar);
2601  initAction(m_toolsDataSourceExplorer, "datasource-explorer", "Tools.Data Source Explorer", tr("&Data Source Explorer..."), tr("Show or hide the data source explorer"),
2602  true, false, true, m_menubar);
2603  initAction(m_toolsQueryDataSource, "datasource-query", "Tools.Query Data Source", tr("&Query Data Source..."), tr("Allows you to query data in a data source"), true, false, true, m_menubar);
2604  initAction(m_toolsRasterMultiResolution, "raster-multiresolution-icon", "Tools.Raster Multi Resolution", tr("&Raster Multi Resolution..."), tr("Creates multi resolution over a raster..."), true, false, true, m_menubar);
2605  //initAction(m_toolsFixGeometry, "fixgeom-icon", "Tools.Fix Geometry", tr("&Fix Geometry..."), tr("Fix geometry..."), true, false, true, m_menubar);
2606 
2607 
2608 // Menu -Edit- actions
2609  //initAction(m_editUndo, "edit-undo", "Undo", tr("&Undo"), tr("Undo the last operation"), true, false, false);
2610  //initAction(m_editRedo, "edit-redo", "Redo", tr("&Redo"), tr("Redo the last operation"), true, false, false);
2611  //initAction(m_editCut, "edit-cut", "Cut", tr("Cu&t"), tr(""), true, true, false);
2612  //initAction(m_editCopy, "edit-copy", "Copy", tr("&Copy"), tr(""), true, true, false);
2613  //initAction(m_editPaste, "edit-paste", "&Paste", tr("&Paste"), tr(""), true, true, false);
2614  //initAction(m_editSelectAll, "edit-select-all", "Select All", tr("Select &All"), tr(""), true, true, false);
2615  //initAction(m_editClear, "edit-clear", "Clear", tr("C&lear"), tr(""), true, true, false);
2616  //initAction(m_editFind, "edit-find", "Find", tr("&Find..."), tr(""), true, true, false);
2617  //initAction(m_editReplace, "edit-find-replace", "Replace", tr("R&eplace..."), tr(""), true, true, false);
2618 
2619 // Menu -Plugins- actions
2620  initAction(m_pluginsManager, "plugin", "Plugins.Management", tr("&Manage Plugins..."), tr("Manage the application plugins"), true, false, true, m_menubar);
2621 
2622 // Menu -Help- actions
2623  initAction(m_helpContents, "help-browser", "Help.View Help", tr("&View Help..."), tr("Shows help dialog"), true, false, true, m_menubar);
2624  //initAction(m_helpUpdate, "system-software-update", "Help.Update", tr("&Update..."), tr(""), true, false, false, m_menubar); TODO
2625  initAction(m_helpAbout, "help-about-browser", "Help.About", tr("&About..."), tr(""), true, false, false, m_menubar);
2626 
2627 // Menu -Project- actions
2628  initAction(m_projectAddLayerDataset, "datasource", "Project.Add Layer.All Sources", tr("&From Data Source..."), tr("Add a new layer from all available data sources"), true, false, true, m_menubar);
2629  initAction(m_projectAddFolderLayer, "folderlayer-new", "Project.New Folder Layer", tr("Add &Folder Layer..."), tr("Add a new folder layer"), true, false, true, m_menubar);
2630  initAction(m_projectAddLayerQueryDataSet, "view-filter", "Project.Add Layer.Query Dataset", tr("&Query Dataset..."), tr("Add a new layer from a queried dataset"), true, false, true, m_menubar);
2631  initAction(m_projectAddLayerTabularDataSet, "view-data-table", "Project.Add Layer.Tabular File", tr("&Tabular File..."), tr("Add a new layer from a Tabular file"), true, false, true, m_menubar);
2632  initAction(m_projectRemoveLayer, "layer-remove", "Project.Remove Layer", tr("&Remove Layer(s)"), tr("Remove layer(s) from the project"), true, false, true, this);
2633  initAction(m_projectRenameLayer, "layer-rename", "Project.Rename Layer", tr("Rename Layer..."), tr("Rename layer"), true, false, true, this);
2634  initAction(m_projectChangeLayerDataSource, "", "Project.Change Layer Data Source", tr("&Change Layer Data Source"), tr("Chanage layer Data Source"), true, false, true, this);
2635  initAction(m_projectUpdateLayerDataSource, "", "Project.Update Layer Data Source", tr("&Update Layer Data Source"), tr("Update layer Data Source"), true, false, true, this);
2636  initAction(m_projectProperties, "document-info", "Project.Properties", tr("&Properties..."), tr("Show the project properties"), true, false, true, m_menubar);
2637  //initAction(m_projectAddLayerGraph, "", "Graph", tr("&Graph"), tr("Add a new layer from a graph"), true, false, false);
2638 
2639 // Menu -Layer- actions
2640  initAction(m_layerRemoveObjectSelection, "pointer-remove-selection", "Layer.Remove Selection", tr("&Remove Selection"), tr(""), true, false, true, m_menubar);
2641  initAction(m_layerRemoveItem, "item-remove", "Layer.Remove Item", tr("&Remove Item"), tr(""), true, false, true, m_menubar);
2642  initAction(m_layerObjectGrouping, "grouping", "Layer.ObjectGrouping", tr("&Classification..."), tr(""), true, false, true, m_menubar);
2643  initAction(m_layerProperties, "layer-info", "Layer.Properties", tr("&Properties..."), tr(""), true, false, true, m_menubar);
2644  initAction(m_layerSRS, "layer-srs", "Layer.SRS", tr("&Inform SRS..."), tr(""), true, false, true, m_menubar);
2645  initAction(m_layerShowTable, "view-data-table", "Layer.Show Table", tr("S&how Table"), tr(""), true, false, true, m_menubar);
2646  initAction(m_layerChartsHistogram, "chart-bar", "Layer.Charts.Histogram", tr("&Histogram..."), tr(""), true, false, true, m_menubar);
2647  initAction(m_layerChartsScatter, "chart-scatter", "Layer.Charts.Scatter", tr("&Scatter..."), tr(""), true, false, true, m_menubar);
2648  initAction(m_layerChart, "chart-pie", "Layer.Charts.Chart", tr("&Pie/Bar Chart..."), tr(""), true, false, true, m_menubar);
2649  initAction(m_layerFitOnMapDisplay, "layer-fit", "Layer.Fit Layer on the Map Display", tr("Fit Layer"), tr("Fit the current layer on the Map Display"), true, false, true, m_menubar);
2650  initAction(m_layerFitSelectedOnMapDisplay, "zoom-selected-extent", "Layer.Fit Selected Features on the Map Display", tr("Fit Selected Features"), tr("Fit the selected features on the Map Display"), true, false, true, m_menubar);
2651  initAction(m_layerPanToSelectedOnMapDisplay, "pan-selected", "Layer.Pan to Selected Features on Map Display", tr("Pan to Selected Features"), tr("Pan to the selected features on the Map Display"), true, false, true, m_menubar);
2652  initAction(m_queryLayer, "view-filter", "Layer.Query", tr("Query..."), tr(""), true, false, true, m_menubar);
2653  initAction(m_layerLinkTable, "layer-link", "Layer.Link", tr("&Link..."), tr(""), true, false, true, m_menubar);
2654  initAction(m_layerCompositionMode, "layer-compose", "Layer.Composition Mode", tr("&Composition Mode..."), tr("Set the composition mode to renderer the selected layer"), true, false, true, m_menubar);
2655 
2656 // Menu -File- actions
2657  initAction(m_fileNewProject, "document-new", "File.New Project", tr("&New Project..."), tr(""), true, false, true, m_menubar);
2658  initAction(m_fileSaveProject, "document-save", "File.Save Project", tr("&Save Project"), tr(""), true, false, true, m_menubar);
2659  initAction(m_fileSaveProjectAs, "document-save-as", "File.Save Project As", tr("Save Project &As..."), tr(""), true, false, false, m_menubar);
2660  initAction(m_fileOpenProject, "document-open", "File.Open Project", tr("&Open Project..."), tr(""), true, false, true, m_menubar);
2661  initAction(m_fileRestartSystem, "", "File.Restart System", tr("&Restart System..."), tr("Restart the system."), true, false, true, m_menubar);
2662  initAction(m_fileExit, "system-log-out", "File.Exit", tr("E&xit"), tr(""), true, false, true, m_menubar);
2663  initAction(m_filePrintPreview, "document-print-preview", "File.Print Preview", tr("Print Pre&view..."), tr(""), true, false, false, m_menubar);
2664  initAction(m_filePrint, "document-print", "File.Print", tr("&Print..."), tr(""), true, false, false, m_menubar);
2665 
2666 // Menu -Map- actions
2667  initAction(m_mapSRID, "srs", "Map.SRID", tr("&SRS..."), tr("Config the Map SRS"), true, false, true, m_menubar);
2668  initAction(m_mapUnknownSRID, "srs-unknown", "Map.UnknownSRID", tr("&Set Unknown SRS"), tr("Set the Map SRS to unknown"), true, false, true, m_menubar);
2669  initAction(m_mapDraw, "map-draw", "Map.Draw", tr("&Draw"), tr("Draw the visible layers"), true, false, true, m_menubar);
2670  initAction(m_mapZoomIn, "zoom-in", "Map.Zoom In", tr("Zoom &In"), tr(""), true, true, true, m_menubar);
2671  initAction(m_mapZoomOut, "zoom-out", "Map.Zoom Out", tr("Zoom &Out"), tr(""), true, true, true, m_menubar);
2672  initAction(m_mapPan, "pan", "Map.Pan", tr("&Pan"), tr(""), true, true, true, m_menubar);
2673  initAction(m_mapZoomExtent, "zoom-extent", "Map.Zoom Extent", tr("Zoom &Extent"), tr(""), true, false, true, m_menubar);
2674  initAction(m_mapPreviousExtent, "edit-undo", "Map.Previous Extent", tr("&Previous Extent"), tr(""), true, false, false, m_menubar);
2675  initAction(m_mapNextExtent, "edit-redo", "Map.Next Extent", tr("&Next Extent"), tr(""), true, false, false, m_menubar);
2676  initAction(m_mapInfo, "pointer-info", "Map.Info", tr("&Info"), tr(""), true, true, true, m_menubar);
2677  initAction(m_mapRemoveSelection, "pointer-remove-selection", "Map.Remove Selection", tr("&Remove Selection"), tr(""), true, false, true, m_menubar);
2678  initAction(m_mapSelection, "pointer-selection", "Map.Selection", tr("&Selection"), tr(""), true, true, true, m_menubar);
2679  initAction(m_mapMeasureDistance, "distance-measure", "Map.Measure Distance", tr("Measure &Distance"), tr(""), true, true, true, m_menubar);
2680  initAction(m_mapMeasureArea, "area-measure", "Map.Measure Area", tr("Measure &Area"), tr(""), true, true, true, m_menubar);
2681  initAction(m_mapMeasureAngle, "angle-measure", "Map.Measure Angle", tr("Measure &Angle"), tr(""), true, true, true, m_menubar);
2682  initAction(m_mapStopDrawing, "map-draw-cancel", "Map.Stop Drawing", tr("&Stop Drawing"), tr("Stop all drawing tasks"), true, false, true, m_menubar);
2683 }
2684 
2686 {
2687 // Making menus
2688  m_menubar->setObjectName("menubar");
2689  m_menubar->setGeometry(QRect(0, 0, 640, 21));
2690 
2691 // File menu
2692  m_fileMenu->setObjectName("File");
2693  m_fileMenu->setTitle(tr("&File"));
2694 
2695  m_recentProjectsMenu->setObjectName("File.Recent Projects");
2696  m_recentProjectsMenu->setTitle(tr("Recent &Projects"));
2697 
2698  m_fileMenu->addAction(m_fileNewProject);
2699  m_fileMenu->addAction(m_fileOpenProject);
2700  m_fileMenu->addAction(m_fileSaveProject);
2701  m_fileMenu->addAction(m_fileSaveProjectAs);
2702  m_fileMenu->addSeparator();
2703  m_fileMenu->addMenu(m_recentProjectsMenu);
2704  m_recentProjectsMenu->setEnabled(false);
2705  m_fileMenu->addSeparator();
2706  m_fileMenu->addAction(m_filePrintPreview);
2707  m_fileMenu->addAction(m_filePrint);
2708  m_fileMenu->addSeparator();
2709  m_fileMenu->addAction(m_fileRestartSystem);
2710 
2711 #if TE_PLATFORM != TE_PLATFORMCODE_APPLE
2712  m_fileMenu->addSeparator();
2713 #endif
2714 
2715  m_fileMenu->addAction(m_fileExit);
2716 
2717 // Edit menu
2718  //m_editMenu = new QMenu(m_menubar);
2719  //m_editMenu->setObjectName("Edit");
2720  //m_editMenu->setTitle(tr("&Edit"));
2721 
2722  //m_menubar->addAction(m_editMenu->menuAction());
2723 
2724  //m_editMenu->addAction(m_editUndo);
2725  //m_editMenu->addAction(m_editRedo);
2726  //m_editMenu->addSeparator();
2727  //m_editMenu->addAction(m_editCut);
2728  //m_editMenu->addAction(m_editCopy);
2729  //m_editMenu->addAction(m_editPaste);
2730  //m_editMenu->addSeparator();
2731  //m_editMenu->addAction(m_editSelectAll);
2732  //m_editMenu->addAction(m_editClear);
2733  //m_editMenu->addSeparator();
2734  //m_editMenu->addAction(m_editFind);
2735  //m_editMenu->addAction(m_editReplace);
2736 
2737 // View menu
2738  m_viewMenu->setObjectName("View");
2739  m_viewMenu->setTitle(tr("&View"));
2740 
2741  m_viewToolBarsMenu->setObjectName("View.Toolbars");
2742  m_viewToolBarsMenu->setTitle(tr("&Toolbars"));
2743 
2744  //m_viewMenu->addAction(m_viewToolBars);
2745  m_viewMenu->addAction(m_viewDataTable);
2746  m_viewMenu->addAction(m_viewLayerExplorer);
2747  m_viewMenu->addAction(m_viewStyleExplorer);
2748  //m_viewMenu->addAction(m_viewGrid); TODO
2749  m_viewMenu->addSeparator();
2750  m_viewMenu->addAction(m_viewFullScreen);
2751  m_viewMenu->addSeparator();
2752  m_viewMenu->addMenu(m_viewToolBarsMenu);
2753  //m_viewMenu->addAction(m_viewRefresh); TODO
2754 
2755 // Project menu
2756  m_projectMenu->setObjectName("Project");
2757  m_projectMenu->setTitle(tr("&Project"));
2758 
2759  //m_projectMenu->addAction(m_projectAddLayerMenu->menuAction());
2760  m_projectAddLayerMenu->setObjectName("Project.Add Layer");
2761  m_projectAddLayerMenu->setTitle(tr("&Add Layer"));
2762  m_projectAddLayerMenu->setIcon(QIcon::fromTheme("layer-add"));
2763  m_projectAddLayerMenu->addAction(m_projectAddLayerTabularDataSet);
2764  m_projectAddLayerMenu->addAction(m_projectAddLayerDataset);
2765  m_projectAddLayerMenu->addSeparator();
2766  m_projectAddLayerMenu->addAction(m_projectAddLayerQueryDataSet);
2767  m_projectAddLayerMenu->addSeparator();
2768  m_projectMenu->addAction(m_projectAddFolderLayer);
2769  m_projectMenu->addSeparator();
2770  m_projectMenu->addAction(m_projectRemoveLayer);
2771  m_projectMenu->addAction(m_projectRenameLayer);
2772  m_projectMenu->addSeparator();
2773  m_projectMenu->addAction(m_projectProperties);
2774 
2775  m_layerMenu->setObjectName("Layer");
2776  m_layerMenu->setTitle(tr("&Layer"));
2777 
2778  m_layerMenu->addAction(m_layerObjectGrouping);
2779  m_layerMenu->addAction(m_layerChartsHistogram);
2780  m_layerMenu->addAction(m_layerChart);
2781  m_layerMenu->addAction(m_queryLayer);
2782  m_layerMenu->addAction(m_layerChartsScatter);
2783  m_layerMenu->addSeparator();
2784  m_layerMenu->addAction(m_layerFitOnMapDisplay);
2785  m_layerMenu->addAction(m_layerFitSelectedOnMapDisplay);
2786  m_layerMenu->addAction(m_layerPanToSelectedOnMapDisplay);
2787  m_layerMenu->addSeparator();
2788  m_layerMenu->addAction(m_layerShowTable);
2789  m_layerMenu->addAction(m_viewStyleExplorer);
2790  m_layerMenu->addSeparator();
2791  m_layerMenu->addAction(m_layerRemoveObjectSelection);
2792  m_layerMenu->addSeparator();
2793  m_layerMenu->addAction(m_layerSRS);
2794  m_layerMenu->addSeparator();
2795  m_layerMenu->addAction(m_layerProperties);
2796 
2797  // TODO
2798  //m_layerMenu->addAction(m_layerRaise);
2799  //m_layerMenu->addAction(m_layerLower);
2800  //m_layerMenu->addAction(m_layerToTop);
2801  //m_layerMenu->addAction(m_layerToBottom);
2802 
2803 // Map Menu
2804  m_mapMenu->setObjectName("Map");
2805  m_mapMenu->setTitle(tr("&Map"));
2806 
2807  m_mapMenu->addAction(m_mapDraw);
2808  m_mapMenu->addAction(m_mapStopDrawing);
2809  m_mapMenu->addSeparator();
2810  m_mapMenu->addAction(m_mapInfo);
2811  m_mapMenu->addAction(m_mapRemoveSelection);
2812  m_mapMenu->addAction(m_mapSelection);
2813  m_mapMenu->addSeparator();
2814  m_mapMenu->addAction(m_mapPan);
2815  m_mapMenu->addAction(m_mapZoomExtent);
2816  m_mapMenu->addAction(m_mapZoomIn);
2817  m_mapMenu->addAction(m_mapZoomOut);
2818  m_mapMenu->addSeparator();
2819  m_mapMenu->addAction(m_mapNextExtent);
2820  m_mapMenu->addAction(m_mapPreviousExtent);
2821  m_mapMenu->addSeparator();
2822  m_mapMenu->addAction(m_mapMeasureAngle);
2823  m_mapMenu->addAction(m_mapMeasureArea);
2824  m_mapMenu->addAction(m_mapMeasureDistance);
2825  m_mapMenu->addSeparator();
2826  m_mapMenu->addAction(m_mapSRID);
2827  m_mapMenu->addAction(m_mapUnknownSRID);
2828 
2829  // Group the map tools
2830  QActionGroup* mapToolsGroup = new QActionGroup(m_mapMenu);
2831  mapToolsGroup->setObjectName("Map.ToolsGroup");
2832  mapToolsGroup->addAction(m_mapZoomIn);
2833  mapToolsGroup->addAction(m_mapZoomOut);
2834  mapToolsGroup->addAction(m_mapPan);
2835  mapToolsGroup->addAction(m_mapMeasureDistance);
2836  mapToolsGroup->addAction(m_mapMeasureArea);
2837  mapToolsGroup->addAction(m_mapMeasureAngle);
2838  mapToolsGroup->addAction(m_mapInfo);
2839  mapToolsGroup->addAction(m_mapSelection);
2840  mapToolsGroup->addAction(m_mapRemoveSelection);
2841 
2843 
2844 // Tools menu
2845  m_toolsMenu->setObjectName("Tools");
2846  m_toolsMenu->setTitle(tr("&Tools"));
2847 
2848 // m_toolsMenu->addAction(m_toolbarsManagement);
2849 // m_toolsMenu->addSeparator();
2850  m_toolsExchangerMenu->setObjectName("Tools.Exchanger");
2851  m_toolsExchangerMenu->setTitle(tr("&Data Exchanger"));
2852  m_toolsExchangerMenu->setIcon(QIcon::fromTheme("datasource-exchanger"));
2853  m_toolsExchangerMenu->addAction(m_toolsDataExchangerDirect);
2854  m_toolsExchangerMenu->addAction(m_toolsDataExchanger);
2855 
2856  m_toolsMenu->addAction(m_toolsDataSourceExplorer);
2857  m_toolsMenu->addAction(m_toolsQueryDataSource);
2858  m_toolsMenu->addSeparator();
2859  m_toolsMenu->addAction(m_toolsRasterMultiResolution);
2860  //m_toolsMenu->addAction(m_toolsFixGeometry);
2861  m_toolsMenu->addSeparator();
2862  m_toolsMenu->addAction(m_toolsCustomize);
2863 
2864 // Plugins menu
2865  m_pluginsMenu->setObjectName("Plugins");
2866  m_pluginsMenu->setTitle(tr("Pl&ugins"));
2867 
2868  m_pluginsMenu->addSeparator()->setObjectName("ManagePluginsSeparator");
2869  m_pluginsMenu->addAction(m_pluginsManager);
2870 
2871 // Help menu
2872  m_helpMenu->setObjectName("Help");
2873  m_helpMenu->setTitle(tr("&Help"));
2874 
2875  m_helpMenu->addAction(m_helpContents);
2876  //m_helpMenu->addAction(m_helpUpdate); TODO
2877 
2878 // Sets the toolbar
2879  setMenuBar(m_menubar);
2880 
2881  //! Register menu bar
2883 }
2884 
2886 {
2887  // Status Bar
2888  m_statusbar = new QStatusBar(this);
2889  m_statusbar->setObjectName("StatusBar");
2890  setStatusBar(m_statusbar);
2891 
2892  std::vector<QToolBar*> bars = ReadToolBarsFromSettings(this);
2893  std::vector<QToolBar*>::iterator it;
2894 
2895  for(it=bars.begin(); it!=bars.end(); ++it)
2896  {
2897  QToolBar* bar = *it;
2898  addToolBar(Qt::TopToolBarArea, bar);
2899  m_viewToolBarsMenu->addAction(bar->toggleViewAction());
2900  ApplicationController::getInstance().registerToolBar(bar->objectName(), bar);
2901  }
2902 }
2903 
2905 {
2906  // Selected status
2907  m_selected = new QLabel(m_statusbar);
2908  m_selected->setText(tr("Selected rows: 0"));
2909  m_statusbar->addPermanentWidget(m_selected);
2910 
2911  // Map SRID reset action
2912  QToolButton* mapUnknownSRIDToolButton = new QToolButton(m_statusbar);
2913  mapUnknownSRIDToolButton->setDefaultAction(m_mapUnknownSRID);
2914  m_statusbar->addPermanentWidget(mapUnknownSRIDToolButton);
2915 
2916  // Map SRID action
2917  QToolButton* mapSRIDToolButton = new QToolButton(m_statusbar);
2918  mapSRIDToolButton->setDefaultAction(m_mapSRID);
2919  m_statusbar->addPermanentWidget(mapSRIDToolButton);
2920 
2921  // Map SRID information
2922  m_mapSRIDLineEdit = new QLineEdit(m_statusbar);
2923  m_mapSRIDLineEdit->setFixedWidth(120);
2924  m_mapSRIDLineEdit->setAlignment(Qt::AlignHCenter);
2925  m_mapSRIDLineEdit->setEnabled(false);
2926 
2927  int srid = m_display->getDisplay()->getSRID();
2928  srid != TE_UNKNOWN_SRS ? m_mapSRIDLineEdit->setText("EPSG:" + QString::number(srid)) : m_mapSRIDLineEdit->setText(tr("Unknown SRS"));
2929  m_statusbar->addPermanentWidget(m_mapSRIDLineEdit);
2930 
2931  // Coordinate Line Edit
2932  m_coordinateLineEdit = new QLineEdit(m_statusbar);
2933  m_coordinateLineEdit->setFixedWidth(220);
2934  m_coordinateLineEdit->setAlignment(Qt::AlignHCenter);
2935  m_coordinateLineEdit->setReadOnly(true);
2936  m_coordinateLineEdit->setFocusPolicy(Qt::NoFocus);
2937  m_coordinateLineEdit->setText(tr("Coordinates"));
2938  m_statusbar->addPermanentWidget(m_coordinateLineEdit);
2939 
2940  // Stop draw action
2941  QToolButton* stopDrawToolButton = new QToolButton(m_statusbar);
2942  stopDrawToolButton->setDefaultAction(m_mapStopDrawing);
2943  m_statusbar->addPermanentWidget(stopDrawToolButton);
2944 }
2945 
2947 {
2948  connect(m_fileExit, SIGNAL(triggered()), SLOT(close()));
2949  connect(m_fileRestartSystem, SIGNAL(triggered()), SLOT(onRestartSystemTriggered()));
2950  connect(m_projectAddLayerDataset, SIGNAL(triggered()), SLOT(onAddDataSetLayerTriggered()));
2951  connect(m_projectAddLayerQueryDataSet, SIGNAL(triggered()), SLOT(onAddQueryLayerTriggered()));
2952  connect(m_projectAddLayerTabularDataSet, SIGNAL(triggered()), SLOT(onAddTabularLayerTriggered()));
2953  connect(m_projectRemoveLayer, SIGNAL(triggered()), SLOT(onRemoveLayerTriggered()));
2954  connect(m_projectRenameLayer, SIGNAL(triggered()), SLOT(onRenameLayerTriggered()));
2955  connect(m_projectProperties, SIGNAL(triggered()), SLOT(onProjectPropertiesTriggered()));
2956  connect(m_projectChangeLayerDataSource, SIGNAL(triggered()), SLOT(onChangeLayerDataSourceTriggered()));
2957  connect(m_projectUpdateLayerDataSource, SIGNAL(triggered()), SLOT(onUpdateLayerDataSourceTriggered()));
2958  connect(m_pluginsManager, SIGNAL(triggered()), SLOT(onPluginsManagerTriggered()));
2959  connect(m_recentProjectsMenu, SIGNAL(triggered(QAction*)), SLOT(onRecentProjectsTriggered(QAction*)));
2960  connect(m_fileNewProject, SIGNAL(triggered()), SLOT(onNewProjectTriggered()));
2961  connect(m_fileOpenProject, SIGNAL(triggered()), SLOT(onOpenProjectTriggered()));
2962  connect(m_fileSaveProject, SIGNAL(triggered()), SLOT(onSaveProjectTriggered()));
2963  connect(m_fileSaveProjectAs, SIGNAL(triggered()), SLOT(onSaveProjectAsTriggered()));
2964  connect(m_toolsCustomize, SIGNAL(triggered()), SLOT(onToolsCustomizeTriggered()));
2965  connect(m_toolsDataExchanger, SIGNAL(triggered()), SLOT(onToolsDataExchangerTriggered()));
2966  connect(m_toolsDataExchangerDirect, SIGNAL(triggered()), SLOT(onToolsDataExchangerDirectTriggered()));
2967  connect(m_toolsDataExchangerDirectPopUp, SIGNAL(triggered()), SLOT(onToolsDataExchangerDirectPopUpTriggered()));
2968  connect(m_toolsQueryDataSource, SIGNAL(triggered()), SLOT(onToolsQueryDataSourceTriggered()));
2969  connect(m_toolsRasterMultiResolution, SIGNAL(triggered()), SLOT(onToolsRasterMultiResolutionTriggered()));
2970  //connect(m_toolsFixGeometry, SIGNAL(triggered()), SLOT(onToolsFixGeometryTriggered()));
2971  connect(m_helpContents, SIGNAL(triggered()), SLOT(onHelpTriggered()));
2972  connect(m_layerChartsHistogram, SIGNAL(triggered()), SLOT(onLayerHistogramTriggered()));
2973  connect(m_layerLinkTable, SIGNAL(triggered()), SLOT(onLinkTriggered()));
2974  connect(m_layerChartsScatter, SIGNAL(triggered()), SLOT(onLayerScatterTriggered()));
2975  connect(m_layerChart, SIGNAL(triggered()), SLOT(onLayerChartTriggered()));
2976  connect(m_projectAddFolderLayer, SIGNAL(triggered()), SLOT(onAddFolderLayerTriggered()));
2977  connect(m_layerProperties, SIGNAL(triggered()), SLOT(onLayerPropertiesTriggered()));
2978  connect(m_layerRemoveObjectSelection, SIGNAL(triggered()), SLOT(onLayerRemoveSelectionTriggered()));
2979  connect(m_layerRemoveItem, SIGNAL(triggered()), SLOT(onLayerRemoveItemTriggered()));
2980  connect(m_layerSRS, SIGNAL(triggered()), SLOT(onLayerSRSTriggered()));
2981  connect(m_layerObjectGrouping, SIGNAL(triggered()), SLOT(onLayerGroupingTriggered()));
2982  connect(m_mapSRID, SIGNAL(triggered()), SLOT(onMapSRIDTriggered()));
2983  connect(m_mapUnknownSRID, SIGNAL(triggered()), SLOT(onMapSetUnknwonSRIDTriggered()));
2984  connect(m_mapDraw, SIGNAL(triggered()), SLOT(onDrawTriggered()));
2985  connect(m_layerFitOnMapDisplay, SIGNAL(triggered()), SLOT(onLayerFitOnMapDisplayTriggered()));
2986  connect(m_layerFitSelectedOnMapDisplay, SIGNAL(triggered()), SLOT(onLayerFitSelectedOnMapDisplayTriggered()));
2987  connect(m_layerPanToSelectedOnMapDisplay, SIGNAL(triggered()), SLOT(onLayerPanToSelectedOnMapDisplayTriggered()));
2988  connect(m_layerCompositionMode, SIGNAL(hovered()), SLOT(onLayerCompositionModeTriggered()));
2989  connect(m_queryLayer, SIGNAL(triggered()), SLOT(onQueryLayerTriggered()));
2990  connect(m_mapZoomIn, SIGNAL(toggled(bool)), SLOT(onZoomInToggled(bool)));
2991  connect(m_mapZoomOut, SIGNAL(toggled(bool)), SLOT(onZoomOutToggled(bool)));
2992  connect(m_mapPreviousExtent, SIGNAL(triggered()), SLOT(onPreviousExtentTriggered()));
2993  connect(m_mapNextExtent, SIGNAL(triggered()), SLOT(onNextExtentTriggered()));
2994  connect(m_mapPan, SIGNAL(toggled(bool)), SLOT(onPanToggled(bool)));
2995  connect(m_mapZoomExtent, SIGNAL(triggered()), SLOT(onZoomExtentTriggered()));
2996  connect(m_mapInfo, SIGNAL(toggled(bool)), SLOT(onInfoToggled(bool)));
2997  connect(m_mapRemoveSelection, SIGNAL(triggered()), SLOT(onMapRemoveSelectionTriggered()));
2998  connect(m_mapSelection, SIGNAL(toggled(bool)), SLOT(onSelectionToggled(bool)));
2999  connect(m_mapMeasureDistance, SIGNAL(toggled(bool)), SLOT(onMeasureDistanceToggled(bool)));
3000  connect(m_mapMeasureArea, SIGNAL(toggled(bool)), SLOT(onMeasureAreaToggled(bool)));
3001  connect(m_mapMeasureAngle, SIGNAL(toggled(bool)), SLOT(onMeasureAngleToggled(bool)));
3002  connect(m_mapStopDrawing, SIGNAL(triggered()), SLOT(onStopDrawTriggered()));
3003  connect(m_layerShowTable, SIGNAL(triggered()), SLOT(onLayerShowTableTriggered()));
3004  connect(m_viewFullScreen, SIGNAL(toggled(bool)), SLOT(onFullScreenToggled(bool)));
3005  connect(m_toolsDataSourceExplorer, SIGNAL(triggered()), SLOT(onDataSourceExplorerTriggered()));
3006 }
A connector for the te::qt::widgets::LayerExplorer class to the Application Framework.
virtual std::list< te::map::AbstractLayerPtr > getLayers()=0
This event signals that a new layer was created.
Definition: LayerEvents.h:66
A tree view for the layers of an application.
Definition: LayerTreeView.h:63
void setLayerList(std::list< te::map::AbstractLayerPtr > &layerList)
A dock widget for table view objects.
void resetTerraLib(const bool &status)
virtual void setConfigFile(const std::string &configFileName)
It gives access to the controller singleton.
This file defines a class for a Query Data Source Dialog Dialog.
void registerMenu(QMenu *mnu)
Register the mnu.
te::qt::widgets::ChartDisplayWidget * getDisplayWidget()
Returns a pointer to the generated ChartDisplayWidget.
te::qt::widgets::ChartDisplayWidget * getDisplayWidget()
Returns a pointer to the generated ChartDisplayWidget.
void onZoomInToggled(bool checked)
A dialog for selecting a data source.
double m_x
The x coordinate value.
Definition: ToolEvents.h:93
A dock widget for ChartDisplayWidget objects.
A class that defines the interface of a qt widget to group a set of ProgressWidgetItem.
This is the base class for layers.
Definition: AbstractLayer.h:76
te::map::AbstractLayerPtr m_layer
Layer whose selected objects were changed.
Definition: LayerEvents.h:192
QToolBar * m_toolbar
Pointer to the new QToolBar.
It indicates that a new project was created.
Definition: ProjectEvents.h:47
te::qt::af::DataSetTableDockWidget * GetLayerDock(const te::map::AbstractLayer *layer, const std::vector< te::qt::af::DataSetTableDockWidget * > &docs)
A for customization of the application components.
void setLayer(te::map::AbstractLayer *layer)
Sets the layer to be showed on view. This DOES NOT takes the ownership of layer.
virtual void initializePlugins()
Load the plugin list and initialize the plugins enabled by the user.
void onLayerSelectedObjectsChanged(const te::map::AbstractLayerPtr &layer)
A class that models the description of a dataset.
Definition: DataSetType.h:72
TEQTAFEXPORT QString GetWindowTitle(const Project &project)
Return a QString with the new window title based on the project informations.
Definition: Utils.cpp:954
This class implements a concrete tool to geographic zoom in operation using a boundary rectangle...
Definition: ZoomArea.h:49
A base class for application events.
Definition: Event.h:59
LayerTreeView * getTreeView() const
A dialog to fix geometries.
virtual const char * what() const
It outputs the exception message.
Definition: Exception.cpp:58
void registerMenuBar(QMenuBar *bar)
Register the bar.
void setSelectionColor(QColor selColor)
color used to hgihlight selected objects on this display.
void onChartDisplayCreated(te::qt::widgets::ChartDisplayWidget *chartDisplay, te::map::AbstractLayer *layer)
A connector for the te::qt::widgets::StyleDockWidget class to the Application Framework.
Definition: StyleExplorer.h:61
A connector for the te::qt::widgets::LayerExplorer class to the Application Framework.
Definition: LayerExplorer.h:70
TEQTAFEXPORT std::vector< QToolBar * > ReadToolBarsFromSettings(QWidget *barsParent=0)
Returns a vector of tool bars registered in the QSettings.
Definition: Utils.cpp:493
This event indicates that the objects of the given layer must be highlighted.
Definition: LayerEvents.h:201
This event signals that the srid of the map display changed.
Definition: MapEvents.h:54
A connector of the te::qt::widgets::MapDisplay class to the Application Framework.
Definition: MapDisplay.h:77
This class models the concept of a project for the TerraLib Application Framework.
A connector for the te::qt::widgets::StyleDockWidget class to the Application Framework.
void setResetTerraLibFlag(const bool &status)
Contains a list of the map display events.
double m_urx
Upper right corner x-coordinate.
Definition: Envelope.h:346
TEQTAFEXPORT QString UnsavedStar(const QString windowTitle, bool isUnsaved)
Unsaved star.
Definition: Utils.cpp:697
The class that represents an item in a LayerTreeModel.
A singleton for holding he application splash screen.
void set(te::qt::af::Project *prj)
Set the current project.
double getWidth() const
It returns the envelope width.
Definition: Envelope.h:443
double m_y
The y coordinate value.
Definition: ToolEvents.h:94
void setChart(te::map::Chart *chart)
Update the interface with the chart properties.
void onStyleExplorerVisibilityChanged(bool visible)
A widget to control the display of a set of layers.
Definition: MapDisplay.h:66
An utility struct for representing 2D coordinates.
Definition: Coord2D.h:40
A layer that can be used as a container for other kind of layers.
Definition: FolderLayer.h:45
TEQTAFEXPORT void SaveLastDatasourceOnSettings(const QString &dsType)
Definition: Utils.cpp:587
This class implements a concrete tool to select layer features using an extent.
Definition: Selection.h:63
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:347
An abstract class for layer selection widgets.
TEQTAFEXPORT void SaveState(QMainWindow *mainWindow)
Definition: Utils.cpp:547
void onInfoToggled(bool checked)
This event indicates that the selected objects of the layer were changed.
Definition: LayerEvents.h:178
InterfaceController * getInterfaceController()
A dock widget for DataSetTableView objects.
A dialog for edition of te::qt::af::Project informations.
TEQTAFEXPORT void SaveDataSourcesFile()
Saves data sources file.
Definition: Utils.cpp:413
virtual void update(std::list< te::da::DataSourceInfoPtr > &datasources)=0
virtual void initAction(QAction *&act, const QString &icon, const QString &name, const QString &text, const QString &tooltip, bool iconVisibleInMenu, bool isCheckable, bool enabled, QObject *parent)
virtual void initialize()
Initializes the application framework.
virtual te::map::AbstractLayerPtr getLayer() const =0
virtual void setExtent(te::gm::Envelope &e, bool doRefresh=true)
It sets the world visible area and refreshes the contents in the map display.
Definition: MapDisplay.cpp:68
void setLayer(te::map::AbstractLayerPtr layer)
Set a layer.
Contains the list of the project events.
TEMAPEXPORT te::gm::Envelope GetSelectedExtent(const std::list< te::map::AbstractLayerPtr > layers, int srid, bool onlyVisibles)
It calculates the extent of selected objects of the given layers in the given SRID.
Definition: Utils.cpp:79
Coord2D getCenter() const
It returns the rectangle's center coordinate.
Definition: Envelope.cpp:51
This class implements a concrete tool to get informations about a specified feature using pointing op...
Definition: Info.h:74
std::list< te::map::AbstractLayerPtr > getAllLayers(bool invalid=true)
It gets all the layers (single and folder layers) of the project.
Definition: Project.cpp:77
This class implements a concrete tool to geographic pan operation.
Definition: Pan.h:49
double m_llx
Lower left corner x-coordinate.
Definition: Envelope.h:344
virtual void setResizePolicy(const ResizePolicy &policy)
Sets the resize policy to this map display.
Definition: MapDisplay.cpp:227
A connector of the te::qt::widgets::MapDisplay class to the Application Framework.
This class represents the informations needed to build map charts.
Definition: Chart.h:51
static ApplicationController & getInstance()
It returns a reference to the singleton instance.
void onMeasureAngleToggled(bool checked)
A widget designed to explore the layers of an application.
Definition: LayerExplorer.h:59
An Envelope defines a 2D rectangular region.
Definition: Envelope.h:51
const std::string & getDataSourceId() const
#define TE_UNKNOWN_SRS
A numeric value to represent a unknown SRS identification in TerraLib.
Definition: Config.h:44
A dialog used to configure the properties of a new textual file based layer.
int m_id
Identifier.
Definition: Event.h:70
void CloseAllTables(std::vector< te::qt::af::DataSetTableDockWidget * > &tables)
void setProjectAsChanged(const bool &changed)
It sets the project status as changed or not.
Definition: Project.cpp:226
void onMeasureDistanceToggled(bool checked)
void addListener(QObject *obj)
Insert an application item that will listen to framework events.
virtual int getSRID() const
It return the Spatial Reference System used by the Map Display.
Definition: MapDisplay.cpp:73
void onSelectionToggled(bool checked)
This class controls how a set of layers are displayed.
Definition: MapDisplay.h:45
Contains a list of the layer events.
TEDATAACCESSEXPORT void Save(const std::string &fileName)
Definition: Serializer.cpp:201
std::list< te::map::AbstractLayerPtr > getSingleLayers(bool invalid=true)
It gets all the single layers of the project.
Definition: Project.cpp:113
TEQTAFEXPORT void GetProjectInformationsFromSettings(QString &defaultAuthor, int &maxSaved)
Definition: Utils.cpp:567
An exception class for the TerraLib Application Framework.
A class that defines the interface of a qt bar progress viewer.
void setLayer(te::map::AbstractLayer *layer)
Sets the layer to be showed on view. This DOES NOT takes the ownership of layer.
virtual const te::gm::Envelope & getExtent() const
It returns the world extent showned by the MapDisplay.
Definition: MapDisplay.cpp:63
void onMeasureAreaToggled(bool checked)
virtual void initializeProjectMenus()
Initializes the menus for the most recent open projects.
void onRecentProjectsTriggered(QAction *proj)
const QString & getAppProjectExtension() const
Returns the application project extension.
void onFullScreenToggled(bool checked)
A dialog used to build a grouping.
void cancelTasks(unsigned int type)
Cancels the task with the given task type and inform all viewers that a task was canceled.
TEQTAFEXPORT void RestoreState(QMainWindow *mainWindow)
Definition: Utils.cpp:557
void setLayers(std::list< te::map::AbstractLayerPtr > layers)
Set the layer that can be used.
This class implements a concrete tool to geographic zoom operation using the mouse click...
Definition: ZoomClick.h:49
void onLayerExplorerVisibilityChanged(bool visible)
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
Definition: Exception.h:58
TEQTAFEXPORT QString GetExtensionFilter()
Return extension filter string.
Definition: Utils.cpp:971
A dock widget for chart display objects.
BaseApplication(QWidget *parent=0)
This event signals that a item belonging to a layer will be removed from the layer explorer...
Definition: LayerEvents.h:90
A base class for widgets that allows application to create, edit or remove data sources.
This file defines a class for a Query Dialog Dialog.
Definition: QueryDialog.h:64
double m_lly
Lower left corner y-coordinate.
Definition: Envelope.h:345
Signals a mouse moved over the current display.
Definition: ToolEvents.h:78
virtual void closeEvent(QCloseEvent *e)
It indicates that the project has unsaved changes.
Definition: ProjectEvents.h:68
Utility functions for MapTools module.
int addViewer(AbstractProgressViewer *apv)
Attach a progress viewer.
A dataset is the unit of information manipulated by the data access module of TerraLib.
Definition: DataSet.h:112
A wdiget used to display a chart.
void setLayerList(std::list< te::map::AbstractLayerPtr > layerList)
This method is used to set the list of layers.
void broadcast(te::qt::af::evt::Event *evt)
Send events in broadcast for all registered components.
te::map::DataSetAdapterLayerPtr getDataSetAdapterLayer()
Returns a new DataSetAdapterLayer.
void setLastDataSource(std::string dataSource)
Function used to set the last data source used.
te::qt::af::Project * getProject()
Get the current project.
TEQTAFEXPORT Project * ReadProject(const std::string &uri)
Reads and return a te::qt::af::Project from the file.
Definition: Utils.cpp:77
This class represents a TableLinkDialog component.
double m_ury
Upper right corner y-coordinate.
Definition: Envelope.h:347
void onDisplayDataTableChanged(bool visible)
This class models the concept of a project for the TerraLib Application Framework.
Definition: Project.h:50
void onCreateNewLayer(te::map::AbstractLayerPtr layer)
void removeListener(QObject *obj)
Remove the obj from the list of event listeners.
A dialog for selecting a data source.
A dock widget used control the geographic data style using SE elements and a property browser to show...
A dialog used to customize a Scatter parameters and generate it's ChartDisplayWidget.
Definition: ScatterDialog.h:59
void setAppMapDisplay(te::qt::widgets::MapDisplay *appMapDisplay)
void onZoomOutToggled(bool checked)
This event signals that a new toolbar was added.
TEQTAFEXPORT bool GetOpenLastProjectFromSettings()
Definition: Utils.cpp:608
void onHighlightLayerObjects(const te::map::AbstractLayerPtr &layer, te::da::DataSet *dataset, const QColor &color)
A layer with reference to a dataset.
Definition: DataSetLayer.h:47
A connector to controll all non modal interfaces.
virtual void openProject(const QString &projectFileName)
This event signals that a layer is to be removed from the layer explorer.
Definition: LayerEvents.h:111
void add(QAction *action, const std::string &menu="", const std::string &itemType="", ContextMenuSelectionType menuSelectionType=te::qt::widgets::LayerTreeView::UNIQUE_ITEM_SELECTED)
It adds the action to a specified menu of a given item type when a context menu is displayed...
void clearAll()
Removes references for Viewers and tasks.
A dialog to create multi resolution over a raster.
A Dialog used to customize a Histogram parameters and generate it's ChartDisplayWidget.
virtual QWidget * getWidget(int widgetType, QWidget *parent=0, Qt::WindowFlags f=0) const =0
This class implements a concrete tool to measure operation (distance, area, and angle).
Definition: Measure.h:66
QString getMostRecentProject() const
Returns the most recent project.
A dialog used to build a SRSManagerDialog element.
This class is widget that provides a menu for composition mode selection.
virtual void setSRID(const int &srid, bool doRefresh=true)
It sets a new Spatial Reference System to be used by the Map Display.
Definition: MapDisplay.cpp:211
TEQTAFEXPORT void Save(const Project &project, const std::string &uri)
Saves the informations of the project in the uri file.
Definition: Utils.cpp:194
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void transform(int oldsrid, int newsrid)
It will transform the coordinates of the Envelope from the old SRS to the new one.
Definition: Envelope.cpp:92
Contains the list of the application events.
A QMainWindow to be used as the basis for TerraLib applications.
virtual void setExtent(te::gm::Envelope &e, bool doRefresh=true)
It sets the world visible area and refreshes the contents in the map display.
Definition: MapDisplay.cpp:150
double getHeight() const
It returns the envelope height.
Definition: Envelope.h:448
The base API for controllers of TerraLib applications.
const std::pair< int, std::string > & getSelectedSRS() const
Returns the selected SRS in the window.
virtual QMessageBox::StandardButton checkProjectSave()
void onApplicationTriggered(te::qt::af::evt::Event *evt)
bool isValid() const
It tells if the rectangle is valid or not.
Definition: Envelope.h:438
void registerToolBar(const QString &id, QToolBar *bar)
Register the toolbar in the list of the known toolbars.
A connector to controll all non modal interfaces.
A multi thread Qt4 widget to control the display of a set of layers.
TEQTAFEXPORT QString GetLastDatasourceFromSettings()
Definition: Utils.cpp:601
virtual void finalize()
Finalize the application framework.
void setProject(Project *proj)
Sets the project to be inspected.
std::pair< int, std::string > m_srid
Definition: MapEvents.h:67
void onLayerTableClose(te::qt::af::DataSetTableDockWidget *wid)
void setDataSourceId(const std::string &id)
virtual void set(const std::list< te::da::DataSourceInfoPtr > &datasources)=0
void setLayerList(std::list< te::map::AbstractLayerPtr > &layerList)
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr
A dialog used to build a chart.
void updateRecentProjects(const QString &prjFile, const QString &prjTitle)
Update the list of recent projects. This is commonly used when there's a new most recent project...
A base class for the suppported types of data source.