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