All pastes #1633651 Raw Edit

lynx

public text v1 · immutable
#1633651 ·published 2009-10-20 21:18 UTC
rendered paste body
Index: src/app/qgisappinterface.h===================================================================--- src/app/qgisappinterface.h	(revision 11821)+++ src/app/qgisappinterface.h	(working copy)@@ -87,6 +87,10 @@     /** Return a pointer to the map canvas used by qgisapp */     QgsMapCanvas * mapCanvas(); +#ifdef HAVE_TABS+    /** Return a pointer to the main tab widget that containing map canvas */+    QgsDeskTabWidgetInterface * deskTabWidget();+#endif     /** Gives access to main QgisApp object          Plugins don't need to know about QgisApp, as we pass it as QWidget,Index: src/app/composer/qgscomposer.cpp===================================================================--- src/app/composer/qgscomposer.cpp	(revision 11821)+++ src/app/composer/qgscomposer.cpp	(working copy)@@ -48,6 +48,11 @@ #include <QMessageBox> #include <QPainter> +#ifdef HAVE_TABS+#include <QDockWidget>+#include <QStatusBar>+#endif+ #include <QPrinter> #include <QPrintDialog> #include <QSettings>@@ -1264,6 +1269,36 @@   on_mActionSelectMoveItem_triggered(); } +#ifdef HAVE_TABS+void QgsComposer::prepareTabbing()+{+  QList< QToolBar * > tbs = mQgis->findChildren< QToolBar * >();+  foreach( QToolBar *tb, tbs)+    tb->hide();++//  mQgis->legendDock()->hide();+//  mQgis->overviewDock()->hide();+  mQgis->statusBar()->hide();++  mQgis->addToolBar( toolBar );+  toolBar->show();+}++void QgsComposer::restoreState( int index )+{+  int tabIdx = property( "tabIdx" ).toInt();+  if ( tabIdx == index )+  {+    QByteArray ba = property( "state" ).toByteArray();+    qDebug() << mQgis->restoreState( ba, index );+  }+  else+  {+    toolBar->hide();+  }+}+#endif+ bool QgsComposer::containsWMSLayer() const {   QMap<QgsComposerItem*, QWidget*>::const_iterator item_it = mItemWidgetMap.constBegin();Index: src/app/composer/qgscomposer.h===================================================================--- src/app/composer/qgscomposer.h	(revision 11821)+++ src/app/composer/qgscomposer.h	(working copy)@@ -19,6 +19,7 @@ #define QGSCOMPOSER_H #include "ui_qgscomposerbase.h" #include "qgscomposeritem.h"+#include "qgsconfig.h"  class QgisApp; class QgsComposerLabel;@@ -221,6 +222,11 @@      void setSelectionTool(); +#ifdef HAVE_TABS+    void prepareTabbing();+    void restoreState( int index );+#endif+   protected:      void paintEvent( QPaintEvent* event );@@ -231,7 +237,6 @@     void activate();    private:-     /**Establishes the signal slot connection for the class*/     void connectSlots(); Index: src/app/qgisapp.h===================================================================--- src/app/qgisapp.h	(revision 11821)+++ src/app/qgisapp.h	(working copy)@@ -68,6 +68,14 @@ #include "qgsfeature.h" #include "qgspoint.h" +#ifdef HAVE_TABS+class QgsFrameWidget;+class QgsMapOverviewCanvas;+class QgsDeskTabWidget;+class QgsLegendTabWidget;+class QgsAddTabDialog;+#endif+ /*! \class QgisApp  * \brief Main window for the Qgis application  */@@ -141,8 +149,13 @@     //!Overloaded version of the private function with same name that takes the imagename as a parameter     void saveMapAsImage( QString, QPixmap * );     /** Get the mapcanvas object from the app */-    QgsMapCanvas * mapCanvas() { return mMapCanvas; };-+    QgsMapCanvas * mapCanvas() { return mMapCanvas; }+#ifdef HAVE_TABS+    /** Get the main (desk) tabwidget object from the app */+    QgsDeskTabWidget *deskTabWidget() { return mDeskTabWidget; }+    /** Get the legend tabwidget object from the app */+    QgsLegendTabWidget *legendTabWidget() { return mLegendTabWidget; }+#endif     QgsComposer* printComposer() {return mComposer;}      //! Set theme (icons)@@ -184,11 +197,12 @@      * After adding the dock widget to the ui (by delegating to the QMainWindow      * parent class, it will also add it to the View menu list of docks.*/     void addDockWidget( Qt::DockWidgetArea area, QDockWidget * dockwidget );+#ifndef HAVE_TABS     /** Add a toolbar to the main window. Overloaded from QMainWindow.      * After adding the toolbar to the ui (by delegating to the QMainWindow      * parent class, it will also add it to the View menu list of toolbars.*/     QToolBar *addToolBar( QString name );-+#endif     /** Add window to Window menu. The action title is the window title      * and the action should raise, unminimize and activate the window. */     void addWindow( QAction *action );@@ -198,6 +212,12 @@      //! Actions to be inserted in menus and toolbars     QAction *actionNewProject() { return mActionNewProject; }+#ifdef HAVE_TABS+    QAction *actionNewTab() { return mActionAddTabDialog; }+    QAction *actionNewCanvasTab() { return mActionCanvasTab; }+    QAction *actionCloseTab() { return mActionCloseTab; }+    QAction *actionRestoreTab() { return mActionRestoreTab; }+#endif     QAction *actionOpenProject() { return mActionOpenProject; }     QAction *actionFileSeparator1() { return mActionFileSeparator1; }     QAction *actionSaveProject() { return mActionSaveProject; }@@ -393,6 +413,7 @@     //#endif     /** toggles whether the current selected layer is in overview or not */     void isInOverview();+#ifndef HAVE_TABS     //! Slot to show the map coordinate position of the mouse cursor     void showMouseCoordinate( const QgsPoint & );     //! Slot to show current map scale;@@ -401,6 +422,7 @@     void userScale();     //! Slot to handle user center input;     void userCenter();+#endif     //! Remove a layer from the map and legend     void removeLayer();     //! zoom to extent of layer@@ -432,6 +454,16 @@     //! Open the project file corresponding to the     //! text)= of the given action.     void openProject( QAction *action );+#ifdef HAVE_TABS+    void addTabDialog();+    void addCanvasTab();+    void closeTab();+    void restoreTab();+    void nextTab();+    void previousTab();++    void updateFrame( QgsFrameWidget *frame );+#endif     //! Save the map view as an image - user is prompted for image name using a dialog     void saveMapAsImage();     //! Open a project@@ -482,8 +514,10 @@     void socketError( QAbstractSocket::SocketError e );     //! Set project properties, including map untis     void projectProperties();+#ifndef HAVE_TABS     //! Open project properties dialog and show the projections tab     void projectPropertiesProjections();+#endif     /*  void urlData(); */     //! Show the spatial bookmarks dialog     void showBookmarks();@@ -536,20 +570,28 @@     //! starts/stops editing mode of the current layer     void toggleEditing(); +#ifndef HAVE_TABS     //! map tool changed     void mapToolChanged( QgsMapTool *tool );+#endif      /** Activates or deactivates actions depending on the current maplayer type.     Is called from the legend when the current legend item has changed*/     void activateDeactivateLayerRelatedActions( QgsMapLayer* layer ); +#ifndef HAVE_TABS     void showProgress( int theProgress, int theTotalSteps );     void extentsViewToggled( bool theFlag );     void showExtents();     void showStatusMessage( QString theMessage );+#endif+#ifdef HAVE_TABS     void updateMouseCoordinatePrecision();+#endif+#ifndef HAVE_TABS     void hasCrsTransformEnabled( bool theFlag );     void destinationSrsChanged();+#endif     //    void debugHook();     //! Add a vector layer to the map     void addVectorLayer();@@ -591,10 +633,10 @@      //! Toggle map tips on/off     void toggleMapTips();-+#ifndef HAVE_TABS     //! Show the map tip     void showMapTip();-+#endif     //! Toggle full screen mode     void toggleFullScreen(); @@ -658,6 +700,7 @@     bool isValidVectorFileName( QString theFileNameQString );     /** Overloaded version of the above function provided for convenience that takes a qstring pointer */     bool isValidVectorFileName( QString * theFileNameQString );+     /** add this file to the recently opened/saved projects list      *  pass settings by reference since creating more than one      * instance simultaneously results in data loss.@@ -686,13 +729,22 @@     void createActionGroups();     void createMenus();     void createToolBars();+#ifndef HAVE_TABS     void createStatusBar();+#endif     void setupConnections();+#ifndef HAVE_TABS     void createLegend();+#else     void createOverview();+    void createLegendDock();+    void createOverviewDock();+#endif     void createCanvas();     bool createDB();+#ifndef HAVE_TABS     void createMapTips();+#endif      // toolbars ---------------------------------------     QToolBar *mFileToolBar;@@ -707,6 +759,14 @@     // actions for menus and toolbars -----------------      QAction *mActionNewProject;+#ifdef HAVE_TABS+    QAction *mActionAddTabDialog;+    QAction *mActionCanvasTab;+    QAction *mActionNextTab;+    QAction *mActionPreviousTab;+    QAction *mActionCloseTab;+    QAction *mActionRestoreTab;+#endif     QAction *mActionOpenProject;     QAction *mActionFileSeparator1;     QAction *mActionSaveProject;@@ -845,6 +905,9 @@     class Tools     {       public:+#ifdef HAVE_TABS+        ~Tools();+#endif         QgsMapTool* mZoomIn;         QgsMapTool* mZoomOut;         QgsMapTool* mPan;@@ -868,10 +931,15 @@         QgsMapTool* mDeletePart;         QgsMapTool* mNodeTool;         QgsMapTool* mRotatePointSymbolsTool;+#ifndef HAVE_TABS     } mMapTools;+#else+        QgsMapTool* mCurrentTool;+    } *mMapTools;+#endif      QgsMapTool *mNonEditMapTool;-+#ifndef HAVE_TABS     //! Widget that will live on the statusbar to display "scale 1:"     QLabel * mScaleLabel;     //! Widget that will live on the statusbar to display scale value@@ -894,6 +962,7 @@     QToolButton* mStopRenderButton;     //! Widget in status bar used to show status of on the fly projection     QToolButton * mOnTheFlyProjectionStatusButton;+#endif     //! Popup menu     QMenu * mPopupMenu;     //! Top level plugin menu@@ -906,6 +975,17 @@     QMenu *toolPopupCapture;     //! Map canvas     QgsMapCanvas *mMapCanvas;+#ifdef HAVE_TABS+    friend class QgsFrameWidget;+    //! Desk (main) tab widget+    QgsDeskTabWidget *mDeskTabWidget;+    //! Map overview canvas+    QgsMapOverviewCanvas *mMapOverviewCanvas;+    //! Legend tab widget+    QgsLegendTabWidget *mLegendTabWidget;+    //! Dialog for adding tab+    QgsAddTabDialog *mAddTabDialog;+#endif     //! Table of contents (legend) for the map     QgsLegend *mMapLegend;     //! Cursor for the overview map@@ -937,8 +1017,10 @@     //! How to determine the number of decimal places used to     //! display the mouse position     bool mMousePrecisionAutomatic;+#ifdef HAVE_TABS     //! The number of decimal places to use if not automatic     unsigned int mMousePrecisionDecimalPlaces;+#endif     /** QGIS-internal vector feature clipboard */     QgsClipboard* mInternalClipboard;     //! Flag to indicate how the project properties dialog was summoned@@ -952,6 +1034,7 @@       */     QString mRasterFileFilter; +#ifndef HAVE_TABS     /** Timer for map tips      */     QTimer *mpMapTipsTimer;@@ -966,6 +1049,7 @@      // Flag to indicate if maptips are on or off     bool mMapTipsVisible;+#endif      //!flag to indicate whether we are in fullscreen mode or not     bool mFullScreenMode;Index: src/app/CMakeLists.txt===================================================================--- src/app/CMakeLists.txt	(revision 11821)+++ src/app/CMakeLists.txt	(working copy)@@ -108,6 +108,11 @@   attributetable/qgsattributetabledelegate.cpp   ) +IF (HAVE_TABS)+  SET (QGIS_APP_SRCS ${QGIS_APP_SRCS}+    qgsframewidget.cpp+  )+ENDIF (HAVE_TABS)  SET (QGIS_APP_MOC_HDRS   qgisapp.h@@ -193,6 +198,12 @@   attributetable/qgsattributetabledelegate.h   ) +IF (HAVE_TABS)+  SET (QGIS_APP_MOC_HDRS ${QGIS_APP_MOC_HDRS}+    qgsframewidget.h+  )+ENDIF (HAVE_TABS)+ IF (POSTGRES_FOUND)   IF(HAVE_PGCONFIG)     ADD_DEFINITIONS(-DHAVE_PGCONFIG=1)Index: src/app/qgisapp.cpp===================================================================--- src/app/qgisapp.cpp	(revision 11821)+++ src/app/qgisapp.cpp	(working copy)@@ -138,6 +138,12 @@ #include "qgsvectorlayer.h" #include "ogr/qgsopenvectorlayerdialog.h" #include "qgsattributetabledialog.h"+#ifdef HAVE_TABS+#include "qgsframewidget.h"+#include "tabs/qgsaddtabdialog.h"+#include "tabs/qgsdesktabwidget.h"+#include "tabs/qgslegendtabwidget.h"+#endif // // Gdal/Ogr includes //@@ -326,6 +332,10 @@ // constructor starts here QgisApp::QgisApp( QSplashScreen *splash, QWidget * parent, Qt::WFlags fl )     : QMainWindow( parent, fl ),+#ifdef HAVE_TABS+    mMapCanvas( 0 ),+    mMapLegend( 0 ),+#endif     mSplash( splash ),     mComposer( 0 ),     mPythonConsole( NULL ),@@ -356,22 +366,34 @@    mSplash->showMessage( tr( "Setting up the GUI" ), Qt::AlignHCenter | Qt::AlignBottom );   qApp->processEvents();---+#ifdef HAVE_TABS+  setDockOptions(QMainWindow::ForceTabbedDocks);+#endif   createActions();   createActionGroups();   createMenus();   createToolBars();+#ifndef HAVE_TABS   createStatusBar();+#endif+#ifdef HAVE_TABS+  createOverview();+  createOverviewDock();+#endif   createCanvas();   mMapCanvas->freeze();+#ifdef HAVE_TABS+  createLegendDock();+#else   createLegend();   createOverview();   createMapTips();+#endif   readSettings();   updateRecentProjectPaths();-+#ifdef HAVE_TABS+  mAddTabDialog = new QgsAddTabDialog(); // Dialog for opening tabs+#endif   mComposer = new QgsComposer( this ); // Map composer   mInternalClipboard = new QgsClipboard; // create clipboard   mQgisInterface = new QgisAppInterface( this ); // create the interfce@@ -452,9 +474,9 @@   restoreWindowState();    mSplash->showMessage( tr( "QGIS Ready!" ), Qt::AlignHCenter | Qt::AlignBottom );-+#ifndef HAVE_TABS   mMapTipsVisible = false;-+#endif   // setup drag drop   setAcceptDrops( true ); @@ -471,9 +493,7 @@  QgisApp::~QgisApp() {-  delete mInternalClipboard;-  delete mQgisInterface;-+#ifndef HAVE_TABS   delete mMapTools.mZoomIn;   delete mMapTools.mZoomOut;   delete mMapTools.mPan;@@ -496,7 +516,11 @@   delete mMapTools.mDeletePart;   delete mMapTools.mAddIsland;   delete mMapTools.mNodeTool;+#endif +  delete mInternalClipboard;+  delete mQgisInterface;+   delete mPythonConsole;   delete mPythonUtils; @@ -599,6 +623,44 @@   mActionExit->setMenuRole( QAction::QuitRole ); // put in Application menu on Mac OS X   connect( mActionExit, SIGNAL( triggered() ), this, SLOT( fileExit() ) ); +#ifdef HAVE_TABS+  mActionAddTabDialog = new QAction( getThemeIcon( "mActionAddTabDialog.png" ), tr( "New &Tab" ), this );+  shortcuts->registerAction( mActionAddTabDialog, tr( "Ctrl+T", "New Tab" ) );+  //  mActionNewCanvas->setShortcut( QKeySequence::AddTab );+  mActionAddTabDialog->setStatusTip( tr( "New Tab" ) );+  connect( mActionAddTabDialog, SIGNAL( triggered() ), this, SLOT(addTabDialog()) );++  mActionCanvasTab = new QAction( getThemeIcon( "mActionCanvasTab.png" ), tr( "New &canvas" ), this );+//  shortcuts->registerAction( mActionCanvasTab, tr( "Ctrl+T", "New Canvas" ) );+  //  mActionNewCanvas->setShortcut( QKeySequence::AddTab );+  mActionCanvasTab->setStatusTip( tr( "New canvas" ) );+  connect( mActionCanvasTab, SIGNAL( triggered() ), this, SLOT(addCanvasTab()) );++  mActionCloseTab = new QAction( getThemeIcon( "mActionCloseTab.png" ), tr( "&Close Tab" ), this );+  shortcuts->registerAction( mActionCloseTab, tr( "Ctrl+W", "Close Tab" ) );+  //  mActionCloseTab->setShortcut( QKeySequence::Close );+  mActionCloseTab->setStatusTip( tr( "Close Tab" ) );+  connect( mActionCloseTab, SIGNAL( triggered() ), this, SLOT(closeTab()) );++  mActionRestoreTab = new QAction( getThemeIcon( "mActionRestoreTab.png" ), tr( "&Restore Tab" ), this );+  shortcuts->registerAction( mActionRestoreTab, tr( "Ctrl+Shift+T", "Restore Tab" ) );+  mActionRestoreTab->setStatusTip( tr( "Restore Tab" ) );+  mActionRestoreTab->setEnabled( false );+  connect( mActionRestoreTab, SIGNAL( triggered() ), this, SLOT(restoreTab()) );++  // create actions that helps user to navigate in tabs+  mActionNextTab = new QAction(this);+  shortcuts->registerAction( mActionNextTab, tr( "Ctrl+Tab", "Goto next tab" ) );+    mActionNextTab->setShortcut(QKeySequence::NextChild);+  connect(mActionNextTab, SIGNAL(triggered()), this, SLOT(nextTab()));+  addAction(mActionNextTab);++  mActionPreviousTab = new QAction(this);+  shortcuts->registerAction( mActionPreviousTab, tr( "Ctrl+Shift+Tab", "Goto previous tab" ) );+  //  mActionPreviousTab->setShortcut(QKeySequence::PreviousChild);+  connect(mActionPreviousTab, SIGNAL(triggered()), this, SLOT(previousTab()));+  addAction(mActionPreviousTab);+#endif   // Edit Menu Items  #if 0@@ -1146,6 +1208,10 @@    mFileMenu->addAction( mActionNewProject );   mFileMenu->addAction( mActionOpenProject );+#ifdef HAVE_TABS+  mFileMenu->addAction( mActionAddTabDialog );+  mFileMenu->addAction( mActionCanvasTab );+#endif   mRecentProjectsMenu = mFileMenu->addMenu( tr( "&Open Recent Projects" ) );   // Connect once for the entire submenu.   connect( mRecentProjectsMenu, SIGNAL( triggered( QAction * ) ),@@ -1166,6 +1232,10 @@   mFileMenu->addAction( mActionPrintComposer );   mActionFileSeparator4 = mFileMenu->addSeparator(); +#ifdef HAVE_TABS+  mFileMenu->addAction( mActionRestoreTab );+  mFileMenu->addAction( mActionCloseTab );+#endif   mFileMenu->addAction( mActionExit );    // Edit Menu@@ -1465,6 +1535,7 @@   mToolbarMenu->addAction( mHelpToolBar->toggleViewAction() ); } +#ifndef HAVE_TABS void QgisApp::createStatusBar() {   //@@ -1596,6 +1667,7 @@   statusBar()->addPermanentWidget( mOnTheFlyProjectionStatusButton, 0 );   statusBar()->showMessage( tr( "Ready" ) ); }+#endif   void QgisApp::setTheme( QString theThemeName )@@ -1623,11 +1695,17 @@   QgsApplication::setThemeName( theThemeName );   //QgsDebugMsg("Setting theme to \n" + theThemeName);   mActionNewProject->setIcon( getThemeIcon( "/mActionFileNew.png" ) );+#ifdef HAVE_TABS+  mActionCanvasTab->setIcon( getThemeIcon( "/mActionCanvasTab.png" ) );+#endif   mActionOpenProject->setIcon( getThemeIcon( "/mActionFileOpen.png" ) );   mActionSaveProject->setIcon( getThemeIcon( "/mActionFileSave.png" ) );   mActionSaveProjectAs->setIcon( getThemeIcon( "/mActionFileSaveAs.png" ) );   mActionPrintComposer->setIcon( getThemeIcon( "/mActionFilePrint.png" ) );   mActionSaveMapAsImage->setIcon( getThemeIcon( "/mActionSaveMapAsImage.png" ) );+#ifdef HAVE_TABS+  mActionCloseTab->setIcon( getThemeIcon( "/mActionCloseTab.png" ) );+#endif   mActionExit->setIcon( getThemeIcon( "/mActionFileExit.png" ) );   mActionAddOgrLayer->setIcon( getThemeIcon( "/mActionAddOgrLayer.png" ) );   mActionAddRasterLayer->setIcon( getThemeIcon( "/mActionAddRasterLayer.png" ) );@@ -1703,6 +1781,7 @@ {   // connect the "cleanup" slot   connect( qApp, SIGNAL( aboutToQuit() ), this, SLOT( saveWindowState() ) );+#ifndef HAVE_TABS   //connect the legend, mapcanvas and overview canvas to the registry    // connect map layer registry signals to legend@@ -1736,21 +1815,66 @@   // Do we really need this ??? - its already connected to the esc key...TS   //   connect( mStopRenderButton, SIGNAL( clicked() ), this, SLOT( stopRendering() ) );-+#endif   // Connect warning dialog from project reading   connect( QgsProject::instance(), SIGNAL( oldProjectVersionWarning( QString ) ),            this, SLOT( oldProjectVersionWarning( QString ) ) );-+#ifndef HAVE_TABS   connect( QgsProject::instance(), SIGNAL( layerLoaded( int, int ) ), this, SLOT( showProgress( int, int ) ) );-+#endif   // setup undo/redo actions   connect( mActionUndo, SIGNAL( triggered() ), mUndoWidget, SLOT( undo() ) );   connect( mActionRedo, SIGNAL( triggered() ), mUndoWidget, SLOT( redo() ) );   connect( mUndoWidget, SIGNAL( undoStackChanged() ), this, SLOT( updateUndoActions() ) ); } +#ifdef HAVE_TABS+// it needs here to init map canvas, map legend, map overview and tools+void QgisApp::updateFrame( QgsFrameWidget *frame )+{+  // update main controls of QGis+  mMapCanvas = frame->mapCanvas();+  mMapLegend = frame->mapLegend();+  mMapTools = frame->mapTools();+  mMapOverviewCanvas = frame->mapOverviewCanvas();++  // update state of controls+  mMapCanvas->setMapTool( mMapTools->mCurrentTool );+  mMapLegend->setMapCanvas( mMapCanvas );++  mMapCanvas->enableOverviewMode( mMapOverviewCanvas );+  mMapOverviewCanvas->setMapCanvas( mMapCanvas );+  mOverviewDock->setWidget(mMapOverviewCanvas);++  int idx = frame->mapCanvas()->property("idx").toInt();+  mLegendTabWidget->setCurrentIndex(idx);++  // set status bar for tabbed mapCanvas+  if (frame->objectName() != "theFrameWidgetFloat")+  {+    // set parent of current statusBar to NULL if do not do it statusBar will be removed+    if (findChild<QStatusBar *>())+      statusBar()->setParent( 0 );+    setStatusBar( frame->statusBar() );+  }+//  mMapCanvas->refresh(); // TODO is it needed ???+//  mMapCanvas->setExtent(mMapCanvas->extent());+}+#endif+ void QgisApp::createCanvas() {+#ifdef HAVE_TABS+  // create the main tab widgets+  mDeskTabWidget = new QgsDeskTabWidget( this );+  mLegendTabWidget = new QgsLegendTabWidget(this);++  // create frame (map canvas, map legend, map overview and tools) and add map canvas to tab+  mDeskTabWidget->addFrameTab( "Canvas 1" );+  mDeskTabWidget->updateFrameAt(0);++  setCentralWidget( mDeskTabWidget );+#else   // "theMapCanvas" used to find this canonical instance later   mMapCanvas = new QgsMapCanvas( this, "theMapCanvas" );   mMapCanvas->setWhatsThis( tr( "Map canvas. This is where raster and vector "@@ -1811,11 +1935,28 @@   mMapTools.mRotatePointSymbolsTool->setAction( mActionRotatePointSymbols );   //ensure that non edit tool is initialised or we will get crashes in some situations   mNonEditMapTool = mMapTools.mPan;+#endif } +#ifdef HAVE_TABS void QgisApp::createOverview() {   // overview canvas+  mMapOverviewCanvas = new QgsMapOverviewCanvas();+  mMapOverviewCanvas->setWhatsThis( tr( "Map overview canvas. This canvas can be used to display a locator map that shows the current extent of the map canvas. The current extent is shown as a red rectangle. Any layer on the map can be added to the overview canvas." ) );++  QBitmap overviewPanBmp = QBitmap::fromData( QSize( 16, 16 ), pan_bits );+  QBitmap overviewPanBmpMask = QBitmap::fromData( QSize( 16, 16 ), pan_mask_bits );+  mOverviewMapCursor = new QCursor( overviewPanBmp, overviewPanBmpMask, 0, 0 ); //set upper left corner as hot spot - this is better when extent marker is small; hand won't cover the marker+  mMapOverviewCanvas->setCursor( *mOverviewMapCursor );+}++void QgisApp::createOverviewDock()+{+#else+void QgisApp::createOverview()+{+  // overview canvas   QgsMapOverviewCanvas* overviewCanvas = new QgsMapOverviewCanvas( NULL, mMapCanvas );   overviewCanvas->setWhatsThis( tr( "Map overview canvas. This canvas can be used to display a locator map that shows the current extent of the map canvas. The current extent is shown as a red rectangle. Any layer on the map can be added to the overview canvas." ) ); @@ -1823,14 +1964,21 @@   QBitmap overviewPanBmpMask = QBitmap::fromData( QSize( 16, 16 ), pan_mask_bits );   mOverviewMapCursor = new QCursor( overviewPanBmp, overviewPanBmpMask, 0, 0 ); //set upper left corner as hot spot - this is better when extent marker is small; hand won't cover the marker   overviewCanvas->setCursor( *mOverviewMapCursor );+#endif+ //  QVBoxLayout *myOverviewLayout = new QVBoxLayout; //  myOverviewLayout->addWidget(overviewCanvas); //  overviewFrame->setLayout(myOverviewLayout);   mOverviewDock = new QDockWidget( tr( "Overview" ), this );   mOverviewDock->setObjectName( "Overview" );   mOverviewDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );+#ifndef HAVE_TABS   mOverviewDock->setWidget( overviewCanvas );+#else+  mOverviewDock->setWidget( mMapOverviewCanvas );+#endif   addDockWidget( Qt::LeftDockWidgetArea, mOverviewDock );+#ifndef HAVE_TABS   // add to the Panel submenu   mPanelMenu->addAction( mOverviewDock->toggleViewAction() ); @@ -1844,6 +1992,7 @@   int action = mySettings.value( "/qgis/wheel_action", 0 ).toInt();   double zoomFactor = mySettings.value( "/qgis/zoom_factor", 2 ).toDouble();   mMapCanvas->setWheelAction(( QgsMapCanvas::WheelAction ) action, zoomFactor );+#endif }  void QgisApp::addDockWidget( Qt::DockWidgetArea theArea, QDockWidget * thepDockWidget )@@ -1859,11 +2008,13 @@   mPanelMenu->addAction( thepDockWidget->toggleViewAction() );    thepDockWidget->show();-+#ifndef HAVE_TABS   // refresh the map canvas   mMapCanvas->refresh();+#endif } +#ifndef HAVE_TABS QToolBar *QgisApp::addToolBar( QString name ) {   QToolBar *toolBar = QMainWindow::addToolBar( name );@@ -1871,7 +2022,17 @@   mToolbarMenu->addAction( toolBar->toggleViewAction() );   return toolBar; }+#endif+#ifdef HAVE_TABS+void QgisApp::createLegendDock()+{+  mLegendDock = new QDockWidget( tr( "Layers" ), this );+  mLegendDock->setObjectName( "Legend" );+  mLegendDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );+  mLegendDock->setWidget( mLegendTabWidget ); +  addDockWidget( Qt::LeftDockWidgetArea, mLegendDock );+#else void QgisApp::createLegend() {   //legend@@ -1891,6 +2052,7 @@   // add to the Panel submenu   mPanelMenu->addAction( mLegendDock->toggleViewAction() );   return;+#endif }  bool QgisApp::createDB()@@ -1920,6 +2082,7 @@   return TRUE; } +#ifndef HAVE_TABS void QgisApp::createMapTips() {   // Set up the timer for maptips. The timer is reset everytime the mouse is moved@@ -1931,6 +2094,7 @@   // Create the maptips object   mpMaptip = new QgsMapTip(); }+#endif  // Update file menu with the current list of recently accessed projects void QgisApp::updateRecentProjectPaths()@@ -3139,8 +3303,13 @@   mMapCanvas->mapRenderer()->setProjectionsEnabled( FALSE );    // set the initial map tool+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mPan );+  mNonEditMapTool = mMapTools->mPan;  // signals are not yet setup to catch this+#else   mMapCanvas->setMapTool( mMapTools.mPan );   mNonEditMapTool = mMapTools.mPan;  // signals are not yet setup to catch this+#endif } // QgisApp::fileNew(bool thePromptToSaveFlag)  @@ -3621,6 +3790,39 @@  } // QgisApp::openProject +#ifdef HAVE_TABS+void QgisApp::addTabDialog()+{+  mAddTabDialog->show();+}++void QgisApp::addCanvasTab()+{+  int index = mDeskTabWidget->addFrameTab( tr("Canvas %1").arg( mDeskTabWidget->count() + 1 ) );+  mDeskTabWidget->setCurrentIndex( index );+}++void QgisApp::closeTab()+{+  mDeskTabWidget->removeTab( mDeskTabWidget->currentIndex() );+}++void QgisApp::restoreTab()+{+  mDeskTabWidget->restoreTab();+}++void QgisApp::nextTab()+{+  mDeskTabWidget->nextTab();+}++void QgisApp::previousTab()+{+  mDeskTabWidget->previousTab();+}+#endif+ /**   Open the specified project file; prompt to save previous project if necessary.   Used to process a commandline argument or OpenDocument AppleEvent.@@ -3831,11 +4033,11 @@       // showMaxmized() is a work-around. Turn off rendering for this as it       // would otherwise cause two re-renders of the map, which can take a       // long time.-      bool renderFlag = mapCanvas()->renderFlag();-      mapCanvas()->setRenderFlag( false );+      bool renderFlag = mMapCanvas->renderFlag();+      mMapCanvas->setRenderFlag( false );       showNormal();       showMaximized();-      mapCanvas()->setRenderFlag( renderFlag );+      mMapCanvas->setRenderFlag( renderFlag );       mPrevScreenModeMaximized = false;     }     else@@ -3930,7 +4132,7 @@ {   QgsDebugMsg( "hiding all layers!" ); -  legend()->selectAll( false );+  mMapLegend->selectAll( false ); }  @@ -3939,7 +4141,7 @@ {   QgsDebugMsg( "Showing all layers!" ); -  legend()->selectAll( true );+  mMapLegend->selectAll( true ); }  @@ -3947,7 +4149,11 @@ {   QgsDebugMsg( "Setting map tool to zoomIn" ); +#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mZoomIn );+#else   mMapCanvas->setMapTool( mMapTools.mZoomIn );+#endif    // notify the project we've made a change   QgsProject::instance()->dirty( true );@@ -3956,8 +4162,11 @@  void QgisApp::zoomOut() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mZoomOut );+#else   mMapCanvas->setMapTool( mMapTools.mZoomOut );-+#endif   // notify the project we've made a change   QgsProject::instance()->dirty( true ); }@@ -3972,7 +4181,11 @@  void QgisApp::pan() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mPan );+#else   mMapCanvas->setMapTool( mMapTools.mPan );+#endif }  void QgisApp::zoomFull()@@ -4006,17 +4219,29 @@  void QgisApp::identify() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mIdentify );+#else   mMapCanvas->setMapTool( mMapTools.mIdentify );+#endif }  void QgisApp::measure() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mMeasureDist );+#else   mMapCanvas->setMapTool( mMapTools.mMeasureDist );+#endif }  void QgisApp::measureArea() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mMeasureArea );+#else   mMapCanvas->setMapTool( mMapTools.mMeasureArea );+#endif }  void QgisApp::attributeTable()@@ -4100,22 +4325,38 @@  void QgisApp::moveFeature() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mMoveFeature );+#else   mMapCanvas->setMapTool( mMapTools.mMoveFeature );+#endif }  void QgisApp::simplifyFeature() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mSimplifyFeature );+#else   mMapCanvas->setMapTool( mMapTools.mSimplifyFeature );+#endif }  void QgisApp::deleteRing() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mDeleteRing );+#else   mMapCanvas->setMapTool( mMapTools.mDeleteRing );+#endif }  void QgisApp::deletePart() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mDeletePart );+#else   mMapCanvas->setMapTool( mMapTools.mDeletePart );+#endif }  QgsGeometry* QgisApp::unionGeometries( const QgsVectorLayer* vl, QgsFeatureList& featureList )@@ -4273,22 +4514,38 @@  void QgisApp::nodeTool() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mNodeTool );+#else   mMapCanvas->setMapTool( mMapTools.mNodeTool );+#endif }  void QgisApp::rotatePointSymbols() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mRotatePointSymbolsTool );+#else   mMapCanvas->setMapTool( mMapTools.mRotatePointSymbolsTool );+#endif }  void QgisApp::splitFeatures() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mSplitFeatures );+#else   mMapCanvas->setMapTool( mMapTools.mSplitFeatures );+#endif }  void QgisApp::reshapeFeatures() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mReshapeFeatures );+#else   mMapCanvas->setMapTool( mMapTools.mReshapeFeatures );+#endif }  void QgisApp::capturePoint()@@ -4299,7 +4556,11 @@   }    // set current map tool to select+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mCapturePoint );+#else   mMapCanvas->setMapTool( mMapTools.mCapturePoint );+#endif }  void QgisApp::captureLine()@@ -4309,7 +4570,11 @@     return;   } +#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mCaptureLine );+#else   mMapCanvas->setMapTool( mMapTools.mCaptureLine );+#endif }  void QgisApp::capturePolygon()@@ -4318,12 +4583,20 @@   {     return;   }+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mCapturePolygon );+#else   mMapCanvas->setMapTool( mMapTools.mCapturePolygon );+#endif }  void QgisApp::select() {+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mSelect );+#else   mMapCanvas->setMapTool( mMapTools.mSelect );+#endif }  @@ -4333,7 +4606,11 @@   {     return;   }+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mVertexAdd );+#else   mMapCanvas->setMapTool( mMapTools.mVertexAdd );+#endif  } @@ -4343,7 +4620,11 @@   {     return;   }+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mVertexMove );+#else   mMapCanvas->setMapTool( mMapTools.mVertexMove );+#endif }  void QgisApp::addRing()@@ -4352,7 +4633,11 @@   {     return;   }+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mAddRing );+#else   mMapCanvas->setMapTool( mMapTools.mAddRing );+#endif }  void QgisApp::addIsland()@@ -4361,7 +4646,11 @@   {     return;   }+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mAddIsland );+#else   mMapCanvas->setMapTool( mMapTools.mAddIsland );+#endif }  @@ -4371,7 +4660,11 @@   {     return;   }+#ifdef HAVE_TABS+  mMapCanvas->setMapTool( mMapTools->mVertexDelete );+#else   mMapCanvas->setMapTool( mMapTools.mVertexDelete );+#endif }  @@ -4481,12 +4774,12 @@  void QgisApp::toggleMapTips() {-  mMapTipsVisible = !mMapTipsVisible;-  // if off, stop the timer-  if ( !mMapTipsVisible )-  {-    mpMapTipsTimer->stop();-  }+//  mMapTipsVisible = !mMapTipsVisible;+//  // if off, stop the timer+//  if ( !mMapTipsVisible )+//  {+//    mpMapTipsTimer->stop();+//  }  // TODO !!! }  void QgisApp::toggleEditing()@@ -4568,6 +4861,7 @@   vlayer->triggerRepaint(); } +#ifndef HAVE_TABS void QgisApp::showMouseCoordinate( const QgsPoint & p ) {   if ( mMapTipsVisible )@@ -4601,7 +4895,6 @@   } } - void QgisApp::showScale( double theScale ) {   if ( theScale >= 1.0 )@@ -4662,8 +4955,8 @@   );   mMapCanvas->refresh(); }+#endif - // toggle overview status void QgisApp::isInOverview() {@@ -5264,6 +5557,7 @@   mPluginToolBar->removeAction( qAction ); } +#ifndef HAVE_TABS void QgisApp::destinationSrsChanged() {   // save this information to project@@ -5354,8 +5648,8 @@     mCoordsEdit->setMinimumWidth( mCoordsEdit->width() );   } } // QgisApp::showExtents--+#endif+#ifdef HAVE_TABS void QgisApp::updateMouseCoordinatePrecision() {   // Work out what mouse display precision to use. This only needs to@@ -5383,7 +5677,8 @@    mMousePrecisionDecimalPlaces = dp; }-+#endif+#ifndef HAVE_TABS void QgisApp::showStatusMessage( QString theMessage ) {   statusBar()->showMessage( theMessage );@@ -5423,6 +5718,7 @@     }   } }+ void QgisApp::projectPropertiesProjections() {   // Driver to display the project props dialog and switch to the@@ -5430,7 +5726,7 @@   mShowProjectionTab = true;   projectProperties(); }-+#endif void QgisApp::projectProperties() {   if ( mMapCanvas && mMapCanvas->isDrawing() )@@ -6273,3 +6569,30 @@   mActionUndo->setEnabled( canUndo );   mActionRedo->setEnabled( canRedo ); }++#ifdef HAVE_TABS+QgisApp::Tools::~Tools()+{+  delete mZoomIn;+  delete mZoomOut;+  delete mPan;+  delete mIdentify;+  delete mMeasureDist;+  delete mMeasureArea;+  delete mCapturePoint;+  delete mCaptureLine;+  delete mCapturePolygon;+  delete mMoveFeature;+  delete mSplitFeatures;+  delete mSelect;+  delete mVertexAdd;+  delete mVertexMove;+  delete mVertexDelete;+  delete mAddRing;+  delete mAddIsland;+  delete mSimplifyFeature;+  delete mDeleteRing;+  delete mDeletePart;+  delete mNodeTool;+}+#endifIndex: src/app/qgisappinterface.cpp===================================================================--- src/app/qgisappinterface.cpp	(revision 11821)+++ src/app/qgisappinterface.cpp	(working copy)@@ -30,6 +30,9 @@ #include "qgsmapcanvas.h" #include "qgslegend.h" #include "qgsshortcutsmanager.h"+#ifdef HAVE_TABS+#include "tabs/qgsdesktabwidget.h"+#endif  QgisAppInterface::QgisAppInterface( QgisApp * _qgis )     : qgis( _qgis )@@ -142,6 +145,13 @@   return qgis->mapCanvas(); } +#ifdef HAVE_TABS+QgsDeskTabWidgetInterface * QgisAppInterface::deskTabWidget()+{+  return qgis->deskTabWidget();+}+#endif+ QWidget * QgisAppInterface::mainWindow() {   return qgis;Index: src/gui/qgsmapoverviewcanvas.h===================================================================--- src/gui/qgsmapoverviewcanvas.h	(revision 11821)+++ src/gui/qgsmapoverviewcanvas.h	(working copy)@@ -62,6 +62,10 @@      void updateFullExtent( const QgsRectangle& rect ); +#ifdef HAVE_TABS+    void setMapCanvas( QgsMapCanvas * canvas ) {mMapCanvas = canvas;}+#endif+   public slots:      void hasCrsTransformEnabled( bool flag );Index: src/gui/CMakeLists.txt===================================================================--- src/gui/CMakeLists.txt	(revision 11821)+++ src/gui/CMakeLists.txt	(working copy)@@ -28,6 +28,20 @@ qgsvertexmarker.cpp ) +IF (HAVE_TABS)+  SET (QGIS_GUI_SRCS ${QGIS_GUI_SRCS}+    tabs/qgsaddtabdialog.cpp+    tabs/qgsdesktabbar.cpp+    tabs/qgsdesktabwidget.cpp+    tabs/qgsdesktabwidgetinterface.cpp+    tabs/qgsfloatcanvaswindow.cpp+    tabs/qgslegendtabbar.cpp+    tabs/qgslegendtabwidget.cpp+    tabs/qgstabbarbase.cpp+    tabs/qgswidgetregistry.cpp+  )+ENDIF (HAVE_TABS)+  SET(QGIS_GUI_MOC_HDRS qgscomposerview.h qgsdetaileditemdelegate.h@@ -43,6 +57,20 @@ qgsquickprint.h ) +IF (HAVE_TABS)+  SET (QGIS_GUI_MOC_HDRS ${QGIS_GUI_MOC_HDRS}+    tabs/qgsaddtabdialog.h+    tabs/qgsdesktabbar.h+    tabs/qgsdesktabwidget.h+    tabs/qgsdesktabwidgetinterface.h+    tabs/qgsfloatcanvaswindow.h+    tabs/qgslegendtabbar.h+    tabs/qgslegendtabwidget.h+    tabs/qgstabbarbase.h+    tabs/qgswidgetregistry.h+  )+ENDIF (HAVE_TABS)+ QT4_WRAP_CPP(QGIS_GUI_MOC_SRCS ${QGIS_GUI_MOC_HDRS})  INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ../core@@ -51,6 +79,9 @@      ${CMAKE_CURRENT_BINARY_DIR}/../ui      ${GEOS_INCLUDE_DIR} )+IF (HAVE_TABS)+     INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} tabs)+ENDIF (HAVE_TABS) IF (WITH_INTERNAL_SPATIALITE)   INCLUDE_DIRECTORIES(../core/spatialite/headers/spatialite) ELSE (WITH_INTERNAL_SPATIALITE)@@ -130,7 +161,6 @@ ${CMAKE_CURRENT_BINARY_DIR}/../ui/ui_qgsprojectionselectorbase.h ) - INSTALL(CODE "MESSAGE(\"Installing GUI headers...\")") INSTALL(FILES ${QGIS_GUI_HDRS} ${QGIS_GUI_MOC_HDRS} DESTINATION ${QGIS_INCLUDE_DIR}) Index: src/gui/qgisinterface.h===================================================================--- src/gui/qgisinterface.h	(revision 11821)+++ src/gui/qgisinterface.h	(working copy)@@ -19,8 +19,13 @@ #ifndef QGISINTERFACE_H #define QGISINTERFACE_H +#include "qgsconfig.h"+ class QAction; class QMenu;+#ifdef HAVE_TABS+class QIcon;+#endif class QToolBar; class QDockWidget; class QMainWindow;@@ -30,6 +35,9 @@  #include <map> +#ifdef HAVE_TABS+#include "tabs/qgsdesktabwidgetinterface.h"+#endif  class QgisApp; class QgsComposerView;@@ -107,6 +115,11 @@     /** Return a pointer to the map canvas */     virtual QgsMapCanvas * mapCanvas() = 0; +#ifdef HAVE_TABS+    /** Return a pointer to the main tab widget */+    virtual QgsDeskTabWidgetInterface * deskTabWidget() = 0;+#endif+     /** Return a pointer to the main window (instance of QgisApp in case of QGIS) */     virtual QWidget * mainWindow() = 0; Index: CMakeLists.txt===================================================================--- CMakeLists.txt	(revision 11821)+++ CMakeLists.txt	(working copy)@@ -64,6 +64,13 @@   ENDIF (WITH_INTERNAL_SPATIALITE) ENDIF (WITH_SPATIALITE) +# whether build gui with tabs+SET (TABBED_GUI TRUE CACHE BOOL "Build QGIS with tabs?")++IF (TABBED_GUI)+  SET(HAVE_TABS TRUE)+ENDIF(TABBED_GUI)+ # try to configure and build python bindings by default SET (WITH_BINDINGS TRUE CACHE BOOL "Determines whether python bindings should be built") IF (WITH_BINDINGS)Index: cmake_templates/qgsconfig.h.in===================================================================--- cmake_templates/qgsconfig.h.in	(revision 11821)+++ cmake_templates/qgsconfig.h.in	(working copy)@@ -29,5 +29,7 @@ 
 #cmakedefine HAVE_PYTHON
 
+#cmakedefine HAVE_TABS
+
 #endif