rpms/qgis/F-12 qgis-1.4.0-QVariant.patch, NONE, 1.1 qgis-1.4.0-asslibqgis.patch, NONE, 1.1 qgis-1.4.0-asslibqgisv.patch, NONE, 1.1 qgis-1.4.0-fieldcalc.patch, NONE, 1.1 qgis-1.4.0-grass.patch, NONE, 1.1 qgis-1.4.0-qt47.patch, NONE, 1.1 qgis-1.4.0-savebutton.patch, NONE, 1.1 qgis-1.4.0-sip410.patch, NONE, 1.1 qgis-1.4.0-vectorcrs.patch, NONE, 1.1 .cvsignore, 1.9, 1.10 qgis.desktop, 1.1, 1.2 qgis.spec, 1.42, 1.43 sources, 1.9, 1.10 qgis-1.0.2-sip410.patch, 1.1, NONE qgis-1.0.2-sip49.patch, 1.1, NONE

Volker Fröhlich volter at fedoraproject.org
Mon Jul 12 10:47:33 UTC 2010


Author: volter

Update of /cvs/pkgs/rpms/qgis/F-12
In directory cvs01.phx2.fedoraproject.org:/tmp/cvs-serv27987

Modified Files:
	.cvsignore qgis.desktop qgis.spec sources 
Added Files:
	qgis-1.4.0-QVariant.patch qgis-1.4.0-asslibqgis.patch 
	qgis-1.4.0-asslibqgisv.patch qgis-1.4.0-fieldcalc.patch 
	qgis-1.4.0-grass.patch qgis-1.4.0-qt47.patch 
	qgis-1.4.0-savebutton.patch qgis-1.4.0-sip410.patch 
	qgis-1.4.0-vectorcrs.patch 
Removed Files:
	qgis-1.0.2-sip410.patch qgis-1.0.2-sip49.patch 
Log Message:
Update to 1.4.0


qgis-1.4.0-QVariant.patch:
 qgscomposer.cpp |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- NEW FILE qgis-1.4.0-QVariant.patch ---
--- qgis-1.4.0/src/app/composer/qgscomposer.cpp	2010-07-08 02:11:17.760602369 +0200
+++ qgis-1.4.0-QVariant/src/app/composer/qgscomposer.cpp	2010-07-09 09:32:38.158621669 +0200
@@ -1030,7 +1030,7 @@
   QSettings settings;
   restoreGeometry( settings.value( "/Composer/geometry" ).toByteArray() );
   QVariant splitterState = settings.value( "/Composer/splitterState" );
-  if ( splitterState != QVariant::QVariant() )
+  if ( splitterState != QVariant() )
   {
     //mSplitter->restoreState(settings.value("/Composer/splitterState").toByteArray());
   }

qgis-1.4.0-asslibqgis.patch:
 qgscoordinatereferencesystem.cpp |   17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

--- NEW FILE qgis-1.4.0-asslibqgis.patch ---
Index: /trunk/qgis/src/core/qgscoordinatereferencesystem.cpp
===================================================================
--- qgis-1.4.0/src/core/qgscoordinatereferencesystem.cpp (revision 13307)
+++ /trunk/qgis/src/core/qgscoordinatereferencesystem.cpp (revision 13508)
@@ -32,5 +32,4 @@
 #include "qgis.h" //const vals declared here
 
-#include <cassert>
 #include <sqlite3.h>
 
@@ -1146,5 +1145,5 @@
   sqlite3_close( db );
 
-  //assert(myProjString.length() > 0);
+  //Q_ASSERT(myProjString.length() > 0);
   return myProjString;
 }
@@ -1260,10 +1259,8 @@
   if ( myResult != SQLITE_OK )
   {
-    QgsDebugMsg( QString( "Can't open database: %1 \n please notify  QGIS developers of this error \n %2 (file name) " )
-                 .arg( sqlite3_errmsg( myDatabase ) )
-                 .arg( QgsApplication::qgisUserDbFilePath() ) );
-    // XXX This will likely never happen since on open, sqlite creates the
-    //     database if it does not exist.
-    assert( myResult == SQLITE_OK );
+    QgsDebugMsg( QString( "Can't open or create database %1: %2" )
+                 .arg( QgsApplication::qgisUserDbFilePath() )
+                 .arg( sqlite3_errmsg( myDatabase ) ) );
+    return false;
   }
   QgsDebugMsg( QString( "Update or insert sql \n%1" ).arg( mySql ) );
@@ -1286,7 +1283,5 @@
   {
     QgsDebugMsg( QString( "Can't open database: %1" ).arg( sqlite3_errmsg( myDatabase ) ) );
-    // XXX This will likely never happen since on open, sqlite creates the
-    //     database if it does not exist.
-    assert( myResult == SQLITE_OK );
+    return 0;
   }
   // Set up the query to retrieve the projection information needed to populate the ELLIPSOID list

qgis-1.4.0-asslibqgisv.patch:
 qgscoordinatereferencesystem.cpp.patched |   15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

--- NEW FILE qgis-1.4.0-asslibqgisv.patch ---
--- /src/core/qgscoordinatereferencesystem.cpp	2010-06-07 21:40:15.448733536 +0200
+++ qgscoordinatereferencesystem.cpp.patched	2010-06-07 22:05:03.340736906 +0200
@@ -31,7 +31,6 @@
 #include "qgsmessageoutput.h"
 #include "qgis.h" //const vals declared here
 
-#include <cassert>
 #include <sqlite3.h>
 
 //gdal and ogr includes (needed for == operator)
@@ -1127,7 +1126,7 @@
   // close the database
   sqlite3_close( db );
 
-  //assert(myProjString.length() > 0);
+  //Q_ASSERT(myProjString.length() > 0);
   return myProjString;
 }
 
@@ -1238,10 +1237,10 @@
   myResult = sqlite3_open( QgsApplication::qgisUserDbFilePath().toUtf8().data(), &myDatabase );
   if ( myResult != SQLITE_OK )
   {
-    QgsDebugMsg( QString( "Can't open database: %1 \n please notify  QGIS developers of this error \n %2 (file name) " ).arg( sqlite3_errmsg( myDatabase ) ).arg( QgsApplication::qgisUserDbFilePath() ) );
-    // XXX This will likely never happen since on open, sqlite creates the
-    //     database if it does not exist.
-    assert( myResult == SQLITE_OK );
+    QgsDebugMsg( QString( "Can't open or create database %1: %2" )
+    .arg( QgsApplication::qgisUserDbFilePath() )
+    .arg( sqlite3_errmsg( myDatabase ) ) );
+    return false;
   }
   QgsDebugMsg( QString( "Update or insert sql \n%1" ).arg( mySql ) );
   myResult = sqlite3_prepare( myDatabase, mySql.toUtf8(), mySql.toUtf8().length(), &myPreparedStatement, &myTail );
@@ -1263,9 +1262,7 @@
   if ( myResult != SQLITE_OK )
   {
     QgsDebugMsg( QString( "Can't open database: %1" ).arg( sqlite3_errmsg( myDatabase ) ) );
-    // XXX This will likely never happen since on open, sqlite creates the
-    //     database if it does not exist.
-    assert( myResult == SQLITE_OK );
+    return 0;
   }
   // Set up the query to retrieve the projection information needed to populate the ELLIPSOID list
   QString mySql = "select count(*) from tbl_srs";

qgis-1.4.0-fieldcalc.patch:
 qgsfieldcalculator.cpp |   13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

--- NEW FILE qgis-1.4.0-fieldcalc.patch ---
Index: /trunk/qgis/src/app/qgsfieldcalculator.cpp
===================================================================
--- qgis-1.4.0/src/app/qgsfieldcalculator.cpp (revision 12551)
+++ /trunk/qgis/src/app/qgsfieldcalculator.cpp (revision 13046)
@@ -25,4 +25,9 @@
   setupUi( this );
 
+  if ( !vl )
+  {
+    return;
+  }
+
   populateFields();
   populateOutputFieldTypes();
@@ -32,5 +37,5 @@
   mOutputFieldPrecisionSpinBox->setValue( 3 );
 
-  mUpdateExistingFieldCheckBox->setCheckState( Qt::Checked );
+
 
   //disable ok button until there is text for output field and expression
@@ -40,7 +45,13 @@
   if ( !( vl->dataProvider()->capabilities() & QgsVectorDataProvider::AddAttributes ) )
   {
+    mUpdateExistingFieldCheckBox->setCheckState( Qt::Checked );
     mUpdateExistingFieldCheckBox->setEnabled( false ); // must stay checked
     mNewFieldGroupBox->setEnabled( false );
     mNewFieldGroupBox->setTitle( mNewFieldGroupBox->title() + tr( " (not supported by provider)" ) );
+  }
+
+  if ( vl->selectedFeaturesIds().size() > 0 )
+  {
+    mOnlyUpdateSelectedCheckBox->setChecked( true );
   }
 

qgis-1.4.0-grass.patch:
 FindGRASS.cmake |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- NEW FILE qgis-1.4.0-grass.patch ---
--- qgis-1.4.0/cmake/FindGRASS.cmake	2009-11-28 17:02:15.000000000 +0100
+++ qgis-1.4.0-grass/cmake/FindGRASS.cmake	2010-06-09 00:45:47.444614774 +0200
@@ -12,7 +12,7 @@
     MARK_AS_ADVANCED ( GRASS_LIBRARY_${LIB} )
 
     SET(LIB_PATH NOTFOUND)
-    FIND_LIBRARY(LIB_PATH NAMES grass_${LIB} PATHS ${G_PREFIX}/lib NO_DEFAULT_PATH)
+    FIND_LIBRARY(LIB_PATH NAMES grass_${LIB} PATHS ${G_PREFIX}/lib)
 
     IF (LIB_PATH)
       SET (GRASS_LIBRARY_${LIB} ${LIB_PATH})

qgis-1.4.0-qt47.patch:
 core/qgscoordinatereferencesystem.cpp |    6 +++---
 core/qgshttptransaction.cpp           |    4 ++--
 core/qgsmessageoutput.cpp             |    2 +-
 core/qgsvectorlayer.h                 |    6 +++---
 plugins/grass/qgsgrassmapcalc.h       |    6 +++---
 plugins/grass/qgsgrassmodule.cpp      |    4 ++--
 providers/wms/qgswmsprovider.cpp      |    2 +-
 providers/wms/qgswmsprovider.h        |    2 +-
 8 files changed, 16 insertions(+), 16 deletions(-)

--- NEW FILE qgis-1.4.0-qt47.patch ---
diff -uNr qgis-1.4.0/src/core/qgscoordinatereferencesystem.cpp qgis-1.4.0-qt47/src/core/qgscoordinatereferencesystem.cpp
--- qgis-1.4.0/src/core/qgscoordinatereferencesystem.cpp	2010-07-08 02:11:17.653725525 +0200
+++ qgis-1.4.0-qt47/src/core/qgscoordinatereferencesystem.cpp	2010-07-08 02:57:33.313600187 +0200
@@ -47,7 +47,7 @@
 QgsCoordinateReferenceSystem::QgsCoordinateReferenceSystem()
     : mMapUnits( QGis::UnknownUnit ),
     mIsValidFlag( 0 ),
-    mValidationHint( 0 )
+    mValidationHint()
 {
   mCRS = OSRNewSpatialReference( NULL );
 }
@@ -55,7 +55,7 @@
 QgsCoordinateReferenceSystem::QgsCoordinateReferenceSystem( QString theWkt )
     : mMapUnits( QGis::UnknownUnit ),
     mIsValidFlag( 0 ),
-    mValidationHint( 0 )
+    mValidationHint()
 {
   mCRS = OSRNewSpatialReference( NULL );
   createFromWkt( theWkt );
@@ -65,7 +65,7 @@
 QgsCoordinateReferenceSystem::QgsCoordinateReferenceSystem( const long theId, CrsType theType )
     : mMapUnits( QGis::UnknownUnit ),
     mIsValidFlag( 0 ),
-    mValidationHint( 0 )
+    mValidationHint()
 {
   mCRS = OSRNewSpatialReference( NULL );
   createFromId( theId, theType );
diff -uNr qgis-1.4.0/src/core/qgshttptransaction.cpp qgis-1.4.0-qt47/src/core/qgshttptransaction.cpp
--- qgis-1.4.0/src/core/qgshttptransaction.cpp	2010-07-08 02:11:17.634633912 +0200
+++ qgis-1.4.0-qt47/src/core/qgshttptransaction.cpp	2010-07-08 02:08:03.768600629 +0200
@@ -45,10 +45,10 @@
                                         QNetworkProxy::ProxyType proxyType,
                                         QString userName,
                                         QString password )
-    : httpresponsecontenttype( 0 ),
+    : httpresponsecontenttype(),
     httpurl( uri ),
     httphost( proxyHost ),
-    mError( 0 )
+    mError()
 {
   QSettings s;
   mNetworkTimeoutMsec = s.value( "/qgis/networkAndProxy/networkTimeout", "20000" ).toInt();
diff -uNr qgis-1.4.0/src/core/qgsmessageoutput.cpp qgis-1.4.0-qt47/src/core/qgsmessageoutput.cpp
--- qgis-1.4.0/src/core/qgsmessageoutput.cpp	2010-07-08 02:11:17.628600247 +0200
+++ qgis-1.4.0-qt47/src/core/qgsmessageoutput.cpp	2010-07-08 02:08:40.298600356 +0200
@@ -44,7 +44,7 @@
 // QgsMessageOutputConsole
 
 QgsMessageOutputConsole::QgsMessageOutputConsole()
-    : mMessage( NULL )
+    : mMessage()
 {
 }
 
diff -uNr qgis-1.4.0/src/core/qgsvectorlayer.h qgis-1.4.0-qt47/src/core/qgsvectorlayer.h
--- qgis-1.4.0/src/core/qgsvectorlayer.h	2010-07-08 02:11:17.615600358 +0200
+++ qgis-1.4.0-qt47/src/core/qgsvectorlayer.h	2010-07-08 02:22:35.046600640 +0200
@@ -91,8 +91,8 @@
     };
 
     /** Constructor */
-    QgsVectorLayer( QString path = 0, QString baseName = 0,
-                    QString providerLib = 0, bool loadDefaultStyleFlag = true );
+    QgsVectorLayer( QString path = QString(), QString baseName = QString(),
+                    QString providerLib = QString(), bool loadDefaultStyleFlag = true );
 
     /** Destructor */
     virtual ~QgsVectorLayer();
@@ -107,7 +107,7 @@
     QString dataComment() const;
 
     /** Set the primary display field to be used in the identify results dialog */
-    void setDisplayField( QString fldName = 0 );
+    void setDisplayField( QString fldName = QString() );
 
     /** Returns the primary display field name used in the identify results dialog */
     const QString displayField() const;
diff -uNr qgis-1.4.0/src/plugins/grass/qgsgrassmapcalc.h qgis-1.4.0-qt47/src/plugins/grass/qgsgrassmapcalc.h
--- qgis-1.4.0/src/plugins/grass/qgsgrassmapcalc.h	2010-07-08 02:11:18.125600853 +0200
+++ qgis-1.4.0-qt47/src/plugins/grass/qgsgrassmapcalc.h	2010-07-09 12:34:31.686962175 +0200
@@ -219,8 +219,8 @@
 
     QgsGrassMapcalcFunction() {};
     QgsGrassMapcalcFunction( int type, QString name, int count = 2,
-                             QString description = 0, QString label = 0,
-                             QString labels = 0, bool drawLabel = true );
+                             QString description = QString(), QString label = QString(),
+                             QString labels = QString(), bool drawLabel = true );
     ~QgsGrassMapcalcFunction() {};
 
     QString name() { return mName; }
@@ -331,7 +331,7 @@
     ~QgsGrassMapcalcObject();
 
     // Set map name, constant value or function/operator
-    void setValue( QString val, QString lab = 0 );
+    void setValue( QString val, QString lab = QString() );
 
     // Set function
     void setFunction( QgsGrassMapcalcFunction f );
diff -uNr qgis-1.4.0/src/plugins/grass/qgsgrassmodule.cpp qgis-1.4.0-qt47/src/plugins/grass/qgsgrassmodule.cpp
--- qgis-1.4.0/src/plugins/grass/qgsgrassmodule.cpp	2010-07-08 02:11:17.914600309 +0200
+++ qgis-1.4.0-qt47/src/plugins/grass/qgsgrassmodule.cpp	2010-07-09 13:27:12.574961370 +0200
@@ -1946,7 +1946,7 @@
     QWidget * parent )
     : QgsGrassModuleGroupBoxItem( module, key, qdesc, gdesc, gnode, parent ),
     mModuleStandardOptions( options ),
-    mGeometryTypeOption( 0 ), mVectorLayerOption( 0 ),
+    mGeometryTypeOption( QString() ), mVectorLayerOption( QString() ),
     mRegionButton( 0 ), mUpdate( false ), mRequired( false )
 {
   QgsDebugMsg( "called." );
@@ -2581,7 +2581,7 @@
   QgsGrassModule *module, int type, QString key, QDomElement &qdesc,
   QDomElement &gdesc, QDomNode &gnode, QWidget * parent )
     : QgsGrassModuleGroupBoxItem( module, key, qdesc, gdesc, gnode, parent ),
-    mType( type ), mOgrLayerOption( 0 ), mOgrWhereOption( 0 )
+    mType( type ), mOgrLayerOption( QString() ), mOgrWhereOption( QString() )
 {
   if ( mTitle.isEmpty() )
   {
diff -uNr qgis-1.4.0/src/providers/wms/qgswmsprovider.cpp qgis-1.4.0-qt47/src/providers/wms/qgswmsprovider.cpp
--- qgis-1.4.0/src/providers/wms/qgswmsprovider.cpp	2010-07-08 02:11:18.200725039 +0200
+++ qgis-1.4.0-qt47/src/providers/wms/qgswmsprovider.cpp	2010-07-09 02:13:01.258782364 +0200
@@ -60,7 +60,7 @@
     cachedPixelHeight( 0 ),
     mCoordinateTransform( 0 ),
     extentDirty( TRUE ),
-    mGetFeatureInfoUrlBase( 0 ),
+    mGetFeatureInfoUrlBase(),
     mLayerCount( -1 )
 
 {
diff -uNr qgis-1.4.0/src/providers/wms/qgswmsprovider.h qgis-1.4.0-qt47/src/providers/wms/qgswmsprovider.h
--- qgis-1.4.0/src/providers/wms/qgswmsprovider.h	2010-07-08 02:11:18.200725039 +0200
+++ qgis-1.4.0-qt47/src/providers/wms/qgswmsprovider.h	2010-07-08 10:49:46.516564676 +0200
@@ -341,7 +341,7 @@
     *                otherwise we contact the host directly.
     *
     */
-    QgsWmsProvider( QString const & uri = 0 );
+    QgsWmsProvider( QString const & uri = QString() );
 
     //! Destructor
     virtual ~QgsWmsProvider();

qgis-1.4.0-savebutton.patch:
 images/images.qrc                 |    1 
 python/core/symbology-ng-core.sip |    3 
 src/app/legend/qgslegend.cpp      |  190 +-----------
 src/app/legend/qgslegend.h        |   26 -
 src/app/legend/qgslegendlayer.cpp |  129 --------
 src/app/legend/qgslegendlayer.h   |   10 
 src/app/qgisapp.cpp               |  581 ++++++++++++++++++++++++--------------
 src/app/qgisapp.h                 |   37 +-
 src/app/qgsattributedialog.cpp    |    1 
 src/app/qgsattributedialog.h      |    3 
 src/app/qgsmaptoolnodetool.cpp    |    4 
 src/app/qgsmeasuredialog.cpp      |    2 
 src/app/qgsundowidget.cpp         |   20 -
 src/core/qgsapplication.cpp       |    1 
 src/core/qgsmaplayerregistry.cpp  |    1 
 src/core/qgsmaplayerregistry.h    |    2 
 src/core/qgsvectorlayer.cpp       |   10 
 17 files changed, 470 insertions(+), 551 deletions(-)

--- NEW FILE qgis-1.4.0-savebutton.patch ---
Index: /trunk/qgis/python/core/symbology-ng-core.sip
===================================================================
--- qgis-1.4.0/python/core/symbology-ng-core.sip (revision 13416)
+++ /trunk/qgis/python/core/symbology-ng-core.sip (revision 13501)
@@ -490,6 +490,5 @@
     void setRenderHints( int hints );
 
-    // Colour used for selections
-
+    // Color used for selections
     static QColor selectionColor();
 
Index: /trunk/qgis/src/app/legend/qgslegendlayer.cpp
===================================================================
--- qgis-1.4.0/src/app/legend/qgslegendlayer.cpp (revision 13460)
+++ /trunk/qgis/src/app/legend/qgslegendlayer.cpp (revision 13501)
@@ -34,8 +34,4 @@
 #include "qgsvectorlayer.h"
 #include "qgsvectordataprovider.h"
-#include "qgsvectorfilewriter.h"
-#include "qgsgenericprojectionselector.h"
-#include "qgsattributetabledialog.h"
-#include "ogr/qgsvectorlayersaveasdialog.h"
 
 #include "qgsrendererv2.h"
@@ -172,4 +168,6 @@
     rasterLayerSymbology( rlayer ); // get and change symbology
   }
+
+  updateIcon();
 }
 
@@ -303,6 +301,4 @@
 
   changeSymbologySettings( layer, itemList );
-
-  updateIcon();
 }
 
@@ -381,8 +377,8 @@
 }
 
-void QgsLegendLayer::addToPopupMenu( QMenu& theMenu, QAction* toggleEditingAction )
-{
-
-  QgsMapLayer* lyr = layer();
+void QgsLegendLayer::addToPopupMenu( QMenu& theMenu )
+{
+  QgsMapLayer *lyr = layer();
+  QAction *toggleEditingAction = QgisApp::instance()->actionToggleEditing();
 
   // zoom to layer extent
@@ -402,6 +398,5 @@
 
   // remove from canvas
-  theMenu.addAction( QgisApp::getThemeIcon( "/mActionRemove.png" ),
-                     tr( "&Remove" ), legend(), SLOT( removeCurrentLayer() ) );
+  theMenu.addAction( QgisApp::getThemeIcon( "/mActionRemove.png" ), tr( "&Remove" ), QgisApp::instance(), SLOT( removeLayer() ) );
 
   theMenu.addSeparator();
@@ -412,5 +407,6 @@
 
     // attribute table
-    theMenu.addAction( tr( "&Open attribute table" ), this, SLOT( table() ) );
+    theMenu.addAction( tr( "&Open attribute table" ),
+                       QgisApp::instance(), SLOT( attributeTable() ) );
 
     // allow editing
@@ -426,12 +422,14 @@
 
     // save as vector file
-    theMenu.addAction( tr( "Save as..." ), this, SLOT( saveAsVectorFile() ) );
+    theMenu.addAction( tr( "Save as..." ), QgisApp::instance(), SLOT( saveAsVectorFile() ) );
 
     // save selection as vector file
-    QAction* saveSelectionAsAction = theMenu.addAction( tr( "Save selection as..." ), this, SLOT( saveSelectionAsVectorFile() ) );
+    QAction* saveSelectionAsAction = theMenu.addAction( tr( "Save selection as..." ), QgisApp::instance(), SLOT( saveSelectionAsVectorFile() ) );
     if ( vlayer->selectedFeatureCount() == 0 )
     {
       saveSelectionAsAction->setEnabled( false );
     }
+
+    theMenu.addAction( tr( "&Subset" ), QgisApp::instance(), SLOT( layerSubsetString() ) );
 
     theMenu.addSeparator();
@@ -440,24 +438,5 @@
   // properties goes on bottom of menu for consistency with normal ui standards
   // e.g. kde stuff
-  theMenu.addAction( tr( "&Properties" ), legend(), SLOT( legendLayerShowProperties() ) );
-
-}
-
-void QgsLegendLayer::table()
-{
-  QgsVectorLayer * myLayer = qobject_cast<QgsVectorLayer *>( mLyr.layer() );
-  QgsAttributeTableDialog *mDialog = new QgsAttributeTableDialog( myLayer );
-  mDialog->show();
-  // the dialog will be deleted by itself on close
-}
-
-void QgsLegendLayer::saveAsVectorFile()
-{
-  saveAsVectorFileGeneral( false );
-}
-
-void QgsLegendLayer::saveSelectionAsVectorFile()
-{
-  saveAsVectorFileGeneral( true );
+  theMenu.addAction( tr( "&Properties" ), QgisApp::instance(), SLOT( layerProperties() ) );
 }
 
@@ -492,82 +471,4 @@
   legend()->updateMapCanvasLayerSet();
   legend()->updateOverview();
-}
-
-void QgsLegendLayer::saveAsVectorFileGeneral( bool saveOnlySelection )
-{
-  QgsCoordinateReferenceSystem destCRS;
-
-  if ( mLyr.layer()->type() != QgsMapLayer::VectorLayer )
-    return;
-
-  QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer *>( mLyr.layer() );
-
-  QgsVectorLayerSaveAsDialog *dialog = new QgsVectorLayerSaveAsDialog( QgisApp::instance() );
-
-  if ( dialog->exec() == QDialog::Accepted )
-  {
-    QString encoding = dialog->encoding();
-    QString vectorFilename = dialog->filename();
-    QString format = dialog->format();
-
-    if ( dialog->crs() < 0 )
-    {
-      // Find out if we have projections enabled or not
-      if ( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() )
-      {
-        destCRS = QgisApp::instance()->mapCanvas()->mapRenderer()->destinationSrs();
-      }
-      else
-      {
-        destCRS = vlayer->srs();
-      }
-    }
-    else
-    {
-      destCRS = QgsCoordinateReferenceSystem( dialog->crs(), QgsCoordinateReferenceSystem::InternalCrsId );
-    }
-
-    // overwrite the file - user will already have been prompted
-    // to verify they want to overwrite by the file dialog above
-    // might not even exists in the given case.
-    // add the extension if not present
-    if ( format == "ESRI Shapefile" )
-    {
-      if ( !vectorFilename.endsWith( ".shp", Qt::CaseInsensitive ) )
-      {
-        vectorFilename += ".shp";
-      }
-      QgsVectorFileWriter::deleteShapeFile( vectorFilename );
-    }
-
-    //GE does not open files without extensions. Therefore we append it automatically for kml files
-    if ( format == "KML" )
-    {
-      if ( !vectorFilename.endsWith( ".kml", Qt::CaseInsensitive ) )
-      {
-        vectorFilename += ".kml";
-      }
-    }
-
-    // ok if the file existed it should be deleted now so we can continue...
-    QApplication::setOverrideCursor( Qt::WaitCursor );
-
-    QgsVectorFileWriter::WriterError error;
-    QString errorMessage;
-    error = QgsVectorFileWriter::writeAsVectorFormat( vlayer, vectorFilename, encoding, &destCRS, format, saveOnlySelection, &errorMessage );
-
-    QApplication::restoreOverrideCursor();
-
-    if ( error == QgsVectorFileWriter::NoError )
-    {
-      QMessageBox::information( 0, tr( "Saving done" ), tr( "Export to vector file has been completed" ) );
-    }
-    else
-    {
-      QMessageBox::warning( 0, tr( "Save error" ), tr( "Export to vector file failed.\nError: %1" ).arg( errorMessage ) );
-    }
-  }
-
-  delete dialog;
 }
 
@@ -589,5 +490,4 @@
 }
 
-
 QgsMapCanvasLayer& QgsLegendLayer::canvasLayer()
 {
@@ -600,3 +500,2 @@
   setText( 0, name );
 }
-
Index: /trunk/qgis/src/app/legend/qgslegend.cpp
===================================================================
--- qgis-1.4.0/src/app/legend/qgslegend.cpp (revision 13476)
+++ /trunk/qgis/src/app/legend/qgslegend.cpp (revision 13501)
@@ -33,10 +33,5 @@
 #include "qgsproject.h"
 #include "qgsrasterlayer.h"
-#include "qgsrasterlayerproperties.h"
-#include "qgsvectorlayerproperties.h"
-
-#include "qgsattributetabledialog.h"
-
-#include <cfloat>
+#include "qgsvectorlayer.h"
 
 #include <QFont>
@@ -58,12 +53,13 @@
    set mItemBeingMoved pointer to 0 to prevent SuSE 9.0 crash
 */
-QgsLegend::QgsLegend( QWidget * parent, const char *name )
+QgsLegend::QgsLegend( QgsMapCanvas *canvas, QWidget * parent, const char *name )
     : QTreeWidget( parent ),
     mMousePressedFlag( false ),
     mItemBeingMoved( 0 ),
-    mToggleEditingAction( 0 ),
-    mMapCanvas( 0 ),
+    mMapCanvas( canvas ),
     mMinimumIconSize( 20, 20 )
 {
+  setObjectName( name );
+
   connect( this, SIGNAL( itemChanged( QTreeWidgetItem*, int ) ),
            this, SLOT( handleItemChange( QTreeWidgetItem*, int ) ) );
@@ -77,4 +73,15 @@
   connect( QgsProject::instance(), SIGNAL( writeProject( QDomDocument & ) ),
            this, SLOT( writeProject( QDomDocument & ) ) );
+
+  // connect map layer registry signal to legend
+  connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWillBeRemoved( QString ) ),
+           this, SLOT( removeLayer( QString ) ) );
+  connect( QgsMapLayerRegistry::instance(), SIGNAL( removedAll() ),
+           this, SLOT( removeAll() ) );
+  connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWasAdded( QgsMapLayer* ) ),
+           this, SLOT( addLayer( QgsMapLayer * ) ) );
+
+  connect( mMapCanvas, SIGNAL( layersChanged() ),
+           this, SLOT( refreshCheckStates() ) );
 
   // Initialise the line indicator widget.
@@ -175,11 +182,6 @@
 }
 
-void QgsLegend::removeLayer( QString layer_key )
-{
-  if ( !mMapCanvas || mMapCanvas->isDrawing() )
-  {
-    return;
-  }
-
+void QgsLegend::removeLayer( QString layerId )
+{
   QgsDebugMsg( "called." );
 
@@ -192,9 +194,8 @@
       QgsLegendLayer* ll = qobject_cast<QgsLegendLayer *>( li );
 
-      if ( ll && ll->layer() && ll->layer()->getLayerID() == layer_key )
+      if ( ll && ll->layer() && ll->layer()->getLayerID() == layerId )
       {
         removeItem( ll );
         delete ll;
-
         break;
       }
@@ -423,9 +424,5 @@
 void QgsLegend::mouseDoubleClickEvent( QMouseEvent* e )
 {
-  if ( !mMapCanvas || mMapCanvas->isDrawing() )
-  {
-    return;
-  }
-  legendLayerShowProperties();
+  QgisApp::instance()->layerProperties();
 }
 
@@ -445,5 +442,5 @@
     if ( li->type() == QgsLegendItem::LEGEND_LAYER )
     {
-      ( static_cast<QgsLegendLayer*>( li ) )->addToPopupMenu( theMenu, mToggleEditingAction );
+      qobject_cast<QgsLegendLayer*>( li )->addToPopupMenu( theMenu );
 
       if ( li->parent() )
@@ -566,15 +563,4 @@
 }
 
-void QgsLegend::setMapCanvas( QgsMapCanvas * canvas )
-{
-  if ( mMapCanvas )
-  {
-    disconnect( mMapCanvas, SIGNAL( layersChanged() ) );
-  }
-
-  mMapCanvas = canvas;
-  connect( mMapCanvas, SIGNAL( layersChanged() ), this, SLOT( refreshCheckStates() ) );
-}
-
 QgsLegendLayer* QgsLegend::currentLegendLayer()
 {
@@ -647,80 +633,12 @@
   while ( child )
   {
-    setCurrentItem( child );
-    removeCurrentLayer();
+    QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer *>( child );
+    if ( ll )
+      QgsMapLayerRegistry::instance()->removeMapLayer( ll->layer()->getLayerID() );
     child = lg->child( 0 );
   }
   delete lg;
+
   adjustIconSize();
-}
-
-void QgsLegend::removeCurrentLayer()
-{
-  if ( !mMapCanvas || mMapCanvas->isDrawing() )
-  {
-    return;
-  }
-
-  //if the current item is a legend layer: remove all layers of the current legendLayer
-  QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer *>( currentItem() );
-  if ( !ll )
-    return;
-
-  removeLayer( ll->layer(), true );
-
-  adjustIconSize();
-}
-
-bool QgsLegend::removeLayer( QgsMapLayer* ml, bool askCancelOnEditable )
-{
-  if ( !ml )
-  {
-    return false;
-  }
-
-  QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
-  if ( vl )
-  {
-    //is layer editable and changed?
-    if ( vl->isEditable() && vl->isModified() )
-    {
-      QMessageBox::StandardButton commit;
-      if ( askCancelOnEditable )
-      {
-        commit = QMessageBox::information( this,
-                                           tr( "Stop editing" ),
-                                           tr( "Do you want to save the changes to layer %1?" ).arg( vl->name() ),
-                                           QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel );
-        if ( commit == QMessageBox::Cancel )
-        {
-          return false;
-        }
-      }
-      else
-      {
-        commit = QMessageBox::information( this,
-                                           tr( "Stop editing" ),
-                                           tr( "Do you want to save the changes to layer %1?" ).arg( vl->name() ),
-                                           QMessageBox::Save | QMessageBox::Discard );
-      }
-
-      if ( commit == QMessageBox::Save )
-      {
-        if ( !vl->commitChanges() )
-        {
-          return false;
-        }
-      }
-      else if ( commit == QMessageBox::Discard )
-      {
-        if ( !vl->rollBack() )
-        {
-          return false;
-        }
-      }
-    }
-  }
-  QgsMapLayerRegistry::instance()->removeMapLayer( ml->getLayerID() );
-  return true;
 }
 
@@ -739,33 +657,4 @@
 
   insertItem( layer, group );
-}
-
-void QgsLegend::legendLayerShowProperties()
-{
-  if ( !mMapCanvas || mMapCanvas->isDrawing() )
-  {
-    return;
-  }
-
-  QgsLegendItem* li = dynamic_cast<QgsLegendItem *>( currentItem() );
-
-  if ( !li )
-  {
-    return;
-  }
-
-  if ( li->type() != QgsLegendItem::LEGEND_LAYER )
-    return;
-
-  QgsLegendLayer* ll = qobject_cast<QgsLegendLayer *>( li );
-  if ( !ll )
-    return;
-
-  //QgsDebugMsg("Showing layer properties dialog");
-
-  QgisApp::instance()->showLayerProperties( ll->layer() );
-
-  ll->updateIcon();
-
 }
 
@@ -1733,33 +1622,4 @@
 }
 
-void QgsLegend::legendLayerAttributeTable()
-{
-  if ( !mMapCanvas || mMapCanvas->isDrawing() )
-  {
-    return;
-  }
-
-  QgsVectorLayer *vlayer = 0;
-
-  // try whether it's a legend layer
-  QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer *>( currentItem() );
-  if ( !ll )
-  {
-    // nothing selected
-    QMessageBox::information( this,
-                              tr( "No Layer Selected" ),
-                              tr( "To open an attribute table, you must select a vector layer in the legend" ) );
-    return;
-  }
-
-  vlayer = qobject_cast<QgsVectorLayer *>( ll->layer() );
-  if ( vlayer )
-  {
-    QgsAttributeTableDialog *mDialog = new QgsAttributeTableDialog( vlayer );
-    mDialog->show();
-    // the dialog will be deleted by itself on close
-  }
-}
-
 void QgsLegend::readProject( const QDomDocument & doc )
 {
Index: /trunk/qgis/src/app/legend/qgslegendlayer.h
===================================================================
--- qgis-1.4.0/src/app/legend/qgslegendlayer.h (revision 13380)
+++ /trunk/qgis/src/app/legend/qgslegendlayer.h (revision 13501)
@@ -62,5 +62,5 @@
 
     /** called to add appropriate menu items to legend's popup menu */
-    void addToPopupMenu( QMenu& theMenu, QAction* toggleEditingAction );
+    void addToPopupMenu( QMenu& theMenu );
 
     /** Set layer to be visible in canvas */
@@ -81,10 +81,4 @@
     /**Toggle show in overview*/
     void showInOverview();
-
-    /**Show layer attribute table*/
-    void table();
-
-    void saveAsVectorFile();
-    void saveSelectionAsVectorFile();
 
     /**update the layer's icon to show whether is in editing mode or in overview */
@@ -109,6 +103,4 @@
     QPixmap getOriginalPixmap();
 
-    void saveAsVectorFileGeneral( bool saveOnlySelection );
-
   private:
     /** Helper method to make the font bold from all ctors.
Index: /trunk/qgis/src/app/legend/qgslegend.h
===================================================================
--- qgis-1.4.0/src/app/legend/qgslegend.h (revision 13476)
+++ /trunk/qgis/src/app/legend/qgslegend.h (revision 13501)
@@ -97,5 +97,5 @@
     * @param theName An optional name for the widget
     */
-    QgsLegend( QWidget * parent = 0, const char *name = 0 );
+    QgsLegend( QgsMapCanvas *canvas, QWidget * parent = 0, const char *name = 0 );
 
     //! Destructor
@@ -182,7 +182,4 @@
     void removePixmapHeightValue( int height );
 
-    /**Sets the toggle editing action. Usually called from QgisApp*/
-    void setToggleEditingAction( QAction* editingAction ) {mToggleEditingAction = editingAction;}
-
     /**Returns structure with legend pixmaps*/
     QgsLegendPixmaps& pixmaps() { return mPixmaps; }
@@ -200,6 +197,4 @@
 
     void setLayerVisible( QgsMapLayer * layer, bool visible );
-
-    void setMapCanvas( QgsMapCanvas * canvas );
 
     /**Updates symbology items for a layer*/
@@ -244,14 +239,4 @@
     void writeProject( QDomDocument & );
 
-    /**Removes the current LegendLayer*/
-    void removeCurrentLayer();
-
-    /**Removes a layer. If the layer is editable, a dialog is shown where user can select 'save', 'discard' and optionally 'cancel'. Cancel
-      is useful if a single layer is removed whereas on closing of the whole project or application, the cancel option may not be possible
-      @param ml the maplayer to remove
-      @param askCancelOnEditable gibe cancel option in the dialog for editable (and changed) layers
-      @param return false if canceled or in case of error, true else*/
-    bool removeLayer( QgsMapLayer* ml, bool askCancelOnEditable );
-
     /*!
      * Moves a layer to a group.
@@ -272,10 +257,4 @@
         Only works on raster layers*/
     void legendLayerZoomNative();
-
-    /**Show attribute table*/
-    void legendLayerAttributeTable();
-
-    /**Shows the property dialog of the first legend layer file in a legend layer*/
-    void legendLayerShowProperties();
 
     /**Updates check states when the map canvas layer set is changed */
@@ -441,7 +420,4 @@
     std::deque<QString> mLayersPriorToMove;
 
-    /**Action for the legendlayer right click menu*/
-    QAction* mToggleEditingAction;
-
     /*!
      * A function to determine how far down in the list an item is (starting with one for the first Item).
Index: /trunk/qgis/src/app/qgsattributedialog.cpp
===================================================================
--- qgis-1.4.0/src/app/qgsattributedialog.cpp (revision 13339)
+++ /trunk/qgis/src/app/qgsattributedialog.cpp (revision 13501)
@@ -206,5 +206,4 @@
 
     connect( buttonBox, SIGNAL( rejected() ), mDialog, SLOT( reject() ) );
-    connect( buttonBox, SIGNAL( rejected() ), this, SLOT( reject() ) );
   }
 
Index: /trunk/qgis/src/app/qgsmeasuredialog.cpp
===================================================================
--- qgis-1.4.0/src/app/qgsmeasuredialog.cpp (revision 12178)
+++ /trunk/qgis/src/app/qgsmeasuredialog.cpp (revision 13501)
@@ -77,5 +77,5 @@
   {
     addPoint( point );
-    this->show();
+    show();
   }
   raise();
Index: /trunk/qgis/src/app/qgsattributedialog.h
===================================================================
--- qgis-1.4.0/src/app/qgsattributedialog.h (revision 12806)
+++ /trunk/qgis/src/app/qgsattributedialog.h (revision 13501)
@@ -52,7 +52,4 @@
 
   public slots:
-    /** Overloaded accept method which will write the feature field
-     * values, then delegate to QDialog::accept()
-     */
     void accept();
 
Index: /trunk/qgis/src/app/qgsundowidget.cpp
===================================================================
--- qgis-1.4.0/src/app/qgsundowidget.cpp (revision 11756)
+++ /trunk/qgis/src/app/qgsundowidget.cpp (revision 13501)
@@ -3,4 +3,5 @@
 #include "qgsmaplayer.h"
 #include "qgsmapcanvas.h"
+#include "qgslegend.h"
 
 #include "qgisapp.h"
@@ -11,9 +12,10 @@
   setupUi( this );
   setWidget( dockWidgetContents );
-  connect( this->undoButton, SIGNAL( clicked() ),
-           this, SLOT( undo( ) ) );
 
-  connect( this->redoButton, SIGNAL( clicked() ),
-           this, SLOT( redo( ) ) );
+  connect( undoButton, SIGNAL( clicked() ), this, SLOT( undo( ) ) );
+  connect( redoButton, SIGNAL( clicked() ), this, SLOT( redo( ) ) );
+  connect( QgisApp::instance()->legend(), SIGNAL( currentLayerChanged( QgsMapLayer* ) ),
+           this, SLOT( layerChanged( QgsMapLayer* ) ) );
+
   undoButton->setDisabled( true );
   redoButton->setDisabled( true );
@@ -100,6 +102,6 @@
   gridLayout->addWidget( mUndoView, 0, 0, 1, 2 );
   setWidget( dockWidgetContents );
-  connect( this->mUndoStack,  SIGNAL( canUndoChanged( bool ) ), this, SLOT( undoChanged( bool ) ) );
-  connect( this->mUndoStack,  SIGNAL( canRedoChanged( bool ) ), this, SLOT( redoChanged( bool ) ) );
+  connect( mUndoStack,  SIGNAL( canUndoChanged( bool ) ), this, SLOT( undoChanged( bool ) ) );
+  connect( mUndoStack,  SIGNAL( canRedoChanged( bool ) ), this, SLOT( redoChanged( bool ) ) );
 
   // indexChanged() triggers a refresh. but it gets triggered also when a new action
@@ -107,8 +109,8 @@
   // vector layer: it causes potentially multiple refreshes when moving more commands
   // back, but avoids double refresh in common case when adding commands to the stack
-  //connect(this->mUndoStack,  SIGNAL(indexChanged(int)), this, SLOT(indexChanged(int)));
+  //connect(mUndoStack,  SIGNAL(indexChanged(int)), this, SLOT(indexChanged(int)));
 
-  this->undoButton->setDisabled( !mUndoStack->canUndo() );
-  this->redoButton->setDisabled( !mUndoStack->canRedo() );
+  undoButton->setDisabled( !mUndoStack->canUndo() );
+  redoButton->setDisabled( !mUndoStack->canRedo() );
 }
 
Index: /trunk/qgis/src/app/qgsmaptoolnodetool.cpp
===================================================================
--- qgis-1.4.0/src/app/qgsmaptoolnodetool.cpp (revision 13380)
+++ /trunk/qgis/src/app/qgsmaptoolnodetool.cpp (revision 13501)
@@ -27,4 +27,5 @@
 #include "qgslogger.h"
 #include "qgisapp.h"
+#include "qgslegend.h"
 
 #include <QStatusBar>
@@ -70,4 +71,7 @@
   //signal changing of coordinate renderer changed to repaint markers
   connect( canvas->mapRenderer(), SIGNAL( hasCrsTransformEnabled( bool ) ), this, SLOT( coordinatesChanged( ) ) );
+  //signal changing of current layer
+  connect( QgisApp::instance()->legend(), SIGNAL( currentLayerChanged( QgsMapLayer* ) ),
+           this, SLOT( currentLayerChanged( QgsMapLayer* ) ) );
 }
 
Index: /trunk/qgis/src/app/qgisapp.h
===================================================================
--- qgis-1.4.0/src/app/qgisapp.h (revision 13476)
+++ /trunk/qgis/src/app/qgisapp.h (revision 13501)
@@ -154,8 +154,5 @@
     void saveMapAsImage( QString, QPixmap * );
     /** Get the mapcanvas object from the app */
-    QgsMapCanvas * mapCanvas() { return mMapCanvas; };
-
-    //! returns pointer to map legend
-    QgsLegend *legend() { return mMapLegend; }
+    QgsMapCanvas * mapCanvas();
 
     //! Set theme (icons)
@@ -275,4 +272,5 @@
     QAction *actionOpenTable() { return mActionOpenTable; }
     QAction *actionToggleEditing() { return mActionToggleEditing; }
+    QAction *actionSaveEdits() { return mActionSaveEdits; }
     QAction *actionLayerSaveAs() { return mActionLayerSaveAs; }
     QAction *actionLayerSelectionSaveAs() { return mActionLayerSelectionSaveAs; }
@@ -283,4 +281,5 @@
 #endif
     QAction *actionLayerProperties() { return mActionLayerProperties; }
+    QAction *actionLayerSubsetString() { return mActionLayerSubsetString; }
     QAction *actionLayerSeparator2() { return mActionLayerSeparator2; }
     QAction *actionAddToOverview() { return mActionAddToOverview; }
@@ -357,4 +356,7 @@
     void showLayerProperties( QgsMapLayer *ml );
 
+    //! returns pointer to map legend
+    QgsLegend *legend();
+
   public slots:
     //! Zoom to full extent
@@ -367,4 +369,7 @@
     void zoomToSelected();
 
+    //! open the properties dialog for the currently selected layer
+    void layerProperties();
+
     //! mark project dirty
     void markDirty();
@@ -372,4 +377,7 @@
     //! layer was added
     void layerWasAdded( QgsMapLayer * );
+
+    //! layer will be removed
+    void removingLayer( QString );
 
     void updateUndoActions();
@@ -594,4 +602,10 @@
     void toggleEditing();
 
+    //! save current edits and start new transaction
+    void saveEdits();
+
+    //! change layer subset of current vector layer
+    void layerSubsetString();
+
     //! map tool changed
     void mapToolChanged( QgsMapTool *tool );
@@ -600,4 +614,6 @@
     Is called from the legend when the current legend item has changed*/
     void activateDeactivateLayerRelatedActions( QgsMapLayer* layer );
+
+    void selectionChanged( QgsMapLayer *layer );
 
     void showProgress( int theProgress, int theTotalSteps );
@@ -639,12 +655,9 @@
 
     //! starts/stops editing mode of a layer
-    void toggleEditing( QgsMapLayer *layer );
+    bool toggleEditing( QgsMapLayer *layer, bool allowCancel = true );
 
     //! save current vector layer
     void saveAsVectorFile();
     void saveSelectionAsVectorFile();
-
-    //! open the properties dialog for the currently selected layer
-    void layerProperties();
 
     //! show python console
@@ -757,4 +770,6 @@
     bool loadComposersFromProject( const QString& projectFilePath );
 
+    void saveAsVectorFileGeneral( bool saveOnlySelection );
+
     /**Returns all annotation items in the canvas*/
     QList<QgsAnnotationItem*> annotationItems();
@@ -777,7 +792,7 @@
     void createStatusBar();
     void setupConnections();
-    void createLegend();
+    void initLegend();
     void createOverview();
-    void createCanvas();
+    void createCanvasTools();
     bool createDB();
     void createMapTips();
@@ -875,4 +890,5 @@
     QAction *mActionOpenTable;
     QAction *mActionToggleEditing;
+    QAction *mActionSaveEdits;
     QAction *mActionLayerSaveAs;
     QAction *mActionLayerSelectionSaveAs;
@@ -883,4 +899,5 @@
 #endif
     QAction *mActionLayerProperties;
+    QAction *mActionLayerSubsetString;
     QAction *mActionLayerSeparator2;
     QAction *mActionAddToOverview;
Index: /trunk/qgis/src/app/qgisapp.cpp
===================================================================
--- qgis-1.4.0/src/app/qgisapp.cpp (revision 13496)
+++ /trunk/qgis/src/app/qgisapp.cpp (revision 13501)
@@ -153,8 +153,10 @@
 #include "ogr/qgsogrsublayersdialog.h"
 #include "ogr/qgsopenvectorlayerdialog.h"
+#include "ogr/qgsvectorlayersaveasdialog.h"
 #include "qgsattributetabledialog.h"
 #include "qgsvectorfilewriter.h"
 #include "qgscredentialdialog.h"
 #include "qgstilescalewidget.h"
+#include "qgsquerybuilder.h"
 
 #ifdef HAVE_QWT
@@ -350,5 +352,4 @@
     QgisApp::instance()->statusBar()->showMessage( QObject::tr( "CRS undefined - defaulting to default CRS" ) );
   }
-
 }
 
@@ -387,5 +388,4 @@
   createDB();
 
-
   mSplash->showMessage( tr( "Reading settings" ), Qt::AlignHCenter | Qt::AlignBottom );
   qApp->processEvents();
@@ -393,4 +393,19 @@
   mSplash->showMessage( tr( "Setting up the GUI" ), Qt::AlignHCenter | Qt::AlignBottom );
   qApp->processEvents();
+
+  // "theMapCanvas" used to find this canonical instance later
+  mMapCanvas = new QgsMapCanvas( this, "theMapCanvas" );
+  mMapCanvas->setWhatsThis( tr( "Map canvas. This is where raster and vector "
+                                "layers are displayed when added to the map" ) );
+  setCentralWidget( mMapCanvas );
+  //set the focus to the map canvas
+  mMapCanvas->setFocus();
+
+  // "theMapLegend" used to find this canonical instance later
+  mMapLegend = new QgsLegend( mMapCanvas, this, "theMapLegend" );
+
+  // create undo widget
+  mUndoWidget = new QgsUndoWidget( NULL, mMapCanvas );
+  mUndoWidget->setObjectName( "Undo" );
 
   createActions();
@@ -399,7 +414,7 @@
   createToolBars();
   createStatusBar();
-  createCanvas();
+  createCanvasTools();
   mMapCanvas->freeze();
-  createLegend();
+  initLegend();
   createOverview();
   createMapTips();
@@ -407,12 +422,9 @@
   updateRecentProjectPaths();
 
+  addDockWidget( Qt::LeftDockWidgetArea, mUndoWidget );
+  mUndoWidget->hide();
+
   mInternalClipboard = new QgsClipboard; // create clipboard
   mQgisInterface = new QgisAppInterface( this ); // create the interfce
-
-  // create undo widget
-  mUndoWidget = new QgsUndoWidget( NULL, mMapCanvas );
-  mUndoWidget->setObjectName( "Undo" );
-  addDockWidget( Qt::LeftDockWidgetArea, mUndoWidget );
-  mUndoWidget->hide();
 
 #ifdef Q_WS_MAC
@@ -698,12 +710,12 @@
   shortcuts->registerAction( mActionUndo, tr( "Ctrl+Z" ) );
   mActionUndo->setStatusTip( tr( "Undo the last operation" ) );
+  connect( mActionUndo, SIGNAL( triggered() ), mUndoWidget, SLOT( undo() ) );
   mActionUndo->setEnabled( false );
-  // action connected to mUndoWidget::undo slot in setupConnections()
 
   mActionRedo = new QAction( getThemeIcon( "mActionRedo.png" ), tr( "&Redo" ), this );
   shortcuts->registerAction( mActionRedo, tr( "Ctrl+Shift+Z" ) );
   mActionRedo->setStatusTip( tr( "Redo the last operation" ) );
+  connect( mActionRedo, SIGNAL( triggered() ), mUndoWidget, SLOT( redo() ) );
   mActionRedo->setEnabled( false );
-  // action connected to mUndoWidget::redo slot in setupConnections()
 
   mActionCutFeatures = new QAction( getThemeIcon( "mActionEditCut.png" ), tr( "Cut Features" ), this );
@@ -999,4 +1011,10 @@
   connect( mActionToggleEditing, SIGNAL( triggered() ), this, SLOT( toggleEditing() ) );
   mActionToggleEditing->setEnabled( false );
+
+  mActionSaveEdits = new QAction( getThemeIcon( "mActionSaveEdits.png" ), tr( "Save edits" ), this );
+  shortcuts->registerAction( mActionSaveEdits );
+  mActionSaveEdits->setStatusTip( tr( "Save edits to current layer , but continue editing" ) );
+  connect( mActionSaveEdits, SIGNAL( triggered() ), this, SLOT( saveEdits() ) );
+  mActionSaveEdits->setEnabled( false );
 
   mActionLayerSaveAs = new QAction( tr( "Save as..." ), this );
@@ -1037,4 +1055,10 @@
   connect( mActionLayerProperties, SIGNAL( triggered() ), this, SLOT( layerProperties() ) );
   mActionLayerProperties->setEnabled( false );
+
+  mActionLayerSubsetString = new QAction( tr( "Subset..." ), this );
+  shortcuts->registerAction( mActionLayerSubsetString );
+  mActionLayerProperties->setStatusTip( tr( "Set subset query of the current layer" ) );
+  connect( mActionLayerSubsetString, SIGNAL( triggered() ), this, SLOT( layerSubsetString() ) );
+  mActionLayerSubsetString->setEnabled( false );
 
   mActionAddToOverview = new QAction( getThemeIcon( "mActionInOverview.png" ), tr( "Add to Overview" ), this );
@@ -1438,4 +1462,5 @@
 
   mLayerMenu->addAction( mActionOpenTable );
+  mLayerMenu->addAction( mActionSaveEdits );
   mLayerMenu->addAction( mActionToggleEditing );
   mLayerMenu->addAction( mActionLayerSaveAs );
@@ -1443,4 +1468,5 @@
   mLayerMenu->addAction( mActionRemoveLayer );
   mLayerMenu->addAction( mActionLayerProperties );
+  mLayerMenu->addAction( mActionLayerSubsetString );
   mActionLayerSeparator2 = mLayerMenu->addSeparator();
 
@@ -1558,4 +1584,5 @@
   mDigitizeToolBar->setObjectName( "Digitizing" );
   mDigitizeToolBar->addAction( mActionToggleEditing );
+  mDigitizeToolBar->addAction( mActionSaveEdits );
   mDigitizeToolBar->addAction( mActionCapturePoint );
   mDigitizeToolBar->addAction( mActionCaptureLine );
@@ -1622,16 +1649,16 @@
   mAttributesToolBar->addAction( mActionNewBookmark );
   // Annotation tools
-  QToolButton* mAnnotationToolButton = new QToolButton();
-  mAnnotationToolButton->setPopupMode( QToolButton::InstantPopup );
-  mAnnotationToolButton->setAutoRaise( true );
-  mAnnotationToolButton->setToolButtonStyle( Qt::ToolButtonIconOnly );
-  mAnnotationToolButton->setCheckable( true );
-  mAnnotationToolButton->addAction( mActionTextAnnotation );
-  mAnnotationToolButton->addAction( mActionFormAnnotation );
-  mAnnotationToolButton->addAction( mActionAnnotation );
-  mAnnotationToolButton->setDefaultAction( mActionTextAnnotation );
-  QObject::connect( mAnnotationToolButton, SIGNAL( triggered( QAction* ) ), \
-                    mAnnotationToolButton, SLOT( setDefaultAction( QAction* ) ) );
-  mAttributesToolBar->addWidget( mAnnotationToolButton );
+  QToolButton *annotationToolButton = new QToolButton();
+  annotationToolButton->setPopupMode( QToolButton::InstantPopup );
+  annotationToolButton->setAutoRaise( true );
+  annotationToolButton->setToolButtonStyle( Qt::ToolButtonIconOnly );
+  annotationToolButton->setCheckable( true );
+  annotationToolButton->addAction( mActionTextAnnotation );
+  annotationToolButton->addAction( mActionFormAnnotation );
+  annotationToolButton->addAction( mActionAnnotation );
+  annotationToolButton->setDefaultAction( mActionTextAnnotation );
+  connect( annotationToolButton, SIGNAL( triggered( QAction* ) ),
+           annotationToolButton, SLOT( setDefaultAction( QAction* ) ) );
+  mAttributesToolBar->addWidget( annotationToolButton );
   mToolbarMenu->addAction( mAttributesToolBar->toggleViewAction() );
   //
@@ -1837,4 +1864,5 @@
   mActionDraw->setIcon( getThemeIcon( "/mActionDraw.png" ) );
   mActionToggleEditing->setIcon( getThemeIcon( "/mActionToggleEditing.png" ) );
+  mActionSaveEdits->setIcon( getThemeIcon( "/mActionSaveEdits.png" ) );
   mActionCutFeatures->setIcon( getThemeIcon( "/mActionEditCut.png" ) );
   mActionCopyFeatures->setIcon( getThemeIcon( "/mActionEditCopy.png" ) );
@@ -1898,81 +1926,74 @@
   // connect the "cleanup" slot
   connect( qApp, SIGNAL( aboutToQuit() ), this, SLOT( saveWindowState() ) );
-  //connect the legend, mapcanvas and overview canvas to the registry
-
-  // connect map layer registry signals to legend
-  connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWillBeRemoved( QString ) ),
-           mMapLegend, SLOT( removeLayer( QString ) ) );
-  connect( QgsMapLayerRegistry::instance(), SIGNAL( removedAll() ),
-           mMapLegend, SLOT( removeAll() ) );
-  connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWasAdded( QgsMapLayer* ) ),
-           mMapLegend, SLOT( addLayer( QgsMapLayer * ) ) );
-  connect( mMapLegend, SIGNAL( currentLayerChanged( QgsMapLayer* ) ),
-           this, SLOT( activateDeactivateLayerRelatedActions( QgsMapLayer* ) ) );
-  connect( mMapLegend, SIGNAL( currentLayerChanged( QgsMapLayer* ) ),
-           mUndoWidget, SLOT( layerChanged( QgsMapLayer* ) ) );
-  connect( mMapLegend, SIGNAL( currentLayerChanged( QgsMapLayer* ) ),
-           mMapTools.mNodeTool, SLOT( currentLayerChanged( QgsMapLayer* ) ) );
-
-  //signal when mouse moved over window (coords display in status bar)
-  connect( mMapCanvas, SIGNAL( xyCoordinates( const QgsPoint & ) ), this, SLOT( showMouseCoordinate( const QgsPoint & ) ) );
-  connect( mMapCanvas->mapRenderer(), SIGNAL( drawingProgress( int, int ) ), this, SLOT( showProgress( int, int ) ) );
-  connect( mMapCanvas->mapRenderer(), SIGNAL( hasCrsTransformEnabled( bool ) ), this, SLOT( hasCrsTransformEnabled( bool ) ) );
-  connect( mMapCanvas->mapRenderer(), SIGNAL( destinationSrsChanged() ), this, SLOT( destinationSrsChanged() ) );
-  connect( mMapCanvas, SIGNAL( extentsChanged() ), this, SLOT( showExtents() ) );
-  connect( mMapCanvas, SIGNAL( scaleChanged( double ) ), this, SLOT( showScale( double ) ) );
-  connect( mMapCanvas, SIGNAL( scaleChanged( double ) ), this, SLOT( updateMouseCoordinatePrecision() ) );
-  connect( mMapCanvas, SIGNAL( mapToolSet( QgsMapTool * ) ), this, SLOT( mapToolChanged( QgsMapTool * ) ) );
+
+  // signal when mouse moved over window (coords display in status bar)
+  connect( mMapCanvas, SIGNAL( xyCoordinates( const QgsPoint & ) ),
+           this, SLOT( showMouseCoordinate( const QgsPoint & ) ) );
+  connect( mMapCanvas, SIGNAL( extentsChanged() ),
+           this, SLOT( showExtents() ) );
+  connect( mMapCanvas, SIGNAL( scaleChanged( double ) ),
+           this, SLOT( showScale( double ) ) );
+  connect( mMapCanvas, SIGNAL( scaleChanged( double ) ),
+           this, SLOT( updateMouseCoordinatePrecision() ) );
+  connect( mMapCanvas, SIGNAL( mapToolSet( QgsMapTool * ) ),
+           this, SLOT( mapToolChanged( QgsMapTool * ) ) );
   connect( mMapCanvas, SIGNAL( selectionChanged( QgsMapLayer * ) ),
+           this, SLOT( selectionChanged( QgsMapLayer * ) ) );
+  connect( mMapCanvas, SIGNAL( extentsChanged() ),
+           this, SLOT( markDirty() ) );
+  connect( mMapCanvas, SIGNAL( layersChanged() ),
+           this, SLOT( markDirty() ) );
+
+  connect( mMapCanvas, SIGNAL( zoomLastStatusChanged( bool ) ),
+           mActionZoomLast, SLOT( setEnabled( bool ) ) );
+  connect( mMapCanvas, SIGNAL( zoomNextStatusChanged( bool ) ),
+           mActionZoomNext, SLOT( setEnabled( bool ) ) );
+  connect( mRenderSuppressionCBox, SIGNAL( toggled( bool ) ),
+           mMapCanvas, SLOT( setRenderFlag( bool ) ) );
+
+  // connect renderer
+  connect( mMapCanvas->mapRenderer(), SIGNAL( drawingProgress( int, int ) ),
+           this, SLOT( showProgress( int, int ) ) );
+  connect( mMapCanvas->mapRenderer(), SIGNAL( hasCrsTransformEnabled( bool ) ),
+           this, SLOT( hasCrsTransformEnabled( bool ) ) );
+  connect( mMapCanvas->mapRenderer(), SIGNAL( destinationSrsChanged() ),
+           this, SLOT( destinationSrsChanged() ) );
+
+  // connect legend signals
+  connect( mMapLegend, SIGNAL( currentLayerChanged( QgsMapLayer * ) ),
            this, SLOT( activateDeactivateLayerRelatedActions( QgsMapLayer * ) ) );
-
-  // track of canvas layers and extents and mark project dirty on changes
-  connect( mMapCanvas, SIGNAL( extentsChanged() ), this, SLOT( markDirty() ) );
-  connect( mMapCanvas, SIGNAL( layersChanged() ), this, SLOT( markDirty() ) );
-  connect( mMapLegend, SIGNAL( zOrderChanged() ), this, SLOT( markDirty() ) );
-
+  connect( mMapLegend, SIGNAL( zOrderChanged() ),
+           this, SLOT( markDirty() ) );
+
+  // connect map layer registry
   connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWasAdded( QgsMapLayer * ) ),
            this, SLOT( layerWasAdded( QgsMapLayer * ) ) );
-
-  connect( mRenderSuppressionCBox, SIGNAL( toggled( bool ) ), mMapCanvas, SLOT( setRenderFlag( bool ) ) );
-  //
-  // Do we really need this ??? - its already connected to the esc key...TS
-  //
-  connect( mStopRenderButton, SIGNAL( clicked() ), this, SLOT( stopRendering() ) );
+  connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWillBeRemoved( QString ) ),
+           this, SLOT( removingLayer( QString ) ) );
 
   // Connect warning dialog from project reading
   connect( QgsProject::instance(), SIGNAL( oldProjectVersionWarning( QString ) ),
            this, SLOT( oldProjectVersionWarning( QString ) ) );
-
-  connect( QgsProject::instance(), SIGNAL( layerLoaded( int, int ) ), this, SLOT( showProgress( int, int ) ) );
-
-  // 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() ) );
-
-  // Connect status from ZoomLast/ZoomNext to corresponding action
-  connect( mMapCanvas, SIGNAL( zoomLastStatusChanged( bool ) ), mActionZoomLast, SLOT( setEnabled( bool ) ) );
-  connect( mMapCanvas, SIGNAL( zoomNextStatusChanged( bool ) ), mActionZoomNext, SLOT( setEnabled( bool ) ) );
-
-  // Monitor change of project path
+  connect( QgsProject::instance(), SIGNAL( layerLoaded( int, int ) ),
+           this, SLOT( showProgress( int, int ) ) );
   connect( QgsProject::instance(), SIGNAL( readProject( const QDomDocument & ) ),
            this, SLOT( readProject( const QDomDocument & ) ) );
   connect( QgsProject::instance(), SIGNAL( writeProject( QDomDocument & ) ),
            this, SLOT( writeProject( QDomDocument & ) ) );
-
-  connect( QgsProject::instance(), SIGNAL( writeProject( QDomDocument& ) ), this, SLOT( writeAnnotationItemsToProject( QDomDocument& ) ) );
-}
-
-void QgisApp::createCanvas()
-{
-  // "theMapCanvas" used to find this canonical instance later
-  mMapCanvas = new QgsMapCanvas( this, "theMapCanvas" );
-  mMapCanvas->setWhatsThis( tr( "Map canvas. This is where raster and vector "
-                                "layers are displayed when added to the map" ) );
-
-  setCentralWidget( mMapCanvas );
-  // set the focus to the map canvas
-  mMapCanvas->setFocus();
-
+  connect( QgsProject::instance(), SIGNAL( writeProject( QDomDocument& ) ),
+           this, SLOT( writeAnnotationItemsToProject( QDomDocument& ) ) );
+
+  //
+  // Do we really need this ??? - its already connected to the esc key...TS
+  //
+  connect( mStopRenderButton, SIGNAL( clicked() ),
+           this, SLOT( stopRendering() ) );
+
+  // setup undo/redo actions
+  connect( mUndoWidget, SIGNAL( undoStackChanged() ), this, SLOT( updateUndoActions() ) );
+}
+
+void QgisApp::createCanvasTools()
+{
   // create tools
   mMapTools.mZoomIn = new QgsMapToolZoom( mMapCanvas, false /* zoomIn */ );
@@ -2097,14 +2118,18 @@
 }
 
-void QgisApp::createLegend()
-{
-  //legend
-  mMapLegend = new QgsLegend( NULL, "theMapLegend" );
-  mMapLegend->setObjectName( "theMapLegend" );
-  mMapLegend->setMapCanvas( mMapCanvas );
-
-  //add the toggle editing action also to legend such that right click menu and button show the same state
-  mMapLegend->setToggleEditingAction( mActionToggleEditing );
-
+QgsLegend *QgisApp::legend()
+{
+  Q_ASSERT( mMapLegend );
+  return mMapLegend;
+}
+
+QgsMapCanvas *QgisApp::mapCanvas()
+{
+  Q_ASSERT( mMapCanvas );
+  return mMapCanvas;
+}
+
+void QgisApp::initLegend()
+{
   mMapLegend->setWhatsThis( tr( "Map legend that displays all the layers currently on the map canvas. Click on the check box to turn a layer on or off. Double click on a layer in the legend to customize its appearance and set other properties." ) );
   mLegendDock = new QDockWidget( tr( "Layers" ), this );
@@ -2853,7 +2878,4 @@
 }
 
-
-
-
 void QgisApp::fileExit()
 {
@@ -3779,5 +3801,5 @@
   }
 
-  QgsVectorLayer *myLayer = qobject_cast<QgsVectorLayer *>( mMapLegend->currentLayer() );
+  QgsVectorLayer *myLayer = qobject_cast<QgsVectorLayer *>( activeLayer() );
   if ( !myLayer )
   {
@@ -3792,29 +3814,102 @@
 void QgisApp::saveAsVectorFile()
 {
-  if ( mMapLegend )
-  {
-    QgsLegendLayer* currentLegendLayer = mMapLegend->currentLegendLayer();
-    if ( currentLegendLayer )
-    {
-      currentLegendLayer->saveAsVectorFile();
-    }
-  }
+  saveAsVectorFileGeneral( false );
 }
 
 void QgisApp::saveSelectionAsVectorFile()
 {
-  if ( mMapLegend )
-  {
-    QgsLegendLayer* currentLegendLayer = mMapLegend->currentLegendLayer();
-    if ( currentLegendLayer )
-    {
-      currentLegendLayer->saveSelectionAsVectorFile();
-    }
-  }
-}
+  saveAsVectorFileGeneral( true );
+}
+
+void QgisApp::saveAsVectorFileGeneral( bool saveOnlySelection )
+{
+  if ( mMapCanvas && mMapCanvas->isDrawing() )
+    return;
+
+  if ( !mMapLegend )
+    return;
+
+  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( activeLayer() );
+  if ( !vlayer )
+    return;
+
+  QgsCoordinateReferenceSystem destCRS;
+
+  QgsVectorLayerSaveAsDialog *dialog = new QgsVectorLayerSaveAsDialog( this );
+
+  if ( dialog->exec() == QDialog::Accepted )
+  {
+    QString encoding = dialog->encoding();
+    QString vectorFilename = dialog->filename();
+    QString format = dialog->format();
+
+    if ( dialog->crs() < 0 )
+    {
+      // Find out if we have projections enabled or not
+      if ( mMapCanvas->mapRenderer()->hasCrsTransformEnabled() )
+      {
+        destCRS = mMapCanvas->mapRenderer()->destinationSrs();
+      }
+      else
+      {
+        destCRS = vlayer->srs();
+      }
+    }
+    else
+    {
+      destCRS = QgsCoordinateReferenceSystem( dialog->crs(), QgsCoordinateReferenceSystem::InternalCrsId );
+    }
+
+    // overwrite the file - user will already have been prompted
+    // to verify they want to overwrite by the file dialog above
+    // might not even exists in the given case.
+    // add the extension if not present
+    if ( format == "ESRI Shapefile" )
+    {
+      if ( !vectorFilename.endsWith( ".shp", Qt::CaseInsensitive ) )
+      {
+        vectorFilename += ".shp";
+      }
+      QgsVectorFileWriter::deleteShapeFile( vectorFilename );
+    }
+
+    //GE does not open files without extensions. Therefore we append it automatically for kml files
+    if ( format == "KML" )
+    {
+      if ( !vectorFilename.endsWith( ".kml", Qt::CaseInsensitive ) )
+      {
+        vectorFilename += ".kml";
+      }
+    }
+
+    // ok if the file existed it should be deleted now so we can continue...
+    QApplication::setOverrideCursor( Qt::WaitCursor );
+
+    QgsVectorFileWriter::WriterError error;
+    QString errorMessage;
+    error = QgsVectorFileWriter::writeAsVectorFormat( vlayer, vectorFilename, encoding, &destCRS, format, saveOnlySelection, &errorMessage );
+
+    QApplication::restoreOverrideCursor();
+
+    if ( error == QgsVectorFileWriter::NoError )
+    {
+      QMessageBox::information( 0, tr( "Saving done" ), tr( "Export to vector file has been completed" ) );
+    }
+    else
+    {
+      QMessageBox::warning( 0, tr( "Save error" ), tr( "Export to vector file failed.\nError: %1" ).arg( errorMessage ) );
+    }
+  }
+
+  delete dialog;
+}
+
 
 void QgisApp::layerProperties()
 {
-  mMapLegend->legendLayerShowProperties();
+  if ( mMapCanvas && mMapCanvas->isDrawing() )
+    return;
+
+  showLayerProperties( activeLayer() );
 }
 
@@ -4379,7 +4474,5 @@
   }
 
-  QgsMapLayer * selectionLayer = ( layerContainingSelection != 0 ) ?
-                                 ( layerContainingSelection ) :
-                                 ( activeLayer() );
+  QgsMapLayer *selectionLayer = layerContainingSelection ? layerContainingSelection : activeLayer();
 
   if ( selectionLayer )
@@ -4408,7 +4501,5 @@
   }
 
-  QgsMapLayer * selectionLayer = ( layerContainingSelection != 0 ) ?
-                                 ( layerContainingSelection ) :
-                                 ( activeLayer() );
+  QgsMapLayer *selectionLayer = layerContainingSelection ? layerContainingSelection : activeLayer();
 
   if ( selectionLayer )
@@ -4434,7 +4525,5 @@
   }
 
-  QgsMapLayer * pasteLayer = ( destinationLayer != 0 ) ?
-                             ( destinationLayer ) :
-                             ( activeLayer() );
+  QgsMapLayer *pasteLayer = destinationLayer ? destinationLayer : activeLayer();
 
   if ( pasteLayer )
@@ -4494,20 +4583,70 @@
     return;
 
-  QgsLegendLayer* currentLayer = mMapLegend->currentLegendLayer();
+  QgsVectorLayer *currentLayer = qobject_cast<QgsVectorLayer*>( activeLayer() );
   if ( currentLayer )
   {
-    toggleEditing( mMapLegend->currentLayer() );
+    toggleEditing( currentLayer, true );
   }
   else
   {
+    // active although there's no layer active!?
     mActionToggleEditing->setChecked( false );
   }
 }
 
-void QgisApp::toggleEditing( QgsMapLayer *layer )
+void QgisApp::saveEdits()
+{
+  if ( mMapCanvas && mMapCanvas->isDrawing() )
+    return;
+
+  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( activeLayer() );
+  if ( !vlayer || !vlayer->isEditable() || !vlayer->isModified() )
+    return;
+
+  if ( !vlayer->commitChanges() )
+  {
+    QMessageBox::information( 0,
+                              tr( "Error" ),
+                              tr( "Could not commit changes to layer %1\n\nErrors: %2\n" )
+                              .arg( vlayer->name() )
+                              .arg( vlayer->commitErrors().join( "\n  " ) ) );
+  }
+
+  vlayer->startEditing();
+}
+
+void QgisApp::layerSubsetString()
+{
+  if ( mMapCanvas && mMapCanvas->isDrawing() )
+    return;
+
+  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( activeLayer() );
+  if ( !vlayer )
+    return;
+
+  // launch the query builder
+  QgsQueryBuilder *qb = new QgsQueryBuilder( vlayer, this );
+
+  // Set the sql in the query builder to the same in the prop dialog
+  // (in case the user has already changed it)
+  qb->setSql( vlayer->subsetString() );
+  // Open the query builder
+  if ( qb->exec() )
+  {
+    // if the sql is changed, update it in the prop subset text box
+    vlayer->setSubsetString( qb->sql() );
+    mMapCanvas->refresh();
+  }
+
+  // delete the query builder object
+  delete qb;
+}
+
+
+bool QgisApp::toggleEditing( QgsMapLayer *layer, bool allowCancel )
 {
   if ( !layer )
   {
-    return;
+    return false;
   }
 
@@ -4515,5 +4654,5 @@
   if ( !vlayer )
   {
-    return;
+    return false;
   }
 
@@ -4524,40 +4663,47 @@
     {
       QMessageBox::information( 0, tr( "Start editing failed" ), tr( "Provider cannot be opened for editing" ) );
+      return false;
     }
   }
   else if ( vlayer->isModified() )
   {
-    // commit or roll back?
-    QMessageBox::StandardButton commit =
-      QMessageBox::information( 0,
-                                tr( "Stop editing" ),
-                                tr( "Do you want to save the changes to layer %1?" ).arg( vlayer->name() ),
-                                QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel );
-
-    if ( commit == QMessageBox::Save )
-    {
-      if ( !vlayer->commitChanges() )
-      {
-        QMessageBox::information( 0,
-                                  tr( "Error" ),
-                                  tr( "Could not commit changes to layer %1\n\nErrors: %2\n" )
-                                  .arg( vlayer->name() )
-                                  .arg( vlayer->commitErrors().join( "\n  " ) ) );
-        // Leave the in-memory editing state alone,
-        // to give the user a chance to enter different values
-        // and try the commit again later
-      }
-    }
-    else if ( commit == QMessageBox::Discard )
-    {
-      if ( !vlayer->rollBack() )
-      {
-        QMessageBox::information( 0, tr( "Error" ), tr( "Problems during roll back" ) );
-      }
-    }
-    else //cancel
-    {
-      mActionToggleEditing->setChecked( vlayer->isEditable() );
-      return;
+    QMessageBox::StandardButtons buttons = QMessageBox::Save | QMessageBox::Discard;
+    if ( allowCancel )
+      buttons |= QMessageBox::Cancel;
+
+    switch ( QMessageBox::information( 0,
+                                       tr( "Stop editing" ),
+                                       tr( "Do you want to save the changes to layer %1?" ).arg( vlayer->name() ),
+                                       buttons ) )
+    {
+      case QMessageBox::Cancel:
+        mActionToggleEditing->setChecked( vlayer->isEditable() );
+        return false;
+
+      case QMessageBox::Save:
+        if ( !vlayer->commitChanges() )
+        {
+          QMessageBox::information( 0,
+                                    tr( "Error" ),
+                                    tr( "Could not commit changes to layer %1\n\nErrors: %2\n" )
+                                    .arg( vlayer->name() )
+                                    .arg( vlayer->commitErrors().join( "\n  " ) ) );
+          // Leave the in-memory editing state alone,
+          // to give the user a chance to enter different values
+          // and try the commit again later
+          return false;
+        }
+        break;
+
+      case QMessageBox::Discard:
+        if ( !vlayer->rollBack() )
+        {
+          QMessageBox::information( 0, tr( "Error" ), tr( "Problems during roll back" ) );
+          return false;
+        }
+        break;
+
+      default:
+        break;
     }
   }
@@ -4567,5 +4713,5 @@
   }
 
-  if ( layer == mMapLegend->currentLayer() )
+  if ( layer == activeLayer() )
   {
     activateDeactivateLayerRelatedActions( layer );
@@ -4575,4 +4721,5 @@
   mActionToggleEditing->setChecked( vlayer->isEditable() );
   vlayer->triggerRepaint();
+  return true;
 }
 
@@ -4686,30 +4833,39 @@
 }
 
+void QgisApp::removingLayer( QString layerId )
+{
+  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) );
+  if ( !vlayer || !vlayer->isEditable() )
+    return;
+
+  toggleEditing( vlayer, false );
+}
+
+void QgisApp::removeAllLayers()
+{
+  QgsMapLayerRegistry::instance()->removeAllMapLayers();
+}
+
 void QgisApp::removeLayer()
 {
-  mMapLegend->removeCurrentLayer();
-}
-
-
-void QgisApp::removeAllLayers()
-{
-  //iterate through all the layers in order to ask if uncommited changes should be saved
-  if ( mMapLegend )
-  {
-    QMap<QString, QgsMapLayer*> layers = QgsMapLayerRegistry::instance()->mapLayers();
-    QMap<QString, QgsMapLayer*>::iterator layer_it = layers.begin();
-    for ( ; layer_it != layers.end(); ++layer_it )
-    {
-      mMapLegend->removeLayer( layer_it.value(), false );
-    }
-    mMapLegend->removeAll();
-  }
-  else //no legend? Remove all the layers from the registry directly in this case
-  {
-    QgsMapLayerRegistry::instance()->removeAllMapLayers();
-  }
-
+  if ( mMapCanvas && mMapCanvas->isDrawing() )
+  {
+    return;
+  }
+
+  QgsMapLayer *layer = activeLayer();
+
+  if ( !layer )
+  {
+    return;
+  }
+
+  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer*>( layer );
+  if ( vlayer && vlayer->isEditable() && !toggleEditing( vlayer, true ) )
+    return;
+
+  QgsMapLayerRegistry::instance()->removeMapLayer( layer->getLayerID() );
   mMapCanvas->refresh();
-} //remove all layers
+}
 
 void QgisApp::showGpsTool()
@@ -5051,5 +5207,5 @@
 QgsMapLayer *QgisApp::activeLayer()
 {
-  return mMapLegend->currentLayer();
+  return mMapLegend ? mMapLegend->currentLayer() : 0;
 }
 
@@ -5057,4 +5213,7 @@
 bool QgisApp::setActiveLayer( QgsMapLayer *layer )
 {
+  if ( !layer )
+    return false;
+
   return mMapLegend->setCurrentLayer( layer );
 }
@@ -5079,6 +5238,4 @@
 //  QApplication::setOverrideCursor(Qt::WaitCursor);
 
-  // create the layer
-  QgsVectorLayer *layer;
   /* Eliminate the need to instantiate the layer based on provider type.
      The caller is responsible for cobbling together the needed information to
@@ -5089,5 +5246,6 @@
                + " and providerKey of " + providerKey );
 
-  layer = new QgsVectorLayer( vectorLayerPath, baseName, providerKey );
+  // create the layer
+  QgsVectorLayer *layer = new QgsVectorLayer( vectorLayerPath, baseName, providerKey );
 
   if ( layer && layer->isValid() )
@@ -5200,6 +5358,5 @@
   mMapCanvas->freeze( false );
 
-  return ( answer != QMessageBox::Cancel );
-
+  return answer != QMessageBox::Cancel;
 } // QgisApp::saveDirty()
 
@@ -5594,4 +5751,14 @@
 }
 
+void QgisApp::selectionChanged( QgsMapLayer *layer )
+{
+  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
+  if ( vlayer )
+  {
+    showStatusMessage( tr( "%n feature(s) selected on layer %1.", "number of selected features", vlayer->selectedFeatureCount() ).arg( vlayer->name() ) );
+  }
+  activateDeactivateLayerRelatedActions( layer );
+}
+
 void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
 {
@@ -5603,8 +5770,10 @@
     mActionOpenTable->setEnabled( false );
     mActionToggleEditing->setEnabled( false );
+    mActionSaveEdits->setEnabled( false );
     mActionLayerSaveAs->setEnabled( false );
     mActionLayerSelectionSaveAs->setEnabled( false );
     mActionRemoveLayer->setEnabled( false );
     mActionLayerProperties->setEnabled( false );
+    mActionLayerSubsetString->setEnabled( false );
     mActionAddToOverview->setEnabled( false );
 
@@ -5647,5 +5816,5 @@
     QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer *>( layer );
     const QgsVectorDataProvider* dprovider = vlayer->dataProvider();
-    bool layerHasSelection = ( vlayer->selectedFeatureCount() != 0 );
+    bool layerHasSelection = vlayer->selectedFeatureCount() != 0;
 
     mActionSelect->setEnabled( true );
@@ -5669,8 +5838,10 @@
         mActionToggleEditing->setEnabled( true );
         mActionToggleEditing->setChecked( vlayer->isEditable() );
+        mActionSaveEdits->setEnabled( vlayer->isEditable() );
       }
       else
       {
         mActionToggleEditing->setEnabled( false );
+        mActionSaveEdits->setEnabled( false );
       }
 
@@ -5864,8 +6035,10 @@
   else if ( layer->type() == QgsMapLayer::RasterLayer )
   {
+    mActionLayerSubsetString->setEnabled( false );
     mActionSelect->setEnabled( false );
     mActionZoomActualSize->setEnabled( true );
     mActionOpenTable->setEnabled( false );
     mActionToggleEditing->setEnabled( false );
+    mActionSaveEdits->setEnabled( false );
     mActionLayerSaveAs->setEnabled( false );
     mActionLayerSelectionSaveAs->setEnabled( false );
@@ -5996,10 +6169,10 @@
 
   // connect up any request the raster may make to update the app progress
-  QObject::connect( theRasterLayer, SIGNAL( drawingProgress( int, int ) ),
-                    this, SLOT( showProgress( int, int ) ) );
+  connect( theRasterLayer, SIGNAL( drawingProgress( int, int ) ),
+           this, SLOT( showProgress( int, int ) ) );
 
   // connect up any request the raster may make to update the statusbar message
-  QObject::connect( theRasterLayer, SIGNAL( statusChanged( QString ) ),
-                    this, SLOT( showStatusMessage( QString ) ) );
+  connect( theRasterLayer, SIGNAL( statusChanged( QString ) ),
+           this, SLOT( showStatusMessage( QString ) ) );
 
   return true;
@@ -6468,4 +6641,7 @@
   */
 
+  if ( !ml )
+    return;
+
   if ( ml->type() == QgsMapLayer::RasterLayer )
   {
@@ -6514,5 +6690,4 @@
       QMessageBox::information( this, tr( "Warning" ), tr( "This layer doesn't have a properties dialog." ) );
     }
-
   }
 }
Index: /trunk/qgis/src/core/qgsvectorlayer.cpp
===================================================================
--- qgis-1.4.0/src/core/qgsvectorlayer.cpp (revision 13380)
+++ /trunk/qgis/src/core/qgsvectorlayer.cpp (revision 13501)
@@ -2951,5 +2951,5 @@
 
   // add label node
-  QDomElement label  = doc.createElement( "label" );
+  QDomElement labelElem = doc.createElement( "label" );
   QDomText labelText = doc.createTextNode( "" );
 
@@ -2962,7 +2962,7 @@
     labelText.setData( "0" );
   }
-  label.appendChild( labelText );
-
-  node.appendChild( label );
+  labelElem.appendChild( labelText );
+
+  node.appendChild( labelElem );
 
   // add attribute actions
@@ -2975,5 +2975,5 @@
   // XXX function.  I think.
 
-  const QgsLabel *myLabel = this->label();
+  const QgsLabel *myLabel = label();
 
   if ( myLabel )
Index: /trunk/qgis/src/core/qgsapplication.cpp
===================================================================
--- qgis-1.4.0/src/core/qgsapplication.cpp (revision 13494)
+++ /trunk/qgis/src/core/qgsapplication.cpp (revision 13501)
@@ -72,5 +72,4 @@
 QgsApplication::~QgsApplication()
 {
-
 }
 
Index: /trunk/qgis/src/core/qgsmaplayerregistry.cpp
===================================================================
--- qgis-1.4.0/src/core/qgsmaplayerregistry.cpp (revision 11961)
+++ /trunk/qgis/src/core/qgsmaplayerregistry.cpp (revision 13501)
@@ -103,5 +103,4 @@
 void QgsMapLayerRegistry::removeAllMapLayers()
 {
-
   // moved before physically removing the layers
   emit removedAll();            // now let all canvas Observers know to clear
Index: /trunk/qgis/src/core/qgsmaplayerregistry.h
===================================================================
--- qgis-1.4.0/src/core/qgsmaplayerregistry.h (revision 13380)
+++ /trunk/qgis/src/core/qgsmaplayerregistry.h (revision 13501)
@@ -64,5 +64,5 @@
        which won't be used in main map canvas but will be used in a special one
     */
-    QgsMapLayer *  addMapLayer( QgsMapLayer * theMapLayer, bool theEmitSignal = true );
+    QgsMapLayer *addMapLayer( QgsMapLayer * theMapLayer, bool theEmitSignal = true );
 
     /** Remove a layer from qgis
Index: /trunk/qgis/images/images.qrc
===================================================================
--- qgis-1.4.0/images/images.qrc (revision 13189)
+++ /trunk/qgis/images/images.qrc (revision 13501)
@@ -375,4 +375,5 @@
     <file>themes/gis/plugins/wfs.png</file>
     <file>themes/gis/plugins/coordinate_capture/coordinate_capture.png</file>
+    <file>themes/default/mActionSaveEdits.png</file>
   </qresource>
 </RCC>

qgis-1.4.0-sip410.patch:
 Python.cmake |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- NEW FILE qgis-1.4.0-sip410.patch ---
--- qgis-1.4.0/cmake/Python.cmake	2009-08-19 21:09:10.000000000 +0200
+++ ../../qgis-1.4.0-sip410/cmake/Python.cmake	2010-05-12 20:46:28.884661938 +0200
@@ -148,8 +148,8 @@
     IF (HAVE_SIP_MODULE AND SIP_BINARY_PATH AND SIP_INCLUDE_DIR)
       # check for SIP version
       # minimal version is 4.7 (to support universal builds)
-      SET (SIP_MIN_VERSION 040700)
-      TRY_RUN_PYTHON (RES "import sip\nprint '%x' % sip.SIP_VERSION" SIP_VERSION)
+      SET (SIP_MIN_VERSION 263936) # 0x040700 
+      TRY_RUN_PYTHON (RES "import sip\nprint '%d' % sip.SIP_VERSION" SIP_VERSION)
       IF (SIP_VERSION EQUAL "${SIP_MIN_VERSION}" OR SIP_VERSION GREATER "${SIP_MIN_VERSION}")
         SET (SIP_IS_GOOD TRUE)
       ENDIF (SIP_VERSION EQUAL "${SIP_MIN_VERSION}" OR SIP_VERSION GREATER "${SIP_MIN_VERSION}")

qgis-1.4.0-vectorcrs.patch:
 gpx/qgsgpxprovider.cpp |    2 +-
 osm/osmprovider.cpp    |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

--- NEW FILE qgis-1.4.0-vectorcrs.patch ---
Index: /trunk/qgis/src/providers/gpx/qgsgpxprovider.cpp
===================================================================
--- qgis-1.4.0/src/providers/gpx/qgsgpxprovider.cpp (revision 12601)
+++ /trunk/qgis/src/providers/gpx/qgsgpxprovider.cpp (revision 13425)
@@ -851,5 +851,5 @@
 QgsCoordinateReferenceSystem QgsGPXProvider::crs()
 {
-  return QgsCoordinateReferenceSystem(); // use default CRS - it's WGS84
+  return QgsCoordinateReferenceSystem( GEOSRID, QgsCoordinateReferenceSystem::PostgisCrsId ); // use WGS84
 }
 
Index: /trunk/qgis/src/providers/osm/osmprovider.cpp
===================================================================
--- qgis-1.4.0/src/providers/osm/osmprovider.cpp (revision 12591)
+++ /trunk/qgis/src/providers/osm/osmprovider.cpp (revision 13425)
@@ -938,5 +938,5 @@
 QgsCoordinateReferenceSystem QgsOSMDataProvider::crs()
 {
-  return QgsCoordinateReferenceSystem();    // use default CRS - it's WGS84
+  return QgsCoordinateReferenceSystem( GEOSRID, QgsCoordinateReferenceSystem::PostgisCrsId ); // use WGS84
 }
 


Index: .cvsignore
===================================================================
RCS file: /cvs/pkgs/rpms/qgis/F-12/.cvsignore,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -p -r1.9 -r1.10
--- .cvsignore	30 Jul 2009 19:07:08 -0000	1.9
+++ .cvsignore	12 Jul 2010 10:47:32 -0000	1.10
@@ -1 +1 @@
-qgis_1.0.2.tar.gz
+qgis_1.4.0.tar.gz


Index: qgis.desktop
===================================================================
RCS file: /cvs/pkgs/rpms/qgis/F-12/qgis.desktop,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -p -r1.1 -r1.2
--- qgis.desktop	3 Jul 2007 15:21:11 -0000	1.1
+++ qgis.desktop	12 Jul 2010 10:47:33 -0000	1.2
@@ -4,7 +4,7 @@ Name=Quantum GIS
 GenericName=Geographic Information System
 Comment=
 Exec=qgis
-Icon=qgis.png
+Icon=qgis
 Terminal=false
 Type=Application
-Categories=Graphics;
+Categories=Geography;Viewer;Graphics;


Index: qgis.spec
===================================================================
RCS file: /cvs/pkgs/rpms/qgis/F-12/qgis.spec,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -p -r1.42 -r1.43
--- qgis.spec	10 Feb 2010 20:04:57 -0000	1.42
+++ qgis.spec	12 Jul 2010 10:47:33 -0000	1.43
@@ -1,171 +1,185 @@
-%{!?python_sitearch: %define python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")}
+%if ! (0%{?fedora} > 12 || 0%{?rhel} > 5)
+%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
+%endif
+
+Name:           qgis
+Version:        1.4.0
+Release:        8%{?dist}
+Summary:        A user friendly Open Source Geographic Information System
+
+Group:          Applications/Engineering
+License:        GPLv2+ with exceptions
+URL:            http://www.qgis.org/
+Source0:        http://download.osgeo.org/qgis/src/%{name}_%{version}.tar.gz
+Source1:        %{name}.desktop
+
+# Fix sip version, so it works with sip 4.10
+# Already fixed in upcoming version http://trac.osgeo.org/qgis/ticket/2446
+Patch0: qgis-1.4.0-sip410.patch
+
+# Fix detection problem for GRASS libraries
+Patch1: qgis-1.4.0-grass.patch
+Patch2: qgis-1.4.0-qt47.patch
+
+# Already fixed in upcoming version https://trac.osgeo.org/qgis/ticket/2879
+Patch3: qgis-1.4.0-QVariant.patch
+
+## Upstream patches
+# http://trac.osgeo.org/qgis/ticket/2542
+Patch100: qgis-1.4.0-fieldcalc.patch
+
+# http://trac.osgeo.org/qgis/ticket/2661
+Patch101: qgis-1.4.0-vectorcrs.patch
+
+# http://trac.osgeo.org/qgis/ticket/2670
+Patch102: qgis-1.4.0-asslibqgisv.patch
+
+BuildRequires:  cmake
+BuildRequires:  flex bison
+
+BuildRequires:  expat-devel
+BuildRequires:  gdal-devel
+BuildRequires:  geos-devel
+BuildRequires:  gsl-devel
+BuildRequires:  postgresql-devel
+BuildRequires:  proj-devel
+BuildRequires:  sqlite-devel
+BuildRequires:  chrpath
+BuildRequires:  desktop-file-utils
+BuildRequires:  qt-devel
+BuildRequires:  sip-devel > 4.7
+BuildRequires:  python-devel
+BuildRequires:  PyQt4-devel
+BuildRequires:  qt4-webkit-devel
 
-Name: qgis
-Version: 1.0.2
-Release: 6%{?dist}
-Summary: A user friendly Open Source Geographic Information System
-
-Group: Applications/Engineering
-License: GPLv2+
-URL: http://qgis.org/
-Source0: http://download.osgeo.org/qgis/src/%{name}_%{version}.tar.gz
-Source1: %{name}.desktop
-# fix sip version check so it works with sip 4.10
-Patch0:  qgis-1.0.2-sip410.patch
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-
-## upstream patches
-# http://trac.osgeo.org/qgis/ticket/1959
-Patch100: qgis-1.0.2-sip49.patch
-
-BuildRequires: cmake
-BuildRequires: desktop-file-utils
-BuildRequires: qt4-devel
-BuildRequires: bison, flex
-BuildRequires: expat-devel
-BuildRequires: gdal-devel
-BuildRequires: geos-devel
-BuildRequires: gsl-devel
-BuildRequires: postgresql-devel
-BuildRequires: sqlite-devel
 # grass package contains definitions needed for configure script
-BuildRequires: grass, grass-devel
-BuildRequires: chrpath
-# fixing missing library calls in atlas
-BuildRequires: blas, lapack
-Requires: gpsbabel
+BuildRequires:  grass, grass-devel
+
+Requires:       gpsbabel 
+
+Obsoletes:      qgis-theme-classic < 1.1
+Obsoletes:      qgis-theme-gis < 1.1
+Obsoletes:      qgis-theme-nkids < 1.1
 
 %description
 Quantum GIS (QGIS) is a user friendly Open Source Geographic Information 
-System (GIS) that runs on Linux, Unix, Mac OSX, and Windows. QGIS supports 
-vector, raster, and database formats. QGIS is licensed under the GNU 
-General Public License. QGIS lets you browse and create map data on your 
-computer. It supports many common spatial data formats (e.g. ESRI ShapeFile, 
-geotiff). QGIS supports plugins to do things like display tracks from your GPS.
-
+System (GIS) that runs on Linux, Unix, Mac OSX, and Windows.
+QGIS supports vector, raster, and database formats. QGIS lets you browse
+and create map data on your computer. It supports many common spatial data
+formats (e.g. ESRI ShapeFile, geotiff). QGIS supports plugins to do things
+like display tracks from your GPS.
 
 %package devel
-Summary: Headers and libraries for building against qgis
-Group: Development/Libraries
-Requires: %{name} = %{version}-%{release}
+Summary:        Development Libraries for the Quantum GIS
+Group:          Development/Libraries
+Requires:       %{name} = %{version}-%{release}
 
 %description devel
-Headers and libraries for building against qgis
-
+Development packages for Quantum GIS including the C header files.
 
-%package grass
-Summary: GRASS plugins for qgis
-Group: Applications/Engineering
-Requires: %{name} = %{version}-%{release}
-Requires: grass
+%package grass 
+Summary:        GRASS Support Libraries for Quantum GIS
+Group:          Applications/Engineering
+Requires:       %{name} = %{version}-%{release}
+Requires:       grass
 
 %description grass
-GRASS plugins for qgis
+GRASS plugin for Quantum GIS required to interface with the GRASS system.
 
-
-%package python
-Summary: Python integration and plugins for qgis
-Group: Applications/Engineering
-Requires: %{name} = %{version}-%{release}
-Requires: PyQt4
-%{?_sip_api:Requires: sip-api(%{_sip_api_major}) >= %{_sip_api}}
-BuildRequires: sip-devel
-BuildRequires: python-devel
-BuildRequires: PyQt4-devel
+%package python 
+Summary:        Python integration and plugins for Quantum GIS
+Group:          Applications/Engineering
+Requires:       %{name} = %{version}-%{release}
 
 %description python
-Python integration and plugins for qgis
-
-
-%package theme-classic
-Summary: Addtional theme for qgis - classic
-Group: Applications/Engineering
-Requires: %{name} = %{version}-%{release}
-
-%description theme-classic
-Addtional theme for qgis - classic
-
-
-%package theme-gis
-Summary: Addtional theme for qgis - gis
-Group: Applications/Engineering
-Requires: %{name} = %{version}-%{release}
-
-%description theme-gis
-Addtional theme for qgis - gis
-
-
-%package theme-nkids
-Summary: Addtional theme for qgis - nkids
-Group: Applications/Engineering
-Requires: %{name} = %{version}-%{release}
-
-%description theme-nkids
-Addtional theme for qgis - nkids
-
+Python integration and plugins for QGIS.
 
 %prep
 %setup -q -n %{name}-%{version}
 
-%patch100 -p1 -b .sip49
 %patch0 -p1 -b .sip410
+%patch1 -p1 -b .grass
+%patch2 -p1 -b .qt47
+%patch3 -p1 -b .QVariant
+%patch100 -p1 -b .fieldcalc
+%patch101 -p1 -b .vectorcrs
+%patch102 -p1 -b .asslibqgis
+
+# Encode man-file to utf-8
+iconv -f iso8859-1 -t utf-8 qgis_help.1 > qgis_help.1.conv && mv qgis_help.1.conv qgis_help.1
+
+# Fix spurious executable bits
+# Already fixed in upcoming version
+chmod -x \
+     ./src/app/legend/qgslegend.h \
+     ./src/app/legend/qgslegend.cpp \
+     ./src/core/composer/qgscomposershape.h \
+     ./src/core/composer/qgscomposershape.cpp
 
-# fix spurious executable bits
-%{__chmod} -x \
-	./src/app/legend/qgslegend.h \
-	./src/app/legend/qgslegend.cpp \
-	./src/gui/qgsdetaileditem*.cpp \
-	./src/gui/qgsdetaileditem*.h
-
-# remove duplicate translations
-/usr/bin/lupdate-qt4 -no-obsolete -ts i18n/*.ts
-
+# Remove obsolete translations
+#/usr/bin/lupdate-qt4 -noobsolete -ts i18n/qgis_*.ts
 
 %build
-for dir in %{_libdir}/grass-*/ ; do
-	GRASS_PREFIX=$dir
-done
-%cmake \
-	-D QGIS_MANUAL_SUBDIR=share/man \
-	-D QGIS_LIB_SUBDIR=%{_lib} \
-	-D QGIS_PLUGIN_SUBDIR=%{_lib}/qgis \
-	-D BINDINGS_GLOBAL_INSTALL:BOOL=ON \
-	-D GRASS_PREFIX=$GRASS_PREFIX \
-	-D GDAL_INCLUDE_DIR=%{_includedir}/gdal \
-	-D GDAL_LIBRARY=%{_libdir}/libgdal.so \
-	.
 
-make %{?_smp_mflags}
+# Detection doesn't work on it's own
+GRASS_PREFIX=%{_libdir}
 
+%cmake \
+      -D QGIS_LIB_SUBDIR=%{_lib} \
+      -D QGIS_MANUAL_SUBDIR=/share/man \
+      -D QGIS_PLUGIN_SUBDIR=%{_lib}/%{name} \
+      -D WITH_BINDINGS:BOOL=TRUE \
+      -D BINDINGS_GLOBAL_INSTALL:BOOL=TRUE \
+      -D GRASS_PREFIX=$GRASS_PREFIX \
+      -D GDAL_INCLUDE_DIR=%{_includedir}/gdal \
+      -D GDAL_LIBRARY=%{_libdir}/libgdal.so \
+      .
+
+# Parallel make leads to race conditions with PYQT4_WRAP_UI
+#make %{?_smp_mflags}
+make
 
 %install
-%{__rm} -rf %{buildroot}
+rm -rf %{buildroot}
 make install DESTDIR=%{buildroot}
 
-# remove rpath from files
+# Qt translations shouldn't be shipped
+rm -f %{buildroot}/%{_datadir}/%{name}/i18n/qt_*.qm
+
+%find_lang %{name} --with-qt
+
+# Remove rpath from files
 chrpath --delete \
-	%{buildroot}%{_bindir}/%{name} \
-	%{buildroot}%{python_sitearch}/%{name}/*.so
+    %{buildroot}%{python_sitearch}/%{name}/*.so
 
-# add executable perms to python libs so they get striped
-%{__chmod} +x %{buildroot}%{python_sitearch}/%{name}/*.so
+# Add executable perms to python libs so they get stripped
+chmod +x %{buildroot}%{python_sitearch}/%{name}/*.so
 
-# remove files packaged by doc
-%{__rm} -f %{buildroot}%{_datadir}/doc/AUTHORS \
-	%{buildroot}%{_datadir}/doc/SPONSORS
-
-# install desktop file
-%{__install} -d %{buildroot}%{_datadir}/pixmaps
-%{__install} -m0644 \
-	%{buildroot}%{_datadir}/%{name}/images/icons/qgis-icon.png \
-	%{buildroot}%{_datadir}/pixmaps/%{name}.png
+# Remove files packaged by doc or undesired
+rm -f %{buildroot}%{_datadir}/%{name}/doc/BUGS \
+    %{buildroot}%{_datadir}/%{name}/doc/ChangeLog \
+    %{buildroot}%{_datadir}/%{name}/doc/CODING \
+    %{buildroot}%{_datadir}/%{name}/doc/COPYING \
+    %{buildroot}%{_datadir}/%{name}/doc/INSTALL \
+    %{buildroot}%{_datadir}/%{name}/doc/PROVENANCE \
+    %{buildroot}%{_datadir}/%{name}/doc/README
+
+# Install desktop file
+install -pd %{buildroot}%{_datadir}/pixmaps
+install -pm0644 \
+    %{buildroot}%{_datadir}/%{name}/images/icons/%{name}-icon.png \
+    %{buildroot}%{_datadir}/pixmaps/%{name}.png
 desktop-file-install --vendor="fedora" \
-	--dir=%{buildroot}%{_datadir}/applications \
-	%{SOURCE1}
+--dir=%{buildroot}/%{_datadir}/applications \
+%{SOURCE1}
 
+%check
+# The tests don't seem to work right
+# -D ENABLE_TESTS:BOOL=TRUE \
+#make -d test
 
 %clean
-%{__rm} -rf %{buildroot}
+rm -rf %{buildroot}
 
 %post -p /sbin/ldconfig
 
@@ -179,82 +193,97 @@ desktop-file-install --vendor="fedora" \
 
 %postun python -p /sbin/ldconfig
 
-
-%files
-%defattr(-, root, root, -)
-%doc AUTHORS BUGS COPYING ChangeLog README SPONSORS CONTRIBUTORS
-%{_bindir}/%{name}
-%{_bindir}/%{name}_help
+%files -f %{name}.lang
+%defattr(-,root,root,-)
+%doc BUGS COPYING ChangeLog README CODING PROVENANCE Exception_to_GPL_for_Qt.txt
+# Can be viewed in the About-Box:
+# CONTRIBUTORS AUTHORS
 %{_libdir}/lib%{name}_*.so.*
-%dir %{_libdir}/%{name}
-%{_libdir}/%{name}/libcoordinatecaptureplugin.so
-%{_libdir}/%{name}/libcopyrightlabelplugin.so
-%{_libdir}/%{name}/libdelimitedtextplugin.so
-%{_libdir}/%{name}/libdelimitedtextprovider.so
-%{_libdir}/%{name}/libdxf2shpconverterplugin.so
-%{_libdir}/%{name}/libgeorefplugin.so
-%{_libdir}/%{name}/libgpsimporterplugin.so
-%{_libdir}/%{name}/libgpxprovider.so
-%{_libdir}/%{name}/libgridmakerplugin.so
-%{_libdir}/%{name}/libinterpolationplugin.so
-%{_libdir}/%{name}/libmemoryprovider.so
-%{_libdir}/%{name}/libnortharrowplugin.so
-%{_libdir}/%{name}/libogrconverterplugin.so
-%{_libdir}/%{name}/libogrprovider.so
-%{_libdir}/%{name}/libpostgresprovider.so
-%{_libdir}/%{name}/libquickprintplugin.so
-%{_libdir}/%{name}/libscalebarplugin.so
-%{_libdir}/%{name}/libspitplugin.so
-%{_libdir}/%{name}/libwfsplugin.so
-%{_libdir}/%{name}/libwfsprovider.so
-%{_libdir}/%{name}/libwmsprovider.so
-%{_datadir}/%{name}/doc
+%{_libdir}/%{name}/
+%{_bindir}/qgis*
+%{_mandir}/man1/%{name}*
+%dir %{_datadir}/%{name}/
 %{_datadir}/pixmaps/%{name}.png
 %{_datadir}/applications/fedora-%{name}.desktop
-%dir %{_datadir}/%{name}
-%{_datadir}/%{name}/i18n
+%dir %{_datadir}/%{name}/i18n/
+%{_datadir}/%{name}/doc
 %{_datadir}/%{name}/images
 %{_datadir}/%{name}/resources
 %{_datadir}/%{name}/svg
-%dir %{_datadir}/%{name}/themes
-%dir %{_datadir}/%{name}/themes/default
-%{_datadir}/%{name}/themes/default/*.png
-%{_mandir}/man1/*
+%{_datadir}/%{name}/themes
+%exclude %{_libdir}/libqgisgrass.so.%{version}
+%exclude %{_libdir}/%{name}/libgrassprovider.so
+%exclude %{_libdir}/%{name}/libgrassplugin.so
+%exclude %{_datadir}/%{name}/themes/default/grass
+%exclude %{_datadir}/%{name}/themes/gis/grass
+%exclude %{_datadir}/%{name}/themes/classic/grass
 
 %files devel
-%defattr(-, root, root, -)
+%defattr(-,root,root,-)
 %{_includedir}/%{name}
 %{_libdir}/lib%{name}_*.so
-%{_libdir}/libqgisgrass.so
+%{_libdir}/lib%{name}python.so
+%{_libdir}/lib%{name}grass.so
 
 %files grass
-%defattr(-, root, root, -)
-%{_libdir}/libqgisgrass.so.*
-%{_libdir}/%{name}/libgrass*.so
+%defattr(-,root,root,-)
+%{_libdir}/lib%{name}grass.so.%{version}
+%{_libdir}/%{name}/libgrassprovider.so
+%{_libdir}/%{name}/libgrassplugin.so
 %{_datadir}/%{name}/grass
 %{_datadir}/%{name}/themes/default/grass
+%{_datadir}/%{name}/themes/gis/grass
+%{_datadir}/%{name}/themes/classic/grass
 
 %files python
-%defattr(-, root, root, -)
-%{_libdir}/libqgispython.so.*
-%{_libdir}/libqgispython.so
+%defattr(-,root,root,-)
+%{_libdir}/lib%{name}python.so.*
 %{_datadir}/%{name}/python
 %{python_sitearch}/%{name}
 
-%files theme-classic
-%defattr(-, root, root, -)
-%{_datadir}/%{name}/themes/classic
-
-%files theme-gis
-%defattr(-, root, root, -)
-%{_datadir}/%{name}/themes/gis
-
-%files theme-nkids
-%defattr(-, root, root, -)
-%{_datadir}/%{name}/themes/nkids
+%changelog
+* Fri Jul 09 2010 Volker Fröhlich <volker27 at gmx.at> - 1.4.0-8
+- Further completed qt47 patch
 
+* Fri Jul 09 2010 Volker Fröhlich <volker27 at gmx.at> - 1.4.0-7
+- Further completed qt47 patch
+
+* Fri Jul 09 2010 Volker Fröhlich <volker27 at gmx.at> - 1.4.0-6
+- Added patch to remove redundant ::QVariant in function-style cast
+
+* Fri Jul 09 2010 Volker Fröhlich <volker27 at gmx.at> - 1.4.0-5
+- Removed smp_mflags because of race conditions
+- Simplified member initializer syntax in qt47 patch
+
+* Wed Jul 07 2010 Volker Fröhlich <volker27 at gmx.at> - 1.4.0-4
+- Added preliminary patch for Qt 4.7 -- still won't build for Rawhide because of https://bugzilla.redhat.com/show_bug.cgi?id=587707
+- Put version variable in filelist for GRASS
+- Added qt-webkit as build require, removed gettext
+- Corrected erroneous dependency on GRASS subpackage
+
+* Thu Jul 01 2010 Volker Fröhlich <volker27 at gmx.at> - 1.4.0-3
+- Changed license to reflect exception for Qt; packaged exception file
+- Added find_lang and excluded qt-translations
+- Added ownership for directory in share
+- Dropped docdir statement
+- Changed description for the subpackages python and grass
+
+* Wed Jun 24 2010 Volker Fröhlich <volker27 at gmx.at> - 1.4.0-2
+- Grouped corresponding entries for %description and %package
+- Corrected swapped summaries for python- and grass-subpackage
+- Set theme subpackages as obsolete 
+- Removed nonsensical build-requires statements from subpackages
+- Dropped redundant definition of GRASS_PREFIX
+- Removed verbose-option from make
+- Removed unnecessary chmod-command
+- Removed nonsensical ldconfig for devel-subpackage
+- Made the file list more elegant
+- Removed unnecessary call for chrpath
+
+* Thu Jun 17 2010 Volker Fröhlich <volker27 at gmx.at> - 1.4.0-1
+- Updated for 1.4.0
+- Dropped theme packages
 
-%changelog
 * Wed Feb 10 2010 Kevin Kofler <Kevin at tigcc.ticalc.org> - 1.0.2-6
 - rebuild for sip 4.10
 - fix sip version check so it works with sip 4.10 (#553713)


Index: sources
===================================================================
RCS file: /cvs/pkgs/rpms/qgis/F-12/sources,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -p -r1.9 -r1.10
--- sources	30 Jul 2009 19:07:08 -0000	1.9
+++ sources	12 Jul 2010 10:47:33 -0000	1.10
@@ -1 +1 @@
-71faff161c0b893f75d008187b471fc8  qgis_1.0.2.tar.gz
+47710e7aa14c2a672c7f28457b0c956f  qgis_1.4.0.tar.gz


--- qgis-1.0.2-sip410.patch DELETED ---


--- qgis-1.0.2-sip49.patch DELETED ---



More information about the scm-commits mailing list