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