All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
BaseApplication.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008-2013 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/progress/ProgressManager.h"
28 #include "../../common/progress/TaskProgress.h"
29 #include "../../common/SystemApplicationSettings.h"
30 #include "../../common/STLUtils.h"
31 #include "../../common/Translator.h"
32 #include "../../common/UserApplicationSettings.h"
33 #include "../../maptools/Utils.h"
34 #include "../../srs/Config.h"
35 #include "../widgets/canvas/EyeBirdMapDisplayWidget.h"
36 #include "../widgets/canvas/MultiThreadMapDisplay.h"
37 #include "../widgets/canvas/ZoomInMapDisplayWidget.h"
38 #include "../widgets/charts/ChartLayerDialog.h"
39 #include "../widgets/charts/HistogramDialog.h"
40 #include "../widgets/charts/ScatterDialog.h"
41 #include "../widgets/datasource/core/DataSourceType.h"
42 #include "../widgets/datasource/core/DataSourceTypeManager.h"
43 #include "../widgets/datasource/selector/DataSourceExplorerDialog.h"
44 #include "../widgets/datasource/selector/DataSourceSelectorDialog.h"
45 #include "../widgets/exchanger/DataExchangerWizard.h"
46 #include "../widgets/exchanger/DirectExchangerDialog.h"
47 #include "../widgets/externalTable/DataPropertiesDialog.h"
48 #include "../widgets/help/HelpManager.h"
49 #include "../widgets/layer/explorer/ColorMapItem.h"
50 #include "../widgets/layer/explorer/ChartItem.h"
51 #include "../widgets/layer/explorer/GroupingItem.h"
52 #include "../widgets/layer/explorer/LayerExplorer.h"
53 #include "../widgets/layer/explorer/LayerTreeView.h"
54 #include "../widgets/layer/explorer/AbstractTreeItem.h"
55 #include "../widgets/layer/explorer/FolderLayerItem.h"
56 #include "../widgets/layer/info/LayerPropertiesInfoWidget.h"
57 #include "../widgets/layer/selector/AbstractLayerSelector.h"
58 #include "../widgets/plugin/manager/PluginManagerDialog.h"
59 #include "../widgets/progress/ProgressViewerBar.h"
60 #include "../widgets/progress/ProgressViewerDialog.h"
61 #include "../widgets/progress/ProgressViewerWidget.h"
62 #include "../widgets/query/QueryLayerBuilderWizard.h"
63 #include "../widgets/query/QueryDialog.h"
64 #include "../widgets/se/GroupingDialog.h"
65 #include "../widgets/se/StyleDockWidget.h"
66 #include "../widgets/tools/Info.h"
67 #include "../widgets/tools/Measure.h"
68 #include "../widgets/tools/Pan.h"
69 #include "../widgets/tools/Selection.h"
70 #include "../widgets/tools/ZoomArea.h"
71 #include "../widgets/tools/ZoomClick.h"
72 #include "../widgets/srs/SRSManagerDialog.h"
76 #include "connectors/MapDisplay.h"
79 #include "events/LayerEvents.h"
80 #include "events/MapEvents.h"
81 #include "events/ProjectEvents.h"
82 #include "events/ToolEvents.h"
84 #include "ApplicationController.h"
85 #include "ApplicationPlugins.h"
86 #include "BaseApplication.h"
87 #include "Exception.h"
88 #include "Project.h"
89 #include "ProjectInfoDialog.h"
90 #include "SplashScreenManager.h"
91 #include "Utils.h"
92 
93 // Qt
94 #include <QtCore/QDir>
95 #include <QtGui/QActionGroup>
96 #include <QtGui/QApplication>
97 #include <QtGui/QCloseEvent>
98 #include <QtGui/QDockWidget>
99 #include <QtGui/QFileDialog>
100 #include <QtGui/QInputDialog>
101 #include <QtGui/QMenu>
102 #include <QtGui/QMenuBar>
103 #include <QtGui/QMessageBox>
104 #include <QtGui/QStatusBar>
105 #include <QtGui/QToolBar>
106 #include <QtGui/QToolButton>
107 
108 // STL
109 #include <list>
110 #include <memory>
111 #include <utility>
112 
113 // Boost
114 #include <boost/filesystem.hpp>
115 #include <boost/format.hpp>
116 #include <boost/uuid/random_generator.hpp>
117 #include <boost/uuid/uuid_io.hpp>
118 
119 
120 te::qt::af::DataSetTableDockWidget* GetLayerDock(const te::map::AbstractLayer* layer, const std::vector<te::qt::af::DataSetTableDockWidget*>& docs)
121 {
122  std::vector<te::qt::af::DataSetTableDockWidget*>::const_iterator it;
123 
124  for(it=docs.begin(); it!=docs.end(); ++it)
125  if((*it)->getLayer() == layer)
126  return *it;
127 
128  return 0;
129 }
130 
131 void CloseAllTables(std::vector<te::qt::af::DataSetTableDockWidget*>& tables)
132 {
133  std::vector<te::qt::af::DataSetTableDockWidget*>::iterator it;
134 
135  for(it=tables.begin(); it!=tables.end(); ++it)
136  (*it)->close();
137 
138  tables.clear();
139 }
140 
142  : QMainWindow(parent, 0),
143  m_mapCursorSize(QSize(20, 20)),
144  m_explorer(0),
145  m_display(0),
146  m_styleExplorer(0),
147  m_project(0),
148  m_progressDockWidget(0),
149  m_zoomInDisplaysDockWidget(0),
150  m_eyeBirdDisplaysDockWidget(0),
151  m_controller(0)
152 {
154 
155  if (objectName().isEmpty())
156  setObjectName("BaseApplicationForm");
157 
158  resize(640, 480);
159  setMinimumSize(QSize(640, 480));
160 
161  m_centralwidget = new QWidget(this);
162  m_centralwidget->setObjectName("centralwidget");
163  setCentralWidget(m_centralwidget);
164 
165  // Initilazing menus
166  m_menubar = new QMenuBar(this);
167  m_fileMenu = new QMenu(m_menubar);
168  m_recentProjectsMenu = new QMenu(m_fileMenu);
169  m_menubar->addAction(m_fileMenu->menuAction());
170  m_viewMenu = new QMenu(m_menubar);
171  m_menubar->addAction(m_viewMenu->menuAction());
172  m_viewToolBarsMenu = new QMenu(m_viewMenu);
173  m_viewMenu->addMenu(m_viewToolBarsMenu);
174  m_projectMenu = new QMenu(m_menubar);
176  m_menubar->addAction(m_projectMenu->menuAction());
177  m_projectMenu->addAction(m_projectAddLayerMenu->menuAction());
178  m_layerMenu = new QMenu(m_menubar);
179  m_menubar->addAction(m_layerMenu->menuAction());
180  m_mapMenu = new QMenu(m_menubar);
181  m_menubar->addAction(m_mapMenu->menuAction());
182  m_toolsMenu = new QMenu(m_menubar);
183  m_toolsExchangerMenu = new QMenu(m_toolsMenu);
184  m_toolsMenu->addAction(m_toolsExchangerMenu->menuAction());
185  m_menubar->addAction(m_toolsMenu->menuAction());
186  m_pluginsMenu = new QMenu(m_menubar);
187  m_menubar->addAction(m_pluginsMenu->menuAction());
188  m_helpMenu = new QMenu(m_menubar);
189  m_menubar->addAction(m_helpMenu->menuAction());
190 
192 }
193 
195 {
196  delete m_explorer;
197  delete m_display;
198  delete m_styleExplorer;
199  delete m_project;
200  delete m_progressDockWidget;
201  delete m_zoomInDisplaysDockWidget;
202  delete m_eyeBirdDisplaysDockWidget;
203 
204  while(!m_tableDocks.empty())
205  delete *m_tableDocks.begin();
206 
208 
209  delete m_controller;
210 }
211 
213 {
214  throw Exception("Not implemented yet!");
215 }
216 
217 void te::qt::af::BaseApplication::init(const std::string& configFile)
218 {
220 
221  try
222  {
224  }
225  catch(const std::exception& e)
226  {
227  QString msgErr(tr("Could not initialize the application: %1"));
228 
229  msgErr = msgErr.arg(e.what());
230 
231  QMessageBox::critical(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msgErr);
232 
233  throw;
234  }
235 
236  setWindowIcon(QIcon::fromTheme(te::qt::af::ApplicationController::getInstance().getAppIconName()));
237 
238  setWindowTitle(te::qt::af::ApplicationController::getInstance().getAppTitle());
239 
240  makeDialog();
241 
243 
244  try
245  {
247  }
248  catch(const std::exception& e)
249  {
250  QString msgErr(tr("Error loading plugins: %1"));
251 
252  msgErr = msgErr.arg(e.what());
253 
254  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msgErr);
255  }
256 
257 // try to load the last opened project
259 
260  if(recentProject.isEmpty() || !te::qt::af::GetOpenLastProjectFromSettings())
261  newProject();
262  else
263  {
264  try
265  {
266  openProject(recentProject);
267  }
268  catch (const te::common::Exception& ex)
269  {
270  QString msgErr(tr("Error loading the project: %1!"));
271 
272  msgErr = msgErr.arg(ex.what());
273 
274  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msgErr);
275 
276  newProject();
277  }
278  }
279 
280  // The selection tool come active as default
281  onSelectionToggled(true);
282  m_mapSelection->setChecked(true);
283 
284  m_viewDataTable->setChecked(false);
285  m_viewDataTable->setEnabled(false);
286 }
287 
289 {
291 }
292 
294 {
295  switch(evt->m_id)
296  {
298  {
299  // Add the unsave asterisk
300  setWindowTitle(te::qt::af::UnsavedStar(windowTitle(), true));
301 
302  m_project->setProjectAsChanged(true);
303  }
304  break;
305 
307  {
309  QMainWindow::addToolBar(Qt::TopToolBarArea, e->m_toolbar);
310  }
311  break;
312 
314  {
316  QString text = "(" + QString::number(e->m_x, 'f', 5) + " , " + QString::number(e->m_y, 'f', 5) + ")";
317  m_coordinateLineEdit->setText(text);
318  }
319  break;
320 
322  {
324 
325  std::pair<int, std::string> srid = e->m_srid;
326 
327  if (srid.first != TE_UNKNOWN_SRS)
328  {
329  QString sridText(srid.second.c_str());
330  sridText += ":" + QString::number(srid.first);
331  m_mapSRIDLineEdit->setText(sridText);
332  }
333  else
334  {
335  m_mapSRIDLineEdit->setText("Unknown SRS");
336  m_coordinateLineEdit->setText("Coordinates");
337  }
338  }
339  break;
340 
341  default:
342  break;
343  }
344 }
345 
347 {
348  try
349  {
350  // Get the parent layer where the dataset layer(s) will be added.
351  te::map::AbstractLayerPtr parentLayer(0);
352 
353  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
354 
355  if(selectedLayerItems.size() == 1 && selectedLayerItems.front()->getItemType() == "FOLDER_LAYER_ITEM")
356  parentLayer = selectedLayerItems.front()->getLayer();
357 
358  // Get the layer(s) to be added
359  std::auto_ptr<te::qt::widgets::DataSourceSelectorDialog> dselector(new te::qt::widgets::DataSourceSelectorDialog(this));
360 
361  QString dsTypeSett = GetLastDatasourceFromSettings();
362 
363  if(!dsTypeSett.isNull() && !dsTypeSett.isEmpty())
364  dselector->setDataSourceToUse(dsTypeSett);
365 
366  int retval = dselector->exec();
367 
368  if(retval == QDialog::Rejected)
369  return;
370 
371  std::list<te::da::DataSourceInfoPtr> selectedDatasources = dselector->getSelecteds();
372 
373  if(selectedDatasources.empty())
374  return;
375 
376  dselector.reset(0);
377 
378  const std::string& dsTypeId = selectedDatasources.front()->getType();
379 
381 
382  std::auto_ptr<QWidget> lselectorw(dsType->getWidget(te::qt::widgets::DataSourceType::WIDGET_LAYER_SELECTOR, this));
383 
384  if(lselectorw.get() == 0)
385  throw Exception((boost::format(TR_QT_AF("No layer selector widget found for this type of data source: %1%!")) % dsTypeId).str());
386 
387  te::qt::widgets::AbstractLayerSelector* lselector = dynamic_cast<te::qt::widgets::AbstractLayerSelector*>(lselectorw.get());
388 
389  if(lselector == 0)
390  throw Exception(TR_QT_AF("Wrong type of object for layer selection!"));
391 
392  lselector->set(selectedDatasources);
393 
394  std::list<te::map::AbstractLayerPtr> layers = lselector->getLayers();
395 
396  lselectorw.reset(0);
397 
398  if(m_project == 0)
399  throw Exception(TR_QT_AF("Error: there is no opened project!"));
400 
401  std::list<te::map::AbstractLayerPtr>::const_iterator it = layers.begin();
402  std::list<te::map::AbstractLayerPtr>::const_iterator itend = layers.end();
403 
404  while(it != itend)
405  {
406  if((m_explorer != 0) && (m_explorer->getExplorer() != 0))
407  {
408  te::qt::af::evt::LayerAdded evt(*it, parentLayer);
410  }
411  ++it;
412  }
413 
414  SaveLastDatasourceOnSettings(dsTypeId.c_str());
415 
416  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
417  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
418  }
419  catch(const std::exception& e)
420  {
421  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
422  }
423  catch(...)
424  {
425  QMessageBox::warning(this,
427  tr("Unknown error while trying to add a layer from a dataset!"));
428  }
429 }
430 
432 {
433  try
434  {
435  if(m_project == 0)
436  throw Exception(TR_QT_AF("Error: there is no opened project!"));
437 
438  // Get the parent layer where the dataset layer(s) will be added.
439  te::map::AbstractLayerPtr parentLayer(0);
440 
441  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
442 
443  if(selectedLayerItems.size() == 1 && selectedLayerItems.front()->getItemType() == "FOLDER_LAYER_ITEM")
444  parentLayer = selectedLayerItems.front()->getLayer();
445 
446  std::auto_ptr<te::qt::widgets::QueryLayerBuilderWizard> qlb(new te::qt::widgets::QueryLayerBuilderWizard(this));
447 
448  std::list<te::map::AbstractLayerPtr> layers = te::qt::af::ApplicationController::getInstance().getProject()->getAllLayers();
449 
450  qlb->setLayerList(layers);
451 
452  int retval = qlb->exec();
453 
454  if(retval == QDialog::Rejected)
455  return;
456 
457  te::map::AbstractLayerPtr layer = qlb->getQueryLayer();
458 
459  if((m_explorer != 0) && (m_explorer->getExplorer() != 0))
460  {
461  te::qt::af::evt::LayerAdded evt(layer, parentLayer);
463  }
464 
465  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
466  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
467  }
468  catch(const std::exception& e)
469  {
470  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
471  }
472  catch(...)
473  {
474  QMessageBox::warning(this,
476  tr("Unknown error while trying to add a layer from a queried dataset!"));
477  }
478 }
479 
481 {
482  try
483  {
484  if(m_project == 0)
485  throw Exception(TR_QT_AF("Error: there is no opened project!"));
486 
487  // Get the parent layer where the tabular layer will be added.
488  te::map::AbstractLayerPtr parentLayer(0);
489 
490  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
491 
492  if(selectedLayerItems.size() == 1 && selectedLayerItems.front()->getItemType() == "FOLDER_LAYER_ITEM")
493  parentLayer = selectedLayerItems.front()->getLayer();
494 
496  int res = dlg.exec();
497  if (res == QDialog::Accepted)
498  {
499  if((m_explorer != 0) && (m_explorer->getExplorer() != 0))
500  {
501  te::qt::af::evt::LayerAdded evt(dlg.getDataSetAdapterLayer(), parentLayer);
503  }
504 
505  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
506  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
507  }
508  }
509  catch(const std::exception& e)
510  {
511  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
512  }
513  catch(...)
514  {
515  QMessageBox::warning(this,
517  tr("Unknown error while trying to add a layer from a queried dataset!"));
518  }
519 }
520 
522 {
523  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
524 
525  if(selectedLayerItems.empty())
526  {
527  QString msg = tr("Select at least one layer to be removed!");
528  QMessageBox::warning(this, tr("Remove Layer"), msg);
529 
530  return;
531  }
532 
533  QString msg;
534  QString questionTitle;
535 
536  if(selectedLayerItems.size() == 1)
537  {
538  msg = tr("Do you really want to remove the selected layer?");
539  questionTitle = tr("Remove Layer");
540  }
541  else
542  {
543  msg = tr("Do you really want to remove the selected layers?");
544  questionTitle = tr("Remove Layers");
545  }
546 
547  int reply = QMessageBox::question(this, questionTitle, msg, QMessageBox::No, QMessageBox::Yes);
548 
549  if(reply == QMessageBox::No)
550  return;
551 
552  std::list<te::qt::widgets::AbstractTreeItem*>::const_iterator it;
553  for(it = selectedLayerItems.begin(); it != selectedLayerItems.end(); ++it)
554  {
555  te::qt::af::evt::LayerRemoved evt((*it)->getLayer());
557  }
558 }
559 
561 {
562  std::list<te::qt::widgets::AbstractTreeItem*> selectedItems = m_explorer->getExplorer()->getSelectedItems();
563 
564  std::list<te::qt::widgets::AbstractTreeItem*>::const_iterator it;
565  for(it = selectedItems.begin(); it != selectedItems.end(); ++it)
566  {
569  }
570 }
571 
573 {
574  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
575 
576  if(selectedLayerItems.empty() ||
577  (selectedLayerItems.size() == 1 && !selectedLayerItems.front()->getLayer()) ||
578  selectedLayerItems.size() > 1)
579  {
580  QString msg = tr("Select only one layer to be renamed!");
581  QMessageBox::warning(this, tr("Rename Layer"), msg);
582 
583  return;
584  }
585 
586  bool ok;
587  QString text = QInputDialog::getText(this, ApplicationController::getInstance().getAppTitle(),
588  tr("Rename Layer:"), QLineEdit::Normal,
589  tr("Enter the new layer name"), &ok);
590 
591  if (!ok)
592  return;
593 
594  if(text.isEmpty())
595  {
596  QMessageBox::warning(this, ApplicationController::getInstance().getAppTitle(), tr("Enter the new name!"));
597  return;
598  }
599 
600  te::qt::widgets::AbstractTreeItem* selectedLayerItem = selectedLayerItems.front();
601  te::map::AbstractLayerPtr layer = selectedLayerItem->getLayer();
602  layer->setTitle(text.toStdString());
603 
604  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
605  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
606 }
607 
609 {
610  try
611  {
613  dlg.exec();
614  }
615  catch(const std::exception& e)
616  {
617  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
618  }
619 }
620 
622 {
623  QString projFile = proj->data().toString();
624 
625  openProject(projFile);
626 }
627 
629 {
630  newProject();
631 
632  onSaveProjectAsTriggered();
633 }
634 
636 {
637  QString file = QFileDialog::getOpenFileName(this, tr("Open project file"), qApp->applicationDirPath(), tr("XML File (*.xml *.XML)"));
638 
639  if(file.isEmpty())
640  return;
641 
642  try
643  {
644  openProject(file);
645  }
646  catch(const te::common::Exception& e)
647  {
648  QString msg = tr("Fail to open project.");
649  msg += " ";
650  msg += e.what();
651  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msg);
652  }
653 }
654 
656 {
657  std::string fName = m_project->getFileName();
658 
659  if(fName.empty())
660  {
661  QString fileName = QFileDialog::getSaveFileName(this, tr("Save Project File"), qApp->applicationDirPath(), tr("XML Files (*.xml *.XML)"));
662 
663  if(!fileName.isEmpty())
664  {
665  fName = fileName.toStdString();
666  m_project->setFileName(fName);
667  }
668  else
669  {
670  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("Project not saved."));
671  return;
672  }
673  }
674 
675  te::qt::af::Save(*m_project, m_project->getFileName());
676 
677  m_project->setProjectAsChanged(false);
678 
679  setWindowTitle(te::qt::af::UnsavedStar(windowTitle(), m_project->hasChanged()));
680 
681  te::qt::af::ApplicationController::getInstance().updateRecentProjects(m_project->getFileName().c_str(), m_project->getTitle().c_str());
682 
684 }
685 
687 {
688  if(m_project == 0)
689  return;
690 
691  QString fileName = QFileDialog::getSaveFileName(this, tr("Save Project File"), qApp->applicationDirPath(), tr("XML Files (*.xml *.XML)"));
692 
693  if(fileName.isEmpty())
694  return;
695 
696  std::string fName = fileName.toStdString();
697 
698  m_project->setFileName(fName);
699 
700  te::qt::af::Save(*m_project, fName);
701 
702  m_project->setProjectAsChanged(false);
703 
704  setWindowTitle(te::qt::af::UnsavedStar(windowTitle(), m_project->hasChanged()));
705 
706  ApplicationController::getInstance().updateRecentProjects(fileName, m_project->getTitle().c_str());
707 
708  QString projectTile(tr(" - Project: %1 - %2"));
709  std::string name = boost::filesystem::basename(m_project->getFileName()) + boost::filesystem::extension(m_project->getFileName());
710  setWindowTitle(te::qt::af::ApplicationController::getInstance().getAppTitle() + projectTile.arg(m_project->getTitle().c_str(), name.c_str()));
711 
713 }
714 
716 {
717  try
718  {
719  te::qt::af::SettingsDialog dlg(this);
720  dlg.exec();
721  }
722  catch(const std::exception& e)
723  {
724  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
725  }
726 }
727 
729 {
730  try
731  {
733  dlg.exec();
734  }
735  catch(const std::exception& e)
736  {
737  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
738  }
739 }
740 
742 {
743  try
744  {
746 
747  std::list<te::map::AbstractLayerPtr> layers = te::qt::af::ApplicationController::getInstance().getProject()->getAllLayers();
748  dlg.setLayers(layers);
749 
750  dlg.exec();
751  }
752  catch(const std::exception& e)
753  {
754  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
755  }
756 }
757 
759 {
760  try
761  {
763 
764  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedSingleLayerItems();
765 
766  if(selectedLayerItems.empty())
767  {
768  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
769  tr("Select a single layer in the layer explorer!"));
770  return;
771  }
772 
773  te::qt::widgets::AbstractTreeItem* selectedLayerItem = *(selectedLayerItems.begin());
774  te::map::AbstractLayerPtr selectedLayer = selectedLayerItem->getLayer();
775 
776  std::list<te::map::AbstractLayerPtr> layers;
777  layers.push_back(selectedLayer);
778 
779  dlg.setLayers(layers);
780 
781  dlg.exec();
782  }
783  catch(const std::exception& e)
784  {
785  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
786  }
787 }
788 
790 {
791  if(m_project == 0)
792  {
793  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no current project."));
794  return;
795  }
796 
797  ProjectInfoDialog editor(this);
798  editor.setProject(m_project);
799 
800  if(editor.exec() == QDialog::Accepted)
801  {
802  QString projectTile(tr(" - Project: %1 - %2"));
803  std::string fName = boost::filesystem::basename(m_project->getFileName()) + boost::filesystem::extension(m_project->getFileName());
804  setWindowTitle(te::qt::af::ApplicationController::getInstance().getAppTitle() + projectTile.arg(m_project->getTitle().c_str(), fName.c_str()));
805  }
806 }
807 
809 {
810  // Get the parent item where the folder layer will be added.
811  te::map::AbstractLayerPtr parentLayer(0);
812 
813  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedLayerItems();
814 
815  if(selectedLayerItems.size() == 1 && selectedLayerItems.front()->getItemType() == "FOLDER_LAYER_ITEM")
816  parentLayer = selectedLayerItems.front()->getLayer();
817 
818  // Get the folder layer to be added
819  bool ok;
820  QString text = QInputDialog::getText(this, ApplicationController::getInstance().getAppTitle(),
821  tr("Folder layer name:"), QLineEdit::Normal,
822  tr("Enter folder layer name"), &ok);
823 
824  if (!ok)
825  return;
826 
827  if(text.isEmpty())
828  {
829  QMessageBox::warning(this, ApplicationController::getInstance().getAppTitle(), tr("Enter the layer name!"));
830  return;
831  }
832 
833  static boost::uuids::basic_random_generator<boost::mt19937> gen;
834  boost::uuids::uuid u = gen();
835  std::string id = boost::uuids::to_string(u);
836 
838  folderLayer->setTitle(text.toStdString());
839  folderLayer->setId(id);
840 
841  te::qt::af::evt::LayerAdded evt(folderLayer, parentLayer);
843 
844  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
845  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
846 }
847 
849 {
850  std::list<te::qt::widgets::AbstractTreeItem*> layers = m_explorer->getExplorer()->getSelectedItems();
851 
852  if(layers.empty())
853  {
854  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no selected layer."));
855  return;
856  }
857 
858  // Docking
859  QDockWidget* doc = new QDockWidget(this, Qt::Dialog);
860 
861  te::qt::widgets::LayerPropertiesInfoWidget* info = new te::qt::widgets::LayerPropertiesInfoWidget((*(layers.begin()))->getLayer().get(), doc);
862 
863  doc->setWidget(info);
864  doc->setWindowTitle(info->windowTitle());
865  doc->setAttribute(Qt::WA_DeleteOnClose, true);
866 
867  doc->show();
868 }
869 
871 {
872  std::list<te::map::AbstractLayerPtr> layers = m_explorer->getExplorer()->getSelectedSingleLayers();
873 
874  if(layers.empty())
875  {
876  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no selected layer."));
877  return;
878  }
879 
880  std::list<te::map::AbstractLayerPtr>::iterator it = layers.begin();
881 
882  while(it != layers.end())
883  {
884  te::map::AbstractLayerPtr layer = (*it);
885  layer->clearSelected();
886 
887  ++it;
888 
891  }
892 }
893 
895 {
896  std::list<te::qt::widgets::AbstractTreeItem*> layers = m_explorer->getExplorer()->getSelectedItems();
897 
898  if(layers.empty())
899  {
900  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no selected layer."));
901  return;
902  }
903  te::qt::widgets::SRSManagerDialog srsDialog(this);
904  srsDialog.setWindowTitle(tr("Choose the SRS"));
905 
906  if(srsDialog.exec() == QDialog::Rejected)
907  return;
908 
909  std::pair<int, std::string> srid = srsDialog.getSelectedSRS();
910 
911  te::map::AbstractLayerPtr lay = (*layers.begin())->getLayer();
912 
913  lay->setSRID(srid.first);
914 }
915 
917 {
918  std::list<te::qt::widgets::AbstractTreeItem*> layers = m_explorer->getExplorer()->getSelectedItems();
919 
920  if(layers.empty())
921  {
922  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no selected layer."));
923  return;
924  }
925 
926  te::map::AbstractLayerPtr lay = (*layers.begin())->getLayer();
927 
928  if (lay->getSchema()->hasRaster())
929  return;
930 
931 
932  te::qt::af::DataSetTableDockWidget* doc = GetLayerDock(lay.get(), m_tableDocks);
933 
934  if(doc == 0)
935  {
936  doc = new te::qt::af::DataSetTableDockWidget(this);
937  doc->setLayer(lay.get());
938  addDockWidget(Qt::BottomDockWidgetArea, doc);
939 
940  connect (doc, SIGNAL(closed(te::qt::af::DataSetTableDockWidget*)), SLOT(onLayerTableClose(te::qt::af::DataSetTableDockWidget*)));
941 
942  if(!m_tableDocks.empty())
943  tabifyDockWidget(m_tableDocks[m_tableDocks.size()-1], doc);
944 
945  m_tableDocks.push_back(doc);
946 
948  }
949 
950  doc->show();
951  doc->raise();
952 
953  m_viewDataTable->setChecked(true);
954 
955  m_viewDataTable->setEnabled(true);
956 }
957 
959 {
960  try
961  {
962  std::list<te::map::AbstractLayerPtr> selectedLayers = m_explorer->getExplorer()->getSelectedSingleLayers();
963 
964  if(selectedLayers.empty())
965  {
966  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
967  tr("Select a layer in the layer explorer!"));
968  return;
969  }
970 
971  // The histogram will be created based on the first selected layer
972  te::map::AbstractLayerPtr selectedLayer = *(selectedLayers.begin());
973 
974  const te::map::LayerSchema* schema = selectedLayer->getSchema().release();
975 
976  te::da::DataSet* dataset = selectedLayer->getData().release();
977  te::da::DataSetType* dataType = (te::da::DataSetType*) schema;
978 
979  te::qt::widgets::HistogramDialog dlg(dataset, dataType, this);
980 
981  int res = dlg.exec();
982  if (res == QDialog::Accepted)
983  {
985  doc->setSelectionColor(ApplicationController::getInstance().getSelectionColor());
986  doc->setWindowTitle("Histogram");
987  doc->setWindowIcon(QIcon::fromTheme("chart-bar"));
988  doc->setLayer(selectedLayer.get());
989 
991  addDockWidget(Qt::RightDockWidgetArea, doc, Qt::Horizontal);
992  doc->show();
993  }
994  }
995  catch(const std::exception& e)
996  {
997  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
998  }
999 }
1000 
1002 {
1003  try
1004  {
1005  std::list<te::map::AbstractLayerPtr> selectedLayers = m_explorer->getExplorer()->getSelectedSingleLayers();
1006 
1007  if(selectedLayers.empty())
1008  {
1009  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1010  tr("Select a layer in the layer explorer!"));
1011  return;
1012  }
1013 
1014  // The scatter will be created based on the first selected layer
1015  te::map::AbstractLayerPtr selectedLayer = *(selectedLayers.begin());
1016 
1017  const te::map::LayerSchema* schema = selectedLayer->getSchema().release();
1018 
1019  te::da::DataSet* dataset = selectedLayer->getData().release();
1020  te::da::DataSetType* dataType = (te::da::DataSetType*) schema;
1021 
1022  te::qt::widgets::ScatterDialog dlg(dataset, dataType, this);
1023  int res = dlg.exec();
1024  if (res == QDialog::Accepted)
1025  {
1027 
1028  doc->setSelectionColor(ApplicationController::getInstance().getSelectionColor());
1029  doc->setWindowTitle("Scatter");
1030  doc->setWindowIcon(QIcon::fromTheme("chart-scatter"));
1032  doc->setLayer(selectedLayer.get());
1033 
1034  addDockWidget(Qt::RightDockWidgetArea, doc, Qt::Horizontal);
1035  doc->show();
1036  }
1037  }
1038  catch(const std::exception& e)
1039  {
1040  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1041  }
1042 }
1043 
1045 {
1046  try
1047  {
1048  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedSingleLayerItems();
1049 
1050  if(selectedLayerItems.empty())
1051  {
1052  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1053  tr("Select a single layer in the layer explorer!"));
1054  return;
1055  }
1056 
1057  // The chart will be accomplished only on the first single layer selected
1058  te::qt::widgets::AbstractTreeItem* selectedLayerItem = *(selectedLayerItems.begin());
1059  te::map::AbstractLayerPtr selectedLayer = selectedLayerItem->getLayer();
1060 
1062  dlg.setLayer(selectedLayer);
1063 
1064  // If the selected layer has a chart associated to it, set the chart layer
1065  // dialog for initializing with this chart.
1066  te::map::Chart* chart = selectedLayer->getChart();
1067 
1068  if(chart)
1069  dlg.setChart(chart);
1070 
1071  // Check if the selected layer item has a chart item; in positive case, remove it from the layer item.
1072  te::qt::widgets::ChartItem* chartItem = selectedLayerItem->findChild<te::qt::widgets::ChartItem*>();
1073 
1074  if(chartItem)
1075  m_explorer->getExplorer()->remove(chartItem);
1076 
1077  // Collapse the selected layer item to allow the new chart item to be generated
1078  // in the next time the selected layer item is expanded.
1079  m_explorer->getExplorer()->collapse(selectedLayerItem);
1080 
1081  if(dlg.exec() == QDialog::Accepted)
1082  {
1083  // Expand the selected layer item and the chart item
1084  m_explorer->getExplorer()->expand(selectedLayerItem);
1085 
1086  chartItem = selectedLayerItem->findChild<te::qt::widgets::ChartItem*>();
1087  if(chartItem)
1088  m_explorer->getExplorer()->expand(chartItem);
1089 
1090  m_display->getDisplay()->refresh();
1091 
1092  // Send out an event informing that the project is not saved
1093  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
1094  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
1095  }
1096  }
1097  catch(const std::exception& e)
1098  {
1099  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1100  }
1101 }
1102 
1104 {
1105  try
1106  {
1107  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedSingleLayerItems();
1108 
1109  if(selectedLayerItems.empty())
1110  {
1111  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1112  tr("Select a single layer in the layer explorer!"));
1113  return;
1114  }
1115 
1116  // The object grouping will be accomplished only on the first layer selected
1117  te::qt::widgets::AbstractTreeItem* selectedLayerItem = *(selectedLayerItems.begin());
1118  te::map::AbstractLayerPtr selectedLayer = selectedLayerItem->getLayer();
1119 
1121  dlg.setLayer(selectedLayer);
1122 
1123  // Check if the selected layer item has a grouping item; in positive case, remove it from the layer item.
1124  te::qt::widgets::GroupingItem* groupingItem = selectedLayerItem->findChild<te::qt::widgets::GroupingItem*>();
1125 
1126  if(groupingItem)
1127  m_explorer->getExplorer()->remove(groupingItem);
1128 
1129  // Check if the selected layer item has a color map item; in positive case, remove it from the layer item.
1130  te::qt::widgets::ColorMapItem* cmi = selectedLayerItem->findChild<te::qt::widgets::ColorMapItem*>();
1131 
1132  if(cmi)
1133  m_explorer->getExplorer()->remove(cmi);
1134 
1135  // Collapse the selected layer item to allow the new grouping item to be generated
1136  // in the next time the selected layer item is expanded.
1137  m_explorer->getExplorer()->collapse(selectedLayerItem);
1138 
1139  if(dlg.exec() == QDialog::Accepted)
1140  {
1141  // Expand the selected layer item and the grouping item
1142  m_explorer->getExplorer()->expand(selectedLayerItem);
1143 
1144  groupingItem = selectedLayerItem->findChild<te::qt::widgets::GroupingItem*>();
1145  if(groupingItem)
1146  m_explorer->getExplorer()->expand(groupingItem);
1147 
1148  cmi = selectedLayerItem->findChild<te::qt::widgets::ColorMapItem*>();
1149  if(cmi)
1150  m_explorer->getExplorer()->expand(cmi);
1151 
1152  m_display->getDisplay()->refresh();
1153 
1154  // Send out an event informing that the project is not saved
1155  te::qt::af::evt::ProjectUnsaved projectUnsavedEvent;
1156  ApplicationController::getInstance().broadcast(&projectUnsavedEvent);
1157  }
1158  }
1159  catch(const std::exception& e)
1160  {
1161  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1162  }
1163 }
1164 
1166 {
1167  te::qt::widgets::SRSManagerDialog srsDialog(this);
1168  srsDialog.setWindowTitle(tr("Choose the SRS"));
1169 
1170  if(srsDialog.exec() == QDialog::Rejected)
1171  return;
1172 
1173  std::pair<int, std::string> srid = srsDialog.getSelectedSRS();
1174 
1175  te::qt::af::evt::MapSRIDChanged mapSRIDChagned(srid);
1176  ApplicationController::getInstance().broadcast(&mapSRIDChagned);
1177 
1178  m_display->getDisplay()->setSRID(srid.first);
1179 }
1180 
1182 {
1183  std::pair<int, std::string> srid = std::make_pair(TE_UNKNOWN_SRS, "");
1184  te::qt::af::evt::MapSRIDChanged mapSRIDChagned(srid);
1185  ApplicationController::getInstance().broadcast(&mapSRIDChagned);
1186 
1187  m_display->getDisplay()->setSRID(TE_UNKNOWN_SRS);
1188 }
1189 
1191 {
1194 
1195  m_display->draw(ApplicationController::getInstance().getProject()->getVisibleSingleLayers());
1196 }
1197 
1199 {
1200  try
1201  {
1202  std::list<te::map::AbstractLayerPtr> selectedLayers = m_explorer->getExplorer()->getSelectedSingleLayers();
1203 
1204  if(selectedLayers.empty())
1205  {
1206  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1207  tr("Select a layer in the layer explorer!"));
1208  return;
1209  }
1210 
1211  // The layer fitting will be accomplished only on the first layer selected
1212  te::map::AbstractLayerPtr selectedLayer = *(selectedLayers.begin());
1213 
1214  te::qt::widgets::MapDisplay* display = m_display->getDisplay();
1215 
1216  te::gm::Envelope env = selectedLayer->getExtent();
1217 
1218  if( (display->getSRID() == TE_UNKNOWN_SRS && selectedLayer->getSRID() == TE_UNKNOWN_SRS) || (display->getSRID() == selectedLayer->getSRID()))
1219  {
1220  display->setExtent(env, true);
1221  return;
1222  }
1223 
1224  if(display->getSRID() == TE_UNKNOWN_SRS || selectedLayer->getSRID() == TE_UNKNOWN_SRS)
1225  {
1226  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(),
1227  TR_QT_AF("The spatial reference system of the map display and the layer are not compatible!"));
1228  return;
1229  }
1230 
1231  if(display->getSRID() != selectedLayer->getSRID())
1232  env.transform(selectedLayer->getSRID(), display->getSRID());
1233 
1234  display->setExtent(env, true);
1235  }
1236  catch(const std::exception& e)
1237  {
1238  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1239  }
1240 }
1241 
1243 {
1244  std::list<te::map::AbstractLayerPtr> layers = m_explorer->getExplorer()->getSelectedSingleLayers();
1245  if(layers.empty())
1246  {
1247  QString msg = tr("Select at least a layer to accomplish this operation!");
1248  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msg);
1249  return;
1250  }
1251 
1252  te::gm::Envelope finalEnv = te::map::GetSelectedExtent(layers, m_display->getDisplay()->getSRID(), true);
1253 
1254  if(!finalEnv.isValid())
1255  {
1256  QString msg = tr("Select object(s) in the selected layer(s) to accomplish this operation!");
1257  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msg);
1258  return;
1259  }
1260 
1261  m_display->getDisplay()->setExtent(finalEnv, true);
1262 }
1263 
1265 {
1266  std::list<te::map::AbstractLayerPtr> layers = m_explorer->getExplorer()->getSelectedSingleLayers();
1267  if(layers.empty())
1268  {
1269  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), tr("There's no selected layer."));
1270  return;
1271  }
1272 
1273  te::map::MapDisplay* display = m_display->getDisplay();
1274 
1275  te::gm::Envelope selectedExtent = te::map::GetSelectedExtent(layers, display->getSRID(), true);
1276 
1277  te::gm::Coord2D centerOfSelectedExtent = selectedExtent.getCenter();
1278 
1279  te::gm::Envelope displayExtent = display->getExtent();
1280 
1281  double halfWidth = displayExtent.getWidth() * 0.5;
1282  double halfHeight = displayExtent.getHeight() * 0.5;
1283 
1284  te::gm::Envelope newExtent;
1285 
1286  newExtent.m_llx = centerOfSelectedExtent.x - halfWidth;
1287  newExtent.m_lly = centerOfSelectedExtent.y - halfHeight;
1288 
1289  newExtent.m_urx = centerOfSelectedExtent.x + halfWidth;
1290  newExtent.m_ury = centerOfSelectedExtent.y + halfHeight;
1291 
1292  display->setExtent(newExtent);
1293 }
1294 
1296 {
1298  dlg->setAttribute(Qt::WA_DeleteOnClose, true);
1299 
1300  if(m_project)
1301  dlg->setList(m_project->getTopLayers());
1302 
1303  std::list<te::qt::widgets::AbstractTreeItem*> selectedLayerItems = m_explorer->getExplorer()->getSelectedSingleLayerItems();
1304 
1305  if(!selectedLayerItems.empty())
1306  {
1307  te::qt::widgets::AbstractTreeItem* selectedLayerItem = *(selectedLayerItems.begin());
1308  te::map::AbstractLayerPtr selectedLayer = selectedLayerItem->getLayer();
1309 
1310  dlg->setCurrentLayer(selectedLayer);
1311  }
1312 
1313  connect(dlg, SIGNAL(highlightLayerObjects(const te::map::AbstractLayerPtr&, te::da::DataSet*, const QColor&)),
1314  SLOT(onHighlightLayerObjects(const te::map::AbstractLayerPtr&, te::da::DataSet*, const QColor&)));
1315 
1316  connect(dlg, SIGNAL(layerSelectedObjectsChanged(const te::map::AbstractLayerPtr&)),
1317  SLOT(onLayerSelectedObjectsChanged(const te::map::AbstractLayerPtr&)));
1318 
1319  dlg->show();
1320 }
1321 
1323 {
1324  if(!checked)
1325  return;
1326 
1327  QCursor zoomAreaCursor(QIcon::fromTheme("zoom-in").pixmap(m_mapCursorSize));
1328 
1329  te::qt::widgets::ZoomArea* zoomArea = new te::qt::widgets::ZoomArea(m_display->getDisplay(), zoomAreaCursor);
1330  m_display->setCurrentTool(zoomArea);
1331 
1334 }
1335 
1337 {
1338  if(!checked)
1339  return;
1340 
1341  QCursor zoomOutCursor(QIcon::fromTheme("zoom-out").pixmap(m_mapCursorSize));
1342 
1343  te::qt::widgets::ZoomClick* zoomOut = new te::qt::widgets::ZoomClick(m_display->getDisplay(), zoomOutCursor, 2.0, te::qt::widgets::Zoom::Out);
1344  m_display->setCurrentTool(zoomOut);
1345 
1348 }
1349 
1351 {
1352  m_display->previousExtent();
1353 }
1354 
1356 {
1357  m_display->nextExtent();
1358 }
1359 
1361 {
1362  if(!checked)
1363  return;
1364 
1365  te::qt::widgets::Pan* pan = new te::qt::widgets::Pan(m_display->getDisplay(), Qt::OpenHandCursor, Qt::ClosedHandCursor);
1366  m_display->setCurrentTool(pan);
1367 
1370 }
1371 
1373 {
1374  if(!m_project && m_project->getTopLayers().empty())
1375  return;
1376 
1377  //m_display->fit(m_explorer->getExplorer()->getAllLayers());
1378  m_display->fit(te::qt::af::ApplicationController::getInstance().getProject()->getAllLayers());
1379 
1380 }
1381 
1383 {
1384  if(!checked)
1385  return;
1386 
1387  QPixmap pxmap = QIcon::fromTheme("pointer-info").pixmap(m_mapCursorSize);
1388  QCursor infoCursor(pxmap, 0, 0);
1389 
1390  te::qt::widgets::Info* info = new te::qt::widgets::Info(m_display->getDisplay(), infoCursor, m_explorer->getExplorer()->getSelectedSingleLayers());
1391  m_display->setCurrentTool(info);
1392 
1393  connect(m_explorer->getExplorer(), SIGNAL(selectedLayersChanged(const std::list<te::map::AbstractLayerPtr>&)), info, SLOT(setLayers(const std::list<te::map::AbstractLayerPtr>&)));
1394 }
1395 
1397 {
1398  //std::list<te::map::AbstractLayerPtr> layers = m_explorer->getExplorer()->getAllLayers();
1399  std::list<te::map::AbstractLayerPtr> layers = te::qt::af::ApplicationController::getInstance().getProject()->getAllLayers();
1400  std::list<te::map::AbstractLayerPtr>::iterator it = layers.begin();
1401 
1402  while(it != layers.end())
1403  {
1404  te::map::AbstractLayerPtr layer = (*it);
1405  layer->clearSelected();
1406 
1407  ++it;
1408 
1411  }
1412 }
1413 
1415 {
1416  if(!checked)
1417  return;
1418 
1419  te::qt::widgets::Selection* selection = new te::qt::widgets::Selection(m_display->getDisplay(), Qt::ArrowCursor, m_explorer->getExplorer()->getSelectedSingleLayers());
1420  m_display->setCurrentTool(selection);
1421 
1422  connect(m_explorer->getExplorer(), SIGNAL(selectedLayersChanged(const std::list<te::map::AbstractLayerPtr>&)), selection, SLOT(setLayers(const std::list<te::map::AbstractLayerPtr>&)));
1423  connect(selection, SIGNAL(layerSelectedObjectsChanged(const te::map::AbstractLayerPtr&)), SLOT(onLayerSelectedObjectsChanged(const te::map::AbstractLayerPtr&)));
1424 
1427 }
1428 
1430 {
1431  if(!checked)
1432  return;
1433 
1435  m_display->setCurrentTool(distance);
1436 }
1437 
1439 {
1440  if(!checked)
1441  return;
1442 
1444  m_display->setCurrentTool(area);
1445 }
1446 
1448 {
1449  if(!checked)
1450  return;
1451 
1453  m_display->setCurrentTool(angle);
1454 }
1455 
1457 {
1459 }
1460 
1462 {
1463  m_progressDockWidget->setVisible(true);
1464 }
1465 
1467 {
1468  std::vector<DataSetTableDockWidget*>::iterator it;
1469 
1470  for(it=m_tableDocks.begin(); it!=m_tableDocks.end(); ++it)
1471  if(*it == wid)
1472  break;
1473 
1474  if(it != m_tableDocks.end())
1475  m_tableDocks.erase(it);
1476 
1477  if(m_tableDocks.empty())
1478  {
1479  m_viewDataTable->setChecked(false);
1480  m_viewDataTable->setEnabled(false);
1481  }
1482 
1484 }
1485 
1487 {
1488  checked ? showFullScreen() : showMaximized();
1489 }
1490 
1492 {
1493  assert(layer.get());
1494 
1497 }
1498 
1500 {
1501  assert(layer.get());
1502  assert(dataset);
1503 
1504  te::qt::af::evt::HighlightLayerObjects e(layer, dataset, color);
1506 }
1507 
1509 {
1510  m_viewLayerExplorer->blockSignals(true);
1511  m_viewLayerExplorer->setChecked(visible);
1512  m_viewLayerExplorer->blockSignals(false);
1513 }
1514 
1516 {
1517  m_viewMapDisplay->blockSignals(true);
1518  m_viewMapDisplay->setChecked(visible);
1519  m_viewMapDisplay->blockSignals(false);
1520 }
1521 
1523 {
1524  if(m_tableDocks.empty())
1525  return;
1526 
1527  for(std::size_t i = 0; i < m_tableDocks.size(); ++i)
1528  {
1529  if(visible)
1530  m_tableDocks[i]->show();
1531  else
1532  m_tableDocks[i]->hide();
1533  }
1534 
1535  m_viewDataTable->setChecked(visible);
1536 }
1537 
1539 {
1540  m_viewStyleExplorer->blockSignals(true);
1541  m_viewStyleExplorer->setChecked(visible);
1542  m_viewStyleExplorer->blockSignals(false);
1543 }
1544 
1546 {
1547  try
1548  {
1549  std::auto_ptr<te::qt::widgets::DataSourceExplorerDialog> dExplorer(new te::qt::widgets::DataSourceExplorerDialog(this));
1550 
1551  QString dsTypeSett = GetLastDatasourceFromSettings();
1552 
1553  if(!dsTypeSett.isNull() && !dsTypeSett.isEmpty())
1554  dExplorer->setDataSourceToUse(dsTypeSett);
1555 
1556 
1557  int retval = dExplorer->exec();
1558 
1559  if(retval == QDialog::Rejected)
1560  return;
1561 
1562  std::list<te::da::DataSourceInfoPtr> selectedDatasources = dExplorer->getSelecteds();
1563 
1564  if(selectedDatasources.empty())
1565  return;
1566 
1567  dExplorer.reset(0);
1568 
1569  const std::string& dsTypeId = selectedDatasources.front()->getType();
1570 
1571  SaveLastDatasourceOnSettings(dsTypeId.c_str());
1572  }
1573  catch(const std::exception& e)
1574  {
1575  QMessageBox::warning(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), e.what());
1576  }
1577  catch(...)
1578  {
1579  QMessageBox::warning(this,
1581  tr("DataSetExplorer Error!"));
1582  }
1583 }
1584 
1585 void te::qt::af::BaseApplication::openProject(const QString& projectFileName)
1586 {
1587  try
1588  {
1589  checkProjectSave();
1590 
1591  if(!boost::filesystem::exists(projectFileName.toStdString()))
1592  {
1593  QMessageBox::critical(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), (boost::format(TR_QT_AF("This project could not be found: %1%.")) % projectFileName.toStdString()).str().c_str());
1594  return;
1595  }
1596 
1597  CloseAllTables(m_tableDocks);
1598 
1599  Project* nproject = te::qt::af::ReadProject(projectFileName.toStdString());
1600 
1601  delete m_project;
1602 
1603  m_project = nproject;
1604 
1605  ApplicationController::getInstance().updateRecentProjects(projectFileName, m_project->getTitle().c_str());
1606 
1607  QString projectTile(tr(" - Project: %1 - %2"));
1608  std::string fName = boost::filesystem::basename(m_project->getFileName()) + boost::filesystem::extension(m_project->getFileName());
1609  setWindowTitle(te::qt::af::ApplicationController::getInstance().getAppTitle() + projectTile.arg(m_project->getTitle().c_str(), fName.c_str()));
1610 
1612 
1613  te::qt::af::evt::ProjectAdded evt(m_project);
1614 
1616  }
1617  catch(const te::common::Exception& e)
1618  {
1619  throw e;
1620  }
1621  catch(...)
1622  {
1623  QString msg(tr("Fail to open project: %1"));
1624 
1625  msg = msg.arg(projectFileName);
1626 
1627  throw Exception(TR_QT_AF(msg.toStdString()));
1628  }
1629 }
1630 
1632 {
1633  if(m_project != 0 && m_project->hasChanged())
1634  {
1635  QString msg("The current project has unsaved changes. Do you want to save them?");
1636  int btn = QMessageBox::question(this, te::qt::af::ApplicationController::getInstance().getAppTitle(), msg, QMessageBox::No, QMessageBox::Yes);
1637 
1638  if(btn == QMessageBox::Yes)
1639  onSaveProjectTriggered();
1640  }
1641 }
1642 
1644 {
1645  CloseAllTables(m_tableDocks);
1646 
1647  checkProjectSave();
1648 
1649  delete m_project;
1650 
1651  m_project = new Project;
1652 
1653  QString author;
1654  int maxSaved;
1655 
1656  GetProjectInformationsFromSettings(author, maxSaved);
1657 
1658  m_project->setTitle("New Project");
1659 
1660  m_project->setAuthor(author.toStdString());
1661 
1662  QString projectTile(tr(" - Project: %1 - %2"));
1663  std::string fName = boost::filesystem::basename(m_project->getFileName()) + boost::filesystem::extension(m_project->getFileName());
1664  setWindowTitle(te::qt::af::ApplicationController::getInstance().getAppTitle() + projectTile.arg(m_project->getTitle().c_str(), fName.c_str()));
1665 
1667 
1668  m_project->setProjectAsChanged(false);
1669 
1670  te::qt::af::evt::ProjectAdded evt(m_project);
1671 
1673 }
1674 
1676 {
1677  initActions();
1678 
1679  initMenus();
1680 
1681  initToolbars();
1682 
1683  initSlotsConnections();
1684 
1685  // Initializing well known widgets
1686 
1687  // 1. Layer Explorer
1688  QAction* act = new QAction(this);
1689  act->setSeparator(true);
1690 
1692  lexplorer->setObjectName("LayerExplorerDockWidget");
1693  te::qt::widgets::LayerTreeView* treeView = lexplorer->getTreeView();
1694  treeView->setAnimated(true);
1695 
1696  // **********************************************************************************************
1697  // Add the actions to the context menu of the tree view according to the number of selected items
1698  // **********************************************************************************************
1699 
1700  /****************** Actions to be added to the context menu when there is no item selected ******************/
1701 
1702  treeView->add(m_projectAddLayerMenu->menuAction(), "", "", te::qt::widgets::LayerTreeView::NO_ITEM_SELECTED);
1703 
1704  QAction* noItemSelectedSep = new QAction(this);
1705  noItemSelectedSep->setSeparator(true);
1706  treeView->add(noItemSelectedSep, "", "", te::qt::widgets::LayerTreeView::NO_ITEM_SELECTED);
1707 
1708  treeView->add(m_projectAddFolderLayer, "", "", te::qt::widgets::LayerTreeView::NO_ITEM_SELECTED);
1709 
1710  /****************** Actions to be added to the context menu when there is a unique item selected ******************/
1711 
1712  // Actions for the folder layer item
1713  treeView->add(m_projectAddLayerMenu->menuAction(), "", "FOLDER_LAYER_ITEM");
1714 
1715  QAction* folderSep1 = new QAction(this);
1716  folderSep1->setSeparator(true);
1717  treeView->add(folderSep1, "", "FOLDER_LAYER_ITEM");
1718 
1719  treeView->add(m_projectAddFolderLayer, "", "FOLDER_LAYER_ITEM");
1720 
1721  QAction* folderSep2 = new QAction(this);
1722  folderSep2->setSeparator(true);
1723  treeView->add(folderSep2, "", "FOLDER_LAYER_ITEM");
1724 
1725  treeView->add(m_projectRemoveLayer, "", "FOLDER_LAYER_ITEM");
1726  treeView->add(m_projectRenameLayer, "", "FOLDER_LAYER_ITEM");
1727 
1728  // Actions for the single layer item that is not a raster layer
1729  treeView->add(m_layerObjectGrouping);
1730  treeView->add(m_toolsDataExchangerDirectPopUp);
1731  treeView->add(m_layerChartsHistogram);
1732  treeView->add(m_layerChart);
1733  treeView->add(m_queryLayer);
1734  treeView->add(m_layerChartsScatter);
1735 
1736  QAction* actionChartSep = new QAction(this);
1737  actionChartSep->setSeparator(true);
1738  treeView->add(actionChartSep);
1739 
1740  treeView->add(m_layerShowTable);
1741  treeView->add(m_viewStyleExplorer);
1742 
1743  QAction* actionStyleSep = new QAction(this);
1744  actionStyleSep->setSeparator(true);
1745  treeView->add(actionStyleSep);
1746 
1747  treeView->add(m_layerRemoveObjectSelection);
1748  treeView->add(m_projectRemoveLayer);
1749  treeView->add(m_projectRenameLayer);
1750 
1751  QAction* actionRemoveSep = new QAction(this);
1752  actionRemoveSep->setSeparator(true);
1753  treeView->add(actionRemoveSep);
1754 
1755  treeView->add(m_layerFitOnMapDisplay);
1756  treeView->add(m_layerFitSelectedOnMapDisplay);
1757  treeView->add(m_layerPanToSelectedOnMapDisplay);
1758 
1759  QAction* actionFitSep = new QAction(this);
1760  actionFitSep->setSeparator(true);
1761  treeView->add(actionFitSep);
1762 
1763  treeView->add(m_layerSRS);
1764 
1765  QAction* actionSRSSep = new QAction(this);
1766  actionSRSSep->setSeparator(true);
1767  treeView->add(actionSRSSep);
1768 
1769  treeView->add(m_layerProperties);
1770 
1771  // Actions for the items of a layer item such as the chart item and the grouping item
1772  treeView->add(m_layerRemoveItem, "", "ITEM_OF_LAYER");
1773 
1774  // Actions for the raster layer item
1775  treeView->add(m_layerObjectGrouping, "", "RASTER_LAYER_ITEM");
1776  treeView->add(m_layerChartsHistogram, "", "RASTER_LAYER_ITEM");
1777 
1778  QAction* rasterSep1 = new QAction(this);
1779  rasterSep1->setSeparator(true);
1780  treeView->add(rasterSep1, "", "RASTER_LAYER_ITEM");
1781 
1782  treeView->add(m_viewStyleExplorer, "", "RASTER_LAYER_ITEM");
1783 
1784  QAction* rasterSep2 = new QAction(this);
1785  rasterSep2->setSeparator(true);
1786  treeView->add(rasterSep2, "", "RASTER_LAYER_ITEM");
1787 
1788  treeView->add(m_projectRemoveLayer, "", "RASTER_LAYER_ITEM");
1789  treeView->add(m_projectRenameLayer, "", "RASTER_LAYER_ITEM");
1790 
1791  QAction* rasterSep3 = new QAction(this);
1792  rasterSep3->setSeparator(true);
1793  treeView->add(rasterSep3, "", "RASTER_LAYER_ITEM");
1794 
1795  treeView->add(m_layerFitOnMapDisplay, "", "RASTER_LAYER_ITEM");
1796 
1797  QAction* rasterSep4 = new QAction(this);
1798  rasterSep4->setSeparator(true);
1799  treeView->add(rasterSep4, "", "RASTER_LAYER_ITEM");
1800 
1801  treeView->add(m_layerSRS, "", "RASTER_LAYER_ITEM");
1802 
1803  QAction* rasterSep5 = new QAction(this);
1804  rasterSep5->setSeparator(true);
1805  treeView->add(rasterSep5, "", "RASTER_LAYER_ITEM");
1806 
1807  treeView->add(m_layerProperties, "", "RASTER_LAYER_ITEM");
1808 
1809  /********* Actions to be added to the context menu when there are multiple items selected ***********/
1810 
1811  treeView->add(m_layerFitSelectedOnMapDisplay, "", "DATASET_LAYER_ITEM", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
1812  treeView->add(m_layerPanToSelectedOnMapDisplay, "", "DATASET_LAYER_ITEM", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
1813 
1814  treeView->add(m_layerFitSelectedOnMapDisplay, "", "QUERY_LAYER_ITEM", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
1815  treeView->add(m_layerPanToSelectedOnMapDisplay, "", "QUERY_LAYER_ITEM", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
1816 
1817  QAction* multipleSelectedSep = new QAction(this);
1818  multipleSelectedSep->setSeparator(true);
1819  treeView->add(multipleSelectedSep, "", "", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
1820 
1821  treeView->add(m_projectRemoveLayer, "", "", te::qt::widgets::LayerTreeView::MULTIPLE_ITEMS_SELECTED);
1822 
1823  // ********** End the actions to be added to the context menu ********
1824 
1825  QMainWindow::addDockWidget(Qt::LeftDockWidgetArea, lexplorer);
1826 
1827  connect(m_viewLayerExplorer, SIGNAL(toggled(bool)), lexplorer, SLOT(setVisible(bool)));
1828  m_viewLayerExplorer->setChecked(true);
1829  connect(lexplorer, SIGNAL(visibilityChanged(bool)), this, SLOT(onLayerExplorerVisibilityChanged(bool)));
1830 
1831  m_explorer = new te::qt::af::LayerExplorer(lexplorer, this);
1832 
1833 // 2. Map Display
1834  te::qt::widgets::MapDisplay* map = new te::qt::widgets::MultiThreadMapDisplay(QSize(512, 512), this);
1836  m_display = new te::qt::af::MapDisplay(map);
1837 
1838  connect(m_display, SIGNAL(hasPreviousExtent(bool)), m_mapPreviousExtent, SLOT(setEnabled(bool)));
1839  connect(m_display, SIGNAL(hasNextExtent(bool)), m_mapNextExtent, SLOT(setEnabled(bool)));
1840 
1841 // 3. Symbolizer Explorer
1842 
1843  te::qt::widgets::StyleDockWidget* stylelDock = new te::qt::widgets::StyleDockWidget(tr("Style Explorer"), this);
1844  stylelDock->setObjectName("StyleDockWidget");
1845  QMainWindow::addDockWidget(Qt::RightDockWidgetArea, stylelDock);
1846  stylelDock->connect(m_viewStyleExplorer, SIGNAL(toggled(bool)), SLOT(setVisible(bool)));
1847  m_viewStyleExplorer->setChecked(false);
1848  stylelDock->setVisible(false);
1849  connect(stylelDock, SIGNAL(visibilityChanged(bool)), this, SLOT(onStyleExplorerVisibilityChanged(bool)));
1850  connect(stylelDock, SIGNAL(repaintMapDisplay()), this, SLOT(onDrawTriggered()));
1851 
1852  m_styleExplorer = new te::qt::af::StyleExplorer(stylelDock, this);
1853 
1854  initStatusBar();
1855 
1856 // 3. Data Table
1857 // te::qt::widgets::TabularViewer* view = new te::qt::widgets::TabularViewer(this);
1858 
1859  // m_viewer = new te::qt::af::TabularViewer(view);
1860 
1861 // registering framework listeners
1866  //te::qt::af::ApplicationController::getInstance().addListener(m_viewer);
1867 
1868 // initializing connector widgets
1869  QDockWidget* doc = new QDockWidget(tr("Map Display"), this);
1870  doc->setWidget(map);
1871  QMainWindow::setCentralWidget(doc);
1872  doc->connect(m_viewMapDisplay, SIGNAL(toggled(bool)), SLOT(setVisible(bool)));
1873  m_viewMapDisplay->setChecked(true);
1874  connect(doc, SIGNAL(visibilityChanged(bool)), this, SLOT(onDisplayVisibilityChanged(bool)));
1875 
1876  // View Data Table
1877  connect(m_viewDataTable, SIGNAL(toggled(bool)), this, SLOT(onDisplayDataTableChanged(bool)));
1878 
1879 /* doc = new QDockWidget(tr("Data Table"), this);
1880  doc->setWidget(view);
1881  QMainWindow::addDockWidget(Qt::BottomDockWidgetArea, doc);
1882  doc->connect(m_viewDataTable, SIGNAL(toggled(bool)), SLOT(setVisible(bool)));
1883  m_viewDataTable->setChecked(false);
1884  doc->setVisible(false);
1885 */
1886 
1887 // Progress support
1889  pvb->setFixedWidth(220);
1891 
1894 
1895  m_statusbar->addPermanentWidget(pvb);
1896 
1897  connect(pvb, SIGNAL(clicked()), this, SLOT(showProgressDockWidget()));
1898 
1899  m_progressDockWidget = new QDockWidget(this);
1900  m_progressDockWidget->setObjectName("ProgressDockWidget");
1901  m_progressDockWidget->setWidget(pvw);
1902  m_progressDockWidget->setMinimumHeight(300);
1903  m_progressDockWidget->setAllowedAreas(Qt::RightDockWidgetArea);
1904  m_progressDockWidget->setWindowTitle(tr("Tasks Progress"));
1905  addDockWidget(Qt::RightDockWidgetArea, m_progressDockWidget);
1906  m_progressDockWidget->setVisible(false);
1907 }
1908 
1910 {
1911  checkProjectSave();
1912 
1913  te::qt::af::SaveState(this);
1914 
1915  e->accept();
1916 }
1917 
1918 void te::qt::af::BaseApplication::initAction(QAction*& act, const QString& icon, const QString& name,
1919  const QString& text, const QString& tooltip,
1920  bool iconVisibleInMenu, bool isCheckable,
1921  bool enabled, QObject* parent)
1922 {
1923  act = new QAction (parent);
1924 
1925  if(!icon.isEmpty())
1926  act->setIcon(QIcon::fromTheme(icon));
1927 
1928  act->setObjectName(name);
1929  act->setText(text);
1930  act->setIconVisibleInMenu(iconVisibleInMenu);
1931  act->setCheckable(isCheckable);
1932  act->setEnabled(enabled);
1933 
1934 #ifndef QT_NO_TOOLTIP
1935  act->setToolTip(tooltip);
1936 #endif
1937 }
1938 
1940 {
1941 // Menu -View- actions
1942  initAction(m_viewLayerExplorer, "view-layer-explorer", "View.Layer Explorer", tr("&Layer Explorer"), tr("Show or hide the layer explorer"), true, true, true, m_menubar);
1943  initAction(m_viewMapDisplay, "view-map-display", "View.Map Display", tr("&Map Display"), tr("Show or hide the map display"), true, true, true, m_menubar);
1944  initAction(m_viewDataTable, "view-data-table", "View.Data Table", tr("&Data Table"), tr("Show or hide the data table"), true, true, true, m_menubar);
1945  initAction(m_viewStyleExplorer, "raster-visual", "View.Style Explorer", tr("&Style Explorer"), tr("Show or hide the style explorer"), true, true, true, m_menubar);
1946  initAction(m_viewFullScreen, "view-fullscreen", "View.Full Screen", tr("F&ull Screen"), tr(""), true, true, true, m_menubar);
1947  //initAction(m_viewRefresh, "view-refresh", "View.Refresh", tr("&Refresh"), tr(""), true, false, false, m_menubar); TODO
1948  //initAction(m_viewToolBars, "", "Toolbars", tr("&Toolbars"), tr(""), true, false, false);
1949  //initAction(m_viewGrid, "view-grid", "View.Grid", tr("&Grid"), tr("Show or hide the geographic grid"), true, true, false, m_menubar); TODO
1950 
1951 // Menu -Tools- actions
1952  initAction(m_toolsCustomize, "preferences-system", "Tools.Customize", tr("&Customize..."), tr("Customize the system preferences"), true, false, true, m_menubar);
1953  initAction(m_toolsDataExchanger, "datasource-exchanger", "Tools.Exchanger.All to All", tr("&Advanced..."), tr("Exchange data sets between data sources"), true, false, true, m_menubar);
1954  initAction(m_toolsDataExchangerDirect, "data-exchange-direct-icon", "Tools.Exchanger.Direct", tr("&Layer..."), tr("Exchange data sets from layers"), true, false, true, m_menubar);
1955  initAction(m_toolsDataExchangerDirectPopUp, "data-exchange-direct-icon", "Tools.Exchanger.Direct", tr("&Exchange..."), tr("Exchange data sets from layers"), true, false, true, m_menubar);
1956  initAction(m_toolsDataSourceExplorer, "datasource-explorer", "Tools.Data Source Explorer", tr("&Data Source Explorer..."), tr("Show or hide the data source explorer"),
1957  true, false, true, m_menubar);
1958 
1959 // Menu -Edit- actions
1960  //initAction(m_editUndo, "edit-undo", "Undo", tr("&Undo"), tr("Undo the last operation"), true, false, false);
1961  //initAction(m_editRedo, "edit-redo", "Redo", tr("&Redo"), tr("Redo the last operation"), true, false, false);
1962  //initAction(m_editCut, "edit-cut", "Cut", tr("Cu&t"), tr(""), true, true, false);
1963  //initAction(m_editCopy, "edit-copy", "Copy", tr("&Copy"), tr(""), true, true, false);
1964  //initAction(m_editPaste, "edit-paste", "&Paste", tr("&Paste"), tr(""), true, true, false);
1965  //initAction(m_editSelectAll, "edit-select-all", "Select All", tr("Select &All"), tr(""), true, true, false);
1966  //initAction(m_editClear, "edit-clear", "Clear", tr("C&lear"), tr(""), true, true, false);
1967  //initAction(m_editFind, "edit-find", "Find", tr("&Find..."), tr(""), true, true, false);
1968  //initAction(m_editReplace, "edit-find-replace", "Replace", tr("R&eplace..."), tr(""), true, true, false);
1969 
1970 // Menu -Plugins- actions
1971  initAction(m_pluginsManager, "plugin", "Plugins.Management", tr("&Manage Plugins..."), tr("Manage the application plugins"), true, false, true, m_menubar);
1972 
1973 // Menu -Help- actions
1974  initAction(m_helpContents, "help-browser", "Help.View Help", tr("&View Help..."), tr("Shows help dialog"), true, false, true, m_menubar);
1975  //initAction(m_helpUpdate, "system-software-update", "Help.Update", tr("&Update..."), tr(""), true, false, false, m_menubar); TODO
1976  initAction(m_helpAbout, "help-about-browser", "Help.About", tr("&About..."), tr(""), true, false, false, m_menubar);
1977 
1978 // Menu -Project- actions
1979  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);
1980  initAction(m_projectAddFolderLayer, "folderlayer-new", "Project.New Folder Layer", tr("Add &Folder Layer..."), tr("Add a new folder layer"), true, false, true, m_menubar);
1981  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);
1982  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);
1983  initAction(m_projectRemoveLayer, "layer-remove", "Project.Remove Layer", tr("&Remove Layer(s)"), tr("Remove layer(s) from the project"), true, false, true, this);
1984  initAction(m_projectRenameLayer, "layer-rename", "Project.Rename Layer", tr("Rename Layer..."), tr("Rename layer"), true, false, true, this);
1985  initAction(m_projectProperties, "document-info", "Project.Properties", tr("&Properties..."), tr("Show the project properties"), true, false, true, m_menubar);
1986  //initAction(m_projectAddLayerGraph, "", "Graph", tr("&Graph"), tr("Add a new layer from a graph"), true, false, false);
1987 
1988 // Menu -Layer- actions
1989  initAction(m_layerRemoveObjectSelection, "pointer-remove-selection", "Layer.Remove Selection", tr("&Remove Selection"), tr(""), true, false, true, m_menubar);
1990  initAction(m_layerRemoveItem, "item-remove", "Layer.Remove Item", tr("&Remove Item"), tr(""), true, false, true, m_menubar);
1991  initAction(m_layerObjectGrouping, "grouping", "Layer.ObjectGrouping", tr("&Classification..."), tr(""), true, false, true, m_menubar);
1992  initAction(m_layerProperties, "layer-info", "Layer.Properties", tr("&Properties..."), tr(""), true, false, true, m_menubar);
1993  initAction(m_layerSRS, "layer-srs", "Layer.SRS", tr("&Inform SRS..."), tr(""), true, false, true, m_menubar);
1994  initAction(m_layerShowTable, "view-data-table", "Layer.Show Table", tr("S&how Table"), tr(""), true, false, true, m_menubar);
1995  initAction(m_layerChartsHistogram, "chart-bar", "Layer.Charts.Histogram", tr("&Histogram..."), tr(""), true, false, true, m_menubar);
1996  initAction(m_layerChartsScatter, "chart-scatter", "Layer.Charts.Scatter", tr("&Scatter..."), tr(""), true, false, true, m_menubar);
1997  initAction(m_layerChart, "chart-pie", "Layer.Charts.Chart", tr("&Pie/Bar Chart..."), tr(""), true, false, true, m_menubar);
1998  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);
1999  initAction(m_layerFitSelectedOnMapDisplay, "zoom-selected-extent", "Layer.Fit Selected Objects on the Map Display", tr("Fit Selected Objects"), tr("Fit the selected objects on the Map Display"), true, false, true, m_menubar);
2000  initAction(m_layerPanToSelectedOnMapDisplay, "pan-selected", "Layer.Pan to Selected Objects on Map Display", tr("Pan to Selected Objects"), tr("Pan to the selected objects on the Map Display"), true, false, true, m_menubar);
2001  initAction(m_queryLayer, "view-filter", "Layer.Query", tr("Query..."), tr(""), true, false, true, m_menubar);
2002 
2003 // Menu -File- actions
2004  initAction(m_fileNewProject, "document-new", "File.New Project", tr("&New Project..."), tr(""), true, false, true, m_menubar);
2005  initAction(m_fileSaveProject, "document-save", "File.Save Project", tr("&Save Project"), tr(""), true, false, true, m_menubar);
2006  initAction(m_fileSaveProjectAs, "document-save-as", "File.Save Project As", tr("Save Project &As..."), tr(""), true, false, false, m_menubar);
2007  initAction(m_fileOpenProject, "document-open", "File.Open Project", tr("&Open Project..."), tr(""), true, false, true, m_menubar);
2008  initAction(m_fileExit, "system-log-out", "File.Exit", tr("E&xit"), tr(""), true, false, true, m_menubar);
2009  initAction(m_filePrintPreview, "document-print-preview", "File.Print Preview", tr("Print Pre&view..."), tr(""), true, false, false, m_menubar);
2010  initAction(m_filePrint, "document-print", "File.Print", tr("&Print..."), tr(""), true, false, false, m_menubar);
2011 
2012 // Menu -Map- actions
2013  initAction(m_mapSRID, "srs", "Map.SRID", tr("&SRS..."), tr("Config the Map SRS"), true, false, true, m_menubar);
2014  initAction(m_mapUnknownSRID, "srs-unknown", "Map.UnknownSRID", tr("&Set Unknown SRS"), tr("Set the Map SRS to unknown"), true, false, true, m_menubar);
2015  initAction(m_mapDraw, "map-draw", "Map.Draw", tr("&Draw"), tr("Draw the visible layers"), true, false, true, m_menubar);
2016  initAction(m_mapZoomIn, "zoom-in", "Map.Zoom In", tr("Zoom &In"), tr(""), true, true, true, m_menubar);
2017  initAction(m_mapZoomOut, "zoom-out", "Map.Zoom Out", tr("Zoom &Out"), tr(""), true, true, true, m_menubar);
2018  initAction(m_mapPan, "pan", "Map.Pan", tr("&Pan"), tr(""), true, true, true, m_menubar);
2019  initAction(m_mapZoomExtent, "zoom-extent", "Map.Zoom Extent", tr("Zoom &Extent"), tr(""), true, false, true, m_menubar);
2020  initAction(m_mapPreviousExtent, "edit-undo", "Map.Previous Extent", tr("&Previous Extent"), tr(""), true, false, false, m_menubar);
2021  initAction(m_mapNextExtent, "edit-redo", "Map.Next Extent", tr("&Next Extent"), tr(""), true, false, false, m_menubar);
2022  initAction(m_mapInfo, "pointer-info", "Map.Info", tr("&Info"), tr(""), true, true, true, m_menubar);
2023  initAction(m_mapRemoveSelection, "pointer-remove-selection", "Map.Remove Selection", tr("&Remove Selection"), tr(""), true, false, true, m_menubar);
2024  initAction(m_mapSelection, "pointer-selection", "Map.Selection", tr("&Selection"), tr(""), true, true, true, m_menubar);
2025  initAction(m_mapMeasureDistance, "distance-measure", "Map.Measure Distance", tr("Measure &Distance"), tr(""), true, true, true, m_menubar);
2026  initAction(m_mapMeasureArea, "area-measure", "Map.Measure Area", tr("Measure &Area"), tr(""), true, true, true, m_menubar);
2027  initAction(m_mapMeasureAngle, "angle-measure", "Map.Measure Angle", tr("Measure &Angle"), tr(""), true, true, true, m_menubar);
2028  initAction(m_mapStopDrawing, "map-draw-cancel", "Map.Stop Drawing", tr("&Stop Drawing"), tr("Stop all drawing tasks"), true, false, true, m_menubar);
2029 
2030 // Group the map tools
2031  QActionGroup* mapToolsGroup = new QActionGroup(this);
2032  mapToolsGroup->addAction(m_mapZoomIn);
2033  mapToolsGroup->addAction(m_mapZoomOut);
2034  mapToolsGroup->addAction(m_mapPan);
2035  mapToolsGroup->addAction(m_mapMeasureDistance);
2036  mapToolsGroup->addAction(m_mapMeasureArea);
2037  mapToolsGroup->addAction(m_mapMeasureAngle);
2038  mapToolsGroup->addAction(m_mapInfo);
2039  mapToolsGroup->addAction(m_mapSelection);
2040  mapToolsGroup->addAction(m_mapRemoveSelection);
2041 }
2042 
2044 {
2045 // Making menus
2046  m_menubar->setObjectName(QString::fromUtf8("menubar"));
2047  m_menubar->setGeometry(QRect(0, 0, 640, 21));
2048 
2049 // File menu
2050  m_fileMenu->setObjectName("File");
2051  m_fileMenu->setTitle(tr("&File"));
2052 
2053  m_recentProjectsMenu->setObjectName("File.Recent Projects");
2054  m_recentProjectsMenu->setTitle(tr("&Recent Projects"));
2055 
2056  m_fileMenu->addAction(m_fileNewProject);
2057  m_fileMenu->addAction(m_fileOpenProject);
2058  m_fileMenu->addAction(m_fileSaveProject);
2059  m_fileMenu->addAction(m_fileSaveProjectAs);
2060  m_fileMenu->addSeparator();
2061  m_fileMenu->addAction(m_recentProjectsMenu->menuAction());
2062  m_fileMenu->addSeparator();
2063  m_fileMenu->addAction(m_filePrintPreview);
2064  m_fileMenu->addAction(m_filePrint);
2065  m_fileMenu->addSeparator();
2066  m_fileMenu->addAction(m_fileExit);
2067 
2068 // Edit menu
2069  //m_editMenu = new QMenu(m_menubar);
2070  //m_editMenu->setObjectName("Edit");
2071  //m_editMenu->setTitle(tr("&Edit"));
2072 
2073  //m_menubar->addAction(m_editMenu->menuAction());
2074 
2075  //m_editMenu->addAction(m_editUndo);
2076  //m_editMenu->addAction(m_editRedo);
2077  //m_editMenu->addSeparator();
2078  //m_editMenu->addAction(m_editCut);
2079  //m_editMenu->addAction(m_editCopy);
2080  //m_editMenu->addAction(m_editPaste);
2081  //m_editMenu->addSeparator();
2082  //m_editMenu->addAction(m_editSelectAll);
2083  //m_editMenu->addAction(m_editClear);
2084  //m_editMenu->addSeparator();
2085  //m_editMenu->addAction(m_editFind);
2086  //m_editMenu->addAction(m_editReplace);
2087 
2088 // View menu
2089  m_viewMenu->setObjectName("View");
2090  m_viewMenu->setTitle(tr("&View"));
2091 
2092  m_viewToolBarsMenu->setObjectName("View.Toolbars");
2093  m_viewToolBarsMenu->setTitle(tr("&Toolbars"));
2094 
2095  //m_viewMenu->addAction(m_viewToolBars);
2096  m_viewMenu->addAction(m_viewDataTable);
2097  m_viewMenu->addAction(m_viewLayerExplorer);
2098  m_viewMenu->addAction(m_viewMapDisplay);
2099  m_viewMenu->addAction(m_viewStyleExplorer);
2100  //m_viewMenu->addAction(m_viewGrid); TODO
2101  m_viewMenu->addSeparator();
2102  m_viewMenu->addAction(m_viewFullScreen);
2103  m_viewMenu->addSeparator();
2104  m_viewMenu->addMenu(m_viewToolBarsMenu);
2105  //m_viewMenu->addAction(m_viewRefresh); TODO
2106 
2107 // Project menu
2108  m_projectMenu->setObjectName("Project");
2109  m_projectMenu->setTitle(tr("&Project"));
2110 
2111  m_projectMenu->addAction(m_projectAddLayerMenu->menuAction());
2112  m_projectAddLayerMenu->setObjectName("Project.Add Layer");
2113  m_projectAddLayerMenu->setTitle(tr("&Add Layer"));
2114  m_projectAddLayerMenu->setIcon(QIcon::fromTheme("layer-add"));
2115  m_projectAddLayerMenu->addAction(m_projectAddLayerTabularDataSet);
2116  m_projectAddLayerMenu->addAction(m_projectAddLayerDataset);
2117  m_projectAddLayerMenu->addSeparator();
2118  m_projectAddLayerMenu->addAction(m_projectAddLayerQueryDataSet);
2119  m_projectAddLayerMenu->addSeparator();
2120  m_projectMenu->addAction(m_projectAddFolderLayer);
2121  m_projectMenu->addSeparator();
2122  m_projectMenu->addAction(m_projectRemoveLayer);
2123  m_projectMenu->addAction(m_projectRenameLayer);
2124  m_projectMenu->addSeparator();
2125  m_projectMenu->addAction(m_projectProperties);
2126 
2127  m_layerMenu->setObjectName("Layer");
2128  m_layerMenu->setTitle(tr("&Layer"));
2129 
2130  m_layerMenu->addAction(m_layerObjectGrouping);
2131  m_layerMenu->addAction(m_layerChartsHistogram);
2132  m_layerMenu->addAction(m_layerChart);
2133  m_layerMenu->addAction(m_queryLayer);
2134  m_layerMenu->addAction(m_layerChartsScatter);
2135  m_layerMenu->addSeparator();
2136  m_layerMenu->addAction(m_layerFitOnMapDisplay);
2137  m_layerMenu->addAction(m_layerFitSelectedOnMapDisplay);
2138  m_layerMenu->addAction(m_layerPanToSelectedOnMapDisplay);
2139  m_layerMenu->addSeparator();
2140  m_layerMenu->addAction(m_layerShowTable);
2141  m_layerMenu->addAction(m_viewStyleExplorer);
2142  m_layerMenu->addSeparator();
2143  m_layerMenu->addAction(m_layerRemoveObjectSelection);
2144  m_layerMenu->addSeparator();
2145  m_layerMenu->addAction(m_layerSRS);
2146  m_layerMenu->addSeparator();
2147  m_layerMenu->addAction(m_layerProperties);
2148 
2149  // TODO
2150  //m_layerMenu->addAction(m_layerRaise);
2151  //m_layerMenu->addAction(m_layerLower);
2152  //m_layerMenu->addAction(m_layerToTop);
2153  //m_layerMenu->addAction(m_layerToBottom);
2154 
2155 // Map Menu
2156  m_mapMenu->setObjectName("Map");
2157  m_mapMenu->setTitle(tr("&Map"));
2158 
2159  m_mapMenu->addAction(m_mapDraw);
2160  m_mapMenu->addAction(m_mapStopDrawing);
2161  m_mapMenu->addSeparator();
2162  m_mapMenu->addAction(m_mapInfo);
2163  m_mapMenu->addAction(m_mapRemoveSelection);
2164  m_mapMenu->addAction(m_mapSelection);
2165  m_mapMenu->addSeparator();
2166  m_mapMenu->addAction(m_mapPan);
2167  m_mapMenu->addAction(m_mapZoomExtent);
2168  m_mapMenu->addAction(m_mapZoomIn);
2169  m_mapMenu->addAction(m_mapZoomOut);
2170  m_mapMenu->addSeparator();
2171  m_mapMenu->addAction(m_mapNextExtent);
2172  m_mapMenu->addAction(m_mapPreviousExtent);
2173  m_mapMenu->addSeparator();
2174  m_mapMenu->addAction(m_mapMeasureAngle);
2175  m_mapMenu->addAction(m_mapMeasureArea);
2176  m_mapMenu->addAction(m_mapMeasureDistance);
2177  m_mapMenu->addSeparator();
2178  m_mapMenu->addAction(m_mapSRID);
2179  m_mapMenu->addAction(m_mapUnknownSRID);
2180 
2182 
2183 // Tools menu
2184  m_toolsMenu->setObjectName("Tools");
2185  m_toolsMenu->setTitle(tr("&Tools"));
2186 
2187 // m_toolsMenu->addAction(m_toolbarsManagement);
2188 // m_toolsMenu->addSeparator();
2189  m_toolsExchangerMenu->setObjectName("Tools.Exchanger");
2190  m_toolsExchangerMenu->setTitle(tr("&Data Exchanger"));
2191  m_toolsExchangerMenu->setIcon(QIcon::fromTheme("datasource-exchanger"));
2192  m_toolsExchangerMenu->addAction(m_toolsDataExchangerDirect);
2193  m_toolsExchangerMenu->addAction(m_toolsDataExchanger);
2194 
2195  m_toolsMenu->addAction(m_toolsDataSourceExplorer);
2196  m_toolsMenu->addSeparator();
2197  m_toolsMenu->addAction(m_toolsCustomize);
2198 
2199 // Plugins menu
2200  m_pluginsMenu->setObjectName("Plugins");
2201  m_pluginsMenu->setTitle(tr("Pl&ugins"));
2202 
2203  m_pluginsMenu->addAction(m_pluginsManager);
2204 
2205 // Help menu
2206  m_helpMenu->setObjectName("Help");
2207  m_helpMenu->setTitle(tr("&Help"));
2208 
2209  m_helpMenu->addAction(m_helpContents);
2210  //m_helpMenu->addAction(m_helpUpdate); TODO
2211 
2212 // Sets the toolbar
2213  setMenuBar(m_menubar);
2214 
2215  //! Register menu bar
2217 }
2218 
2220 {
2221  // Status Bar
2222  m_statusbar = new QStatusBar(this);
2223  m_statusbar->setObjectName("StatusBar");
2224  setStatusBar(m_statusbar);
2225 
2226  std::vector<QToolBar*> bars = ReadToolBarsFromSettings(this);
2227  std::vector<QToolBar*>::iterator it;
2228 
2229  for(it=bars.begin(); it!=bars.end(); ++it)
2230  {
2231  QToolBar* bar = *it;
2232  addToolBar(Qt::TopToolBarArea, bar);
2233  m_viewToolBarsMenu->addAction(bar->toggleViewAction());
2234  ApplicationController::getInstance().registerToolBar(bar->objectName(), bar);
2235  }
2236 // File Tool Bar
2237  //m_fileToolBar = new QToolBar(this);
2238  //m_fileToolBar->setObjectName("File Tool Bar");
2239  //addToolBar(Qt::TopToolBarArea, m_fileToolBar);
2240  //m_fileToolBar->setWindowTitle(tr("File Tool Bar"));
2241  //m_fileToolBar->addAction(m_fileNewProject);
2242  //m_fileToolBar->addAction(m_fileOpenProject);
2243  //m_fileToolBar->addAction(m_fileSaveProject);
2244 
2245  //m_viewToolBarsMenu->addAction(m_fileToolBar->toggleViewAction());
2246 
2247 // Edit Tool Bar
2248  //m_editToolBar = new QToolBar(this);
2249  //m_editToolBar->setObjectName("EditToolBar");
2250  //addToolBar(Qt::TopToolBarArea, m_editToolBar);
2251  //m_editToolBar->setWindowTitle(tr("Edit Tool Bar"));
2252  //m_editToolBar->addAction(m_editUndo);
2253  //m_editToolBar->addAction(m_editRedo);
2254  //m_editToolBar->addSeparator();
2255  //m_editToolBar->addAction(m_editCut);
2256  //m_editToolBar->addAction(m_editCopy);
2257  //m_editToolBar->addAction(m_editPaste);
2258 
2259  //m_viewToolBarsMenu->addAction(m_editToolBar->toggleViewAction());
2260 
2261 // Map Display Tool Bar
2262  //m_mapToolBar = new QToolBar(this);
2263  //m_mapToolBar->setObjectName("Map Tool Bar");
2264  //addToolBar(Qt::TopToolBarArea, m_mapToolBar);
2265  //m_mapToolBar->setWindowTitle(tr("Map Tool Bar"));
2266  //m_mapToolBar->addAction(m_mapDraw);
2267  //m_mapToolBar->addAction(m_mapZoomIn);
2268  //m_mapToolBar->addAction(m_mapZoomOut);
2269  //m_mapToolBar->addAction(m_mapPan);
2270  //m_mapToolBar->addAction(m_mapZoomExtent);
2271  //m_mapToolBar->addAction(m_mapPreviousExtent);
2272  //m_mapToolBar->addAction(m_mapNextExtent);
2273 
2274 // m_viewToolBarsMenu->addAction(m_mapToolBar->toggleViewAction());
2275 
2276 // registering the toolbars
2277  //ApplicationController::getInstance().registerToolBar(m_fileToolBar->objectName(), m_fileToolBar);
2278  ////ApplicationController::getInstance().registerToolBar("EditToolBar", m_editToolBar);
2279  //ApplicationController::getInstance().registerToolBar(m_mapToolBar->objectName(), m_mapToolBar);
2280 }
2281 
2283 {
2284  // Map SRID reset action
2285  QToolButton* mapUnknownSRIDToolButton = new QToolButton(m_statusbar);
2286  mapUnknownSRIDToolButton->setDefaultAction(m_mapUnknownSRID);
2287  m_statusbar->addPermanentWidget(mapUnknownSRIDToolButton);
2288 
2289  // Map SRID action
2290  QToolButton* mapSRIDToolButton = new QToolButton(m_statusbar);
2291  mapSRIDToolButton->setDefaultAction(m_mapSRID);
2292  m_statusbar->addPermanentWidget(mapSRIDToolButton);
2293 
2294  // Map SRID information
2295  m_mapSRIDLineEdit = new QLineEdit(m_statusbar);
2296  m_mapSRIDLineEdit->setFixedWidth(120);
2297  m_mapSRIDLineEdit->setAlignment(Qt::AlignHCenter);
2298  m_mapSRIDLineEdit->setEnabled(false);
2299 
2300  int srid = m_display->getDisplay()->getSRID();
2301  srid != TE_UNKNOWN_SRS ? m_mapSRIDLineEdit->setText("EPSG:" + QString::number(srid)) : m_mapSRIDLineEdit->setText(tr("Unknown SRS"));
2302  m_statusbar->addPermanentWidget(m_mapSRIDLineEdit);
2303 
2304  // Coordinate Line Edit
2305  m_coordinateLineEdit = new QLineEdit(m_statusbar);
2306  m_coordinateLineEdit->setFixedWidth(220);
2307  m_coordinateLineEdit->setAlignment(Qt::AlignHCenter);
2308  m_coordinateLineEdit->setReadOnly(true);
2309  m_coordinateLineEdit->setFocusPolicy(Qt::NoFocus);
2310  m_coordinateLineEdit->setText(tr("Coordinates"));
2311  m_statusbar->addPermanentWidget(m_coordinateLineEdit);
2312 
2313  // Stop draw action
2314  QToolButton* stopDrawToolButton = new QToolButton(m_statusbar);
2315  stopDrawToolButton->setDefaultAction(m_mapStopDrawing);
2316  m_statusbar->addPermanentWidget(stopDrawToolButton);
2317 }
2318 
2320 {
2321  connect(m_fileExit, SIGNAL(triggered()), SLOT(close()));
2322  connect(m_projectAddLayerDataset, SIGNAL(triggered()), SLOT(onAddDataSetLayerTriggered()));
2323  connect(m_projectAddLayerQueryDataSet, SIGNAL(triggered()), SLOT(onAddQueryLayerTriggered()));
2324  connect(m_projectAddLayerTabularDataSet, SIGNAL(triggered()), SLOT(onAddTabularLayerTriggered()));
2325  connect(m_projectRemoveLayer, SIGNAL(triggered()), SLOT(onRemoveLayerTriggered()));
2326  connect(m_projectRenameLayer, SIGNAL(triggered()), SLOT(onRenameLayerTriggered()));
2327  connect(m_projectProperties, SIGNAL(triggered()), SLOT(onProjectPropertiesTriggered()));
2328  connect(m_pluginsManager, SIGNAL(triggered()), SLOT(onPluginsManagerTriggered()));
2329  connect(m_recentProjectsMenu, SIGNAL(triggered(QAction*)), SLOT(onRecentProjectsTriggered(QAction*)));
2330  connect(m_fileNewProject, SIGNAL(triggered()), SLOT(onNewProjectTriggered()));
2331  connect(m_fileOpenProject, SIGNAL(triggered()), SLOT(onOpenProjectTriggered()));
2332  connect(m_fileSaveProject, SIGNAL(triggered()), SLOT(onSaveProjectTriggered()));
2333  connect(m_fileSaveProjectAs, SIGNAL(triggered()), SLOT(onSaveProjectAsTriggered()));
2334  connect(m_toolsCustomize, SIGNAL(triggered()), SLOT(onToolsCustomizeTriggered()));
2335  connect(m_toolsDataExchanger, SIGNAL(triggered()), SLOT(onToolsDataExchangerTriggered()));
2336  connect(m_toolsDataExchangerDirect, SIGNAL(triggered()), SLOT(onToolsDataExchangerDirectTriggered()));
2337  connect(m_toolsDataExchangerDirectPopUp, SIGNAL(triggered()), SLOT(onToolsDataExchangerDirectPopUpTriggered()));
2338  connect(m_helpContents, SIGNAL(triggered()), SLOT(onHelpTriggered()));
2339  connect(m_layerChartsHistogram, SIGNAL(triggered()), SLOT(onLayerHistogramTriggered()));
2340  connect(m_layerChartsScatter, SIGNAL(triggered()), SLOT(onLayerScatterTriggered()));
2341  connect(m_layerChart, SIGNAL(triggered()), SLOT(onLayerChartTriggered()));
2342  connect(m_projectAddFolderLayer, SIGNAL(triggered()), SLOT(onAddFolderLayerTriggered()));
2343  connect(m_layerProperties, SIGNAL(triggered()), SLOT(onLayerPropertiesTriggered()));
2344  connect(m_layerRemoveObjectSelection, SIGNAL(triggered()), SLOT(onLayerRemoveSelectionTriggered()));
2345  connect(m_layerRemoveItem, SIGNAL(triggered()), SLOT(onLayerRemoveItemTriggered()));
2346  connect(m_layerSRS, SIGNAL(triggered()), SLOT(onLayerSRSTriggered()));
2347  connect(m_layerObjectGrouping, SIGNAL(triggered()), SLOT(onLayerGroupingTriggered()));
2348  connect(m_mapSRID, SIGNAL(triggered()), SLOT(onMapSRIDTriggered()));
2349  connect(m_mapUnknownSRID, SIGNAL(triggered()), SLOT(onMapSetUnknwonSRIDTriggered()));
2350  connect(m_mapDraw, SIGNAL(triggered()), SLOT(onDrawTriggered()));
2351  connect(m_layerFitOnMapDisplay, SIGNAL(triggered()), SLOT(onLayerFitOnMapDisplayTriggered()));
2352  connect(m_layerFitSelectedOnMapDisplay, SIGNAL(triggered()), SLOT(onLayerFitSelectedOnMapDisplayTriggered()));
2353  connect(m_layerPanToSelectedOnMapDisplay, SIGNAL(triggered()), SLOT(onLayerPanToSelectedOnMapDisplayTriggered()));
2354  connect(m_queryLayer, SIGNAL(triggered()), SLOT(onQueryLayerTriggered()));
2355  connect(m_mapZoomIn, SIGNAL(toggled(bool)), SLOT(onZoomInToggled(bool)));
2356  connect(m_mapZoomOut, SIGNAL(toggled(bool)), SLOT(onZoomOutToggled(bool)));
2357  connect(m_mapPreviousExtent, SIGNAL(triggered()), SLOT(onPreviousExtentTriggered()));
2358  connect(m_mapNextExtent, SIGNAL(triggered()), SLOT(onNextExtentTriggered()));
2359  connect(m_mapPan, SIGNAL(toggled(bool)), SLOT(onPanToggled(bool)));
2360  connect(m_mapZoomExtent, SIGNAL(triggered()), SLOT(onZoomExtentTriggered()));
2361  connect(m_mapInfo, SIGNAL(toggled(bool)), SLOT(onInfoToggled(bool)));
2362  connect(m_mapRemoveSelection, SIGNAL(triggered()), SLOT(onMapRemoveSelectionTriggered()));
2363  connect(m_mapSelection, SIGNAL(toggled(bool)), SLOT(onSelectionToggled(bool)));
2364  connect(m_mapMeasureDistance, SIGNAL(toggled(bool)), SLOT(onMeasureDistanceToggled(bool)));
2365  connect(m_mapMeasureArea, SIGNAL(toggled(bool)), SLOT(onMeasureAreaToggled(bool)));
2366  connect(m_mapMeasureAngle, SIGNAL(toggled(bool)), SLOT(onMeasureAngleToggled(bool)));
2367  connect(m_mapStopDrawing, SIGNAL(triggered()), SLOT(onStopDrawTriggered()));
2368  connect(m_layerShowTable, SIGNAL(triggered()), SLOT(onLayerShowTableTriggered()));
2369  connect(m_viewFullScreen, SIGNAL(toggled(bool)), SLOT(onFullScreenToggled(bool)));
2370  connect(m_toolsDataSourceExplorer, SIGNAL(triggered()), SLOT(onDataSourceExplorerTriggered()));
2371 }
virtual void initializePlugins()
Load the plugin list and initialize the plugins enabled by the user.
A class that defines the interface of a qt bar progress viewer.
te::qt::af::ApplicationController * m_controller
Contains the list of the project events.
void registerMenu(QMenu *mnu)
Register the mnu.
void onLayerTableClose(te::qt::af::DataSetTableDockWidget *wid)
virtual te::map::AbstractLayerPtr getLayer() const =0
A connector of the te::qt::widgets::MapDisplay class to the Application Framework.
virtual std::list< te::map::AbstractLayerPtr > getLayers()=0
bool isValid() const
It tells if the rectangle is valid or not.
Definition: Envelope.h:438
This class implements a concrete tool to geographic zoom operation using the mouse click...
Definition: ZoomClick.h:49
double m_y
The y coordinate value.
Definition: ToolEvents.h:94
A dialog for selecting a data source.
A dialog used to customize a Scatter parameters and generate it&#39;s ChartDisplayWidget.
Definition: ScatterDialog.h:59
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
Definition: Exception.h:58
virtual void setResizePolicy(const ResizePolicy &policy)
Sets the resize policy to this map display.
Definition: MapDisplay.cpp:224
void onMeasureAngleToggled(bool checked)
BaseApplication(QWidget *parent=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)
A singleton for holding he application splash screen.
void CloseAllTables(std::vector< te::qt::af::DataSetTableDockWidget * > &tables)
A Dialog used to customize a Histogram parameters and generate it&#39;s ChartDisplayWidget.
An exception class for the TerraLib Application Framework.
void setLayer(te::map::AbstractLayer *layer)
Sets the layer to be showed on view. This DOES NOT takes the ownership of layer.
double getWidth() const
It returns the envelope width.
Definition: Envelope.h:443
void onZoomInToggled(bool checked)
void registerMenuBar(QMenuBar *bar)
Register the bar.
This is the base class for layers.
Definition: AbstractLayer.h:76
A dialog for edition of te::qt::af::Project informations.
std::list< te::map::AbstractLayerPtr > getAllLayers()
It gets all the layers (single and folder layers) of the project.
Definition: Project.cpp:77
void onMeasureAreaToggled(bool checked)
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...
A connector for the te::qt::widgets::StyleDockWidget class to the Application Framework.
Definition: StyleExplorer.h:61
Utility functions for MapTools module.
This file defines a class for a Query Dialog Dialog.
Definition: QueryDialog.h:63
te::qt::af::DataSetTableDockWidget * GetLayerDock(const te::map::AbstractLayer *layer, const std::vector< te::qt::af::DataSetTableDockWidget * > &docs)
A base class for the suppported types of data source.
void setList(std::list< te::map::AbstractLayerPtr > &layerList)
This method is used to set the list of layers.
Definition: QueryDialog.cpp:89
It indicates that a new project was created.
Definition: ProjectEvents.h:47
This event signals that the srid of the map display changed.
Definition: MapEvents.h:52
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 setCurrentLayer(te::map::AbstractLayerPtr layer)
void onLayerExplorerVisibilityChanged(bool visible)
The base API for controllers of TerraLib applications.
void setProject(Project *proj)
Sets the project to be inspected.
void onFullScreenToggled(bool checked)
double m_x
The x coordinate value.
Definition: ToolEvents.h:93
TEQTAFEXPORT QString UnsavedStar(const QString windowTitle, bool isUnsaved)
Unsaved star.
Definition: Utils.cpp:585
A layer that can be used as a container for other kind of layers.
Definition: FolderLayer.h:45
void onSelectionToggled(bool checked)
This class implements a concrete tool to geographic pan operation.
Definition: Pan.h:49
void onZoomOutToggled(bool checked)
#define TE_UNKNOWN_SRS
A numeric value to represent a unknown SRS identification in TerraLib.
Definition: Config.h:72
The base API for TerraLib applications.
virtual const char * what() const
It outputs the exception message.
Definition: Exception.cpp:58
static ApplicationController & getInstance()
It gives access to the controller singleton.
void registerToolBar(const QString &id, QToolBar *bar)
Register the toolbar in the list of the known toolbars.
virtual void closeEvent(QCloseEvent *e)
double getHeight() const
It returns the envelope height.
Definition: Envelope.h:448
void setSelectionColor(QColor selColor)
color used to hgihlight selected objects on this display.
It indicates that the project has unsaved changes.
Definition: ProjectEvents.h:68
An utility struct for representing 2D coordinates.
Definition: Coord2D.h:40
A dock widget for table view objects.
void onHighlightLayerObjects(const te::map::AbstractLayerPtr &layer, te::da::DataSet *dataset, const QColor &color)
TEQTAFEXPORT Project * ReadProject(const std::string &uri)
Reads and return a te::qt::af::Project from the file.
Definition: Utils.cpp:62
Contains a list of the map display events.
QToolBar * m_toolbar
Pointer to the new QToolBar.
LayerTreeView * getTreeView() const
TEQTAFEXPORT void SaveDataSourcesFile()
Saves data sources file.
Definition: Utils.cpp:283
This event indicates that the objects of the given layer must be highlighted.
Definition: LayerEvents.h:194
void onMeasureDistanceToggled(bool checked)
A dialog used to build a SRSManagerDialog element.
A dock widget for ChartDisplayWidget objects.
A connector for the te::qt::widgets::LayerExplorer class to the Application Framework.
void setChart(te::map::Chart *chart)
Update the interface with the chart properties.
This class implements a concrete tool to geographic zoom in operation using a boundary rectangle...
Definition: ZoomArea.h:49
std::pair< int, std::string > m_srid
Definition: MapEvents.h:65
This class models the concept of a project for the TerraLib Application Framework.
Definition: Project.h:50
virtual int getSRID() const
It return the Spatial Reference System used by the Map Display.
Definition: MapDisplay.cpp:73
This event signals that a new layer was created.
Definition: LayerEvents.h:61
TEQTAFEXPORT void SaveState(QMainWindow *mainWindow)
Definition: Utils.cpp:435
void removeListener(QObject *obj)
Remove the obj from the list of event listeners.
double m_lly
Lower left corner y-coordinate.
Definition: Envelope.h:345
A dialog for selecting a data source.
void onDisplayVisibilityChanged(bool visible)
This class implements a concrete tool to get informations about a specified feature using pointing op...
Definition: Info.h:73
void setLayer(te::map::AbstractLayerPtr layer)
TEQTAFEXPORT void RestoreState(QMainWindow *mainWindow)
Definition: Utils.cpp:445
A QMainWindow to be used as the basis for TerraLib applications.
double m_ury
Upper right corner y-coordinate.
Definition: Envelope.h:347
TEQTAFEXPORT void SaveLastDatasourceOnSettings(const QString &dsType)
Definition: Utils.cpp:475
virtual void openProject(const QString &projectFileName)
A singleton for managing the application plugins.
void onStyleExplorerVisibilityChanged(bool visible)
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:153
A tree view for the layers of an application.
Definition: LayerTreeView.h:63
void onRecentProjectsTriggered(QAction *proj)
QString getMostRecentProject() const
Returns the most recent project.
virtual void set(const std::list< te::da::DataSourceInfoPtr > &datasources)=0
A dock widget for DataSetTableView objects.
void setLayers(std::list< te::map::AbstractLayerPtr > layers)
Set the layer that can be used.
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:151
This class implements a concrete tool to select layer features using an extent.
Definition: Selection.h:63
Contains a list of the layer events.
const std::pair< int, std::string > & getSelectedSRS() const
Returns the selected SRS in the window.
double m_urx
Upper right corner x-coordinate.
Definition: Envelope.h:346
virtual void setConfigFile(const std::string &configFileName)
Tells wich configuration file to be used by the controller during its initialization.
A widget to control the display of a set of layers.
Definition: MapDisplay.h:65
virtual void setMsgBoxParentWidget(QWidget *w)
Tells the widget to be used as the parent of messages showned in a QMessageBox.
void set(te::qt::af::Project *prj)
Set the current project.
te::map::DataSetAdapterLayerPtr getDataSetAdapterLayer()
Returns a new DataSetAdapterLayer.
int m_id
Identifier.
Definition: Event.h:70
This class implements a concrete tool to measure operation (distance, area, and angle).
Definition: Measure.h:66
This event signals that a new toolbar was added.
virtual void initialize()
Initializes the application framework.
Coord2D getCenter() const
It returns the rectangle&#39;s center coordinate.
Definition: Envelope.cpp:48
A widget designed to explore the layers of an application.
Definition: LayerExplorer.h:59
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:89
void onApplicationTriggered(te::qt::af::evt::Event *evt)
The class that represents an item in a LayerTreeModel.
A connector for the te::qt::widgets::StyleDockWidget class to the Application Framework.
This event signals that a item belonging to a layer will be removed from the layer explorer...
Definition: LayerEvents.h:85
virtual void finalize()
Finalize the application framework.
A class that models the description of a dataset.
Definition: DataSetType.h:72
void setLayer(te::map::AbstractLayerPtr layer)
Set a layer.
A multi thread Qt4 widget to control the display of a set of layers.
te::qt::widgets::ChartDisplayWidget * getDisplayWidget()
Returns a pointer to the generated ChartDisplayWidget.
A dialog used to build a grouping.
A dock widget used control the geographic data style using SE elements and a property browser to show...
TEQTAFEXPORT bool GetOpenLastProjectFromSettings()
Definition: Utils.cpp:496
TEQTAFEXPORT void Save(const Project &project, const std::string &uri)
Saves the informations of the project in the uri file.
Definition: Utils.cpp:172
void addListener(QObject *obj)
Insert an application item that will listen to framework events.
virtual QWidget * getWidget(int widgetType, QWidget *parent=0, Qt::WindowFlags f=0) const =0
virtual void initializeProjectMenus()
Initializes the menus for the most recent open projects.
double m_llx
Lower left corner x-coordinate.
Definition: Envelope.h:344
An abstract class for layer selection widgets.
A base class for application events.
Definition: Event.h:59
This class represents the informations needed to build map charts.
Definition: Chart.h:51
This event signals that a layer is to be removed from the layer explorer.
Definition: LayerEvents.h:106
This class controls how a set of layers are displayed.
Definition: MapDisplay.h:45
void setLayer(te::map::AbstractLayer *layer)
Sets the layer to be showed on view. This DOES NOT takes the ownership of layer.
A connector of the te::qt::widgets::MapDisplay class to the Application Framework.
Definition: MapDisplay.h:75
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
#define TR_QT_AF(message)
It marks a string in order to get translated. This is a special mark used in the DataAccess module of...
Definition: Config.h:77
This event indicates that the selected objects of the layer were changed.
Definition: LayerEvents.h:173
static DataSourceTypeManager & getInstance()
It returns a reference to the singleton instance.
virtual const te::gm::Envelope & getExtent() const
It returns the world extent showned by the MapDisplay.
Definition: MapDisplay.cpp:63
A connector for the te::qt::widgets::LayerExplorer class to the Application Framework.
Definition: LayerExplorer.h:70
void onLayerSelectedObjectsChanged(const te::map::AbstractLayerPtr &layer)
void onInfoToggled(bool checked)
This class models the concept of a project for the TerraLib Application Framework.
An Envelope defines a 2D rectangular region.
Definition: Envelope.h:51
TEQTAFEXPORT QString GetLastDatasourceFromSettings()
Definition: Utils.cpp:489
void updateRecentProjects(const QString &prjFile, const QString &prjTitle)
Update the list of recent projects. This is commonly used when there&#39;s a new most recent project...
A for customization of the application components.
A dialog used to build a chart.
A dock widget for chart display objects.
A dialog used to configure the properties of a new textual file based layer.
A dataset is the unit of information manipulated by the data access module of TerraLib.
Definition: DataSet.h:111
void onDisplayDataTableChanged(bool visible)
void broadcast(te::qt::af::evt::Event *evt)
Send events in broadcast for all registered components.
te::qt::widgets::ChartDisplayWidget * getDisplayWidget()
Returns a pointer to the generated ChartDisplayWidget.
Contains the list of the application events.
TEQTAFEXPORT std::vector< QToolBar * > ReadToolBarsFromSettings(QWidget *barsParent=0)
Returns a vector of tool bars registered in the QSettings.
Definition: Utils.cpp:381
te::qt::af::Project * getProject()
Get the current project.
TEQTAFEXPORT void GetProjectInformationsFromSettings(QString &defaultAuthor, int &maxSaved)
Definition: Utils.cpp:455
A class that defines the interface of a qt widget to group a set of ProgressWidgetItem.
Signals a mouse moved over the current display.
Definition: ToolEvents.h:78