diff --git a/providers/delimitedtext/qgsdelimitedtextprovider.cpp b/providers/delimitedtext/qgsdelimitedtextprovider.cpp index 06b5679174f..1f0982c651b 100644 --- a/providers/delimitedtext/qgsdelimitedtextprovider.cpp +++ b/providers/delimitedtext/qgsdelimitedtextprovider.cpp @@ -725,11 +725,12 @@ bool QgsDelimitedTextProvider::boundsCheck(double x, double y) return inBounds; } -bool QgsDelimitedTextProvider::supportsSaveAsShapefile() const +int QgsDelimitedTextProvider::capabilities() const { - return true; + return QgsVectorDataProvider::SaveAsShapefile; } + bool QgsDelimitedTextProvider::saveAsShapefile() { // save the layer as a shapefile diff --git a/providers/delimitedtext/qgsdelimitedtextprovider.h b/providers/delimitedtext/qgsdelimitedtextprovider.h index 9333c5360f4..12e927ee472 100644 --- a/providers/delimitedtext/qgsdelimitedtextprovider.h +++ b/providers/delimitedtext/qgsdelimitedtextprovider.h @@ -206,9 +206,7 @@ public: */ bool boundsCheck(double x, double y); - //! We support saving as shapefile - used to add item to the - // layers context menu - bool supportsSaveAsShapefile() const; + int capabilities() const; //! Save the layer as a shapefile bool saveAsShapefile(); diff --git a/providers/ogr/qgsogrprovider.cpp b/providers/ogr/qgsogrprovider.cpp index 6130bd3fc02..e01b1847fdb 100644 --- a/providers/ogr/qgsogrprovider.cpp +++ b/providers/ogr/qgsogrprovider.cpp @@ -933,6 +933,12 @@ bool QgsOgrProvider::changeAttributeValues(std::map > const & attr_map); - bool supportsFeatureAddition() const - { - return true; - } - QgsDataSourceURI * getURI() { return 0; } + /**Returns a bitmask containing the supported capabilities*/ + int capabilities() const; + private: unsigned char *getGeometryPointer(OGRFeature * fet); std::vector < QgsField > attributeFields; diff --git a/providers/postgres/qgspostgresprovider.cpp b/providers/postgres/qgspostgresprovider.cpp index 63ee4bd3d8b..cd3b2ed1cbe 100644 --- a/providers/postgres/qgspostgresprovider.cpp +++ b/providers/postgres/qgspostgresprovider.cpp @@ -1151,11 +1151,11 @@ bool QgsPostgresProvider::supportsSaveAsShapefile() const return false; } -int QgsPostgresProvider::capabilities() +int QgsPostgresProvider::capabilities() const { return ( QgsVectorDataProvider::AddFeatures | QgsVectorDataProvider::DeleteFeatures | - QgsVectorDataProvider::ChangeAttributes | + QgsVectorDataProvider::ChangeAttributeValues | QgsVectorDataProvider::AddAttributes | QgsVectorDataProvider::DeleteAttributes ); } diff --git a/providers/postgres/qgspostgresprovider.h b/providers/postgres/qgspostgresprovider.h index 49bd458ac74..189a65510b7 100644 --- a/providers/postgres/qgspostgresprovider.h +++ b/providers/postgres/qgspostgresprovider.h @@ -220,15 +220,6 @@ public: @return true in case of success and false in case of failure*/ bool changeAttributeValues(std::map > const & attr_map); - bool supportsFeatureAddition() const - { return true; } - - bool supportsFeatureDeletion() const - {return true;} - - bool supportsAttributeEditing() const - {return true;} - //! Flag to indicate if the provider can export to shapefile bool supportsSaveAsShapefile() const; @@ -245,7 +236,7 @@ public: void setSubsetString(QString theSQL); //{sqlWhereClause = theSQL;}; /**Returns a bitmask containing the supported capabilities*/ - int capabilities(); + int capabilities() const; private: diff --git a/src/qgisapp.cpp b/src/qgisapp.cpp index 0f3c8263a4f..6578213656b 100644 --- a/src/qgisapp.cpp +++ b/src/qgisapp.cpp @@ -2649,13 +2649,15 @@ void QgisApp::currentLayerChanged(QListViewItem * lvi) { // disable/enable toolbar buttons as appropriate based on selected // layer type + + toolPopupCapture->setItemEnabled(0,FALSE); + toolPopupCapture->setItemEnabled(1,FALSE); + toolPopupCapture->setItemEnabled(2,FALSE); + toolPopupCapture->setItemEnabled(3,FALSE); + QgsMapLayer *layer = ((QgsLegendItem *) lvi)->layer(); if (layer->type() == QgsMapLayer::RASTER) { - toolPopupCapture->setItemEnabled(0,FALSE); - toolPopupCapture->setItemEnabled(1,FALSE); - toolPopupCapture->setItemEnabled(2,FALSE); - toolPopupCapture->setItemEnabled(3,FALSE); actionIdentify->setEnabled(FALSE); actionSelect->setEnabled(FALSE); actionOpenTable->setEnabled(FALSE); @@ -2673,57 +2675,31 @@ void QgisApp::currentLayerChanged(QListViewItem * lvi) QgsVectorLayer* vlayer=dynamic_cast(((QgsLegendItem *) lvi)->layer()); if(vlayer) { - if(vlayer->vectorType()==QGis::Point) - { - toolPopupCapture->setItemEnabled(0,TRUE); - toolPopupCapture->setItemEnabled(1,FALSE); - toolPopupCapture->setItemEnabled(2,FALSE); - if(mMapCanvas->mapTool() == QGis::CaptureLine || mMapCanvas->mapTool() == QGis::CapturePolygon) + QgsVectorDataProvider* provider=vlayer->getDataProvider(); + if(provider) + { + int cap=vlayer->getDataProvider()->capabilities(); + if(cap&QgsVectorDataProvider::DeleteFeatures) { - mMapCanvas->setMapTool(QGis::CapturePoint); + toolPopupCapture->setItemEnabled(3,TRUE); } - } - else if(vlayer->vectorType()==QGis::Line) - { -#ifdef QGISDEBUG - qWarning("QgisApp::currentLayerChanged: Line type recognized"); - qWarning("current map tool is: "+QString::number(mMapCanvas->mapTool())); -#endif - toolPopupCapture->setItemEnabled(0,FALSE); - toolPopupCapture->setItemEnabled(1,TRUE); - toolPopupCapture->setItemEnabled(2,FALSE); - if(mMapCanvas->mapTool() == QGis::CapturePoint || mMapCanvas->mapTool() == QGis::CapturePolygon) + if(cap&QgsVectorDataProvider::AddFeatures) { -#ifdef QGISDEBUG - qWarning("Changing map tool"); -#endif - mMapCanvas->setMapTool(QGis::CaptureLine); + if(vlayer->vectorType()==QGis::Point) + { + toolPopupCapture->setItemEnabled(0,TRUE); + } + else if(vlayer->vectorType()==QGis::Line) + { + toolPopupCapture->setItemEnabled(1,TRUE); + } + else if(vlayer->vectorType()==QGis::Polygon) + { + toolPopupCapture->setItemEnabled(2,TRUE); + } } - } - else if(vlayer->vectorType()==QGis::Polygon) - { - toolPopupCapture->setItemEnabled(0,FALSE); - toolPopupCapture->setItemEnabled(1,FALSE); - toolPopupCapture->setItemEnabled(2,TRUE); - if(mMapCanvas->mapTool() == QGis::CapturePoint || mMapCanvas->mapTool() == QGis::CaptureLine) - { - mMapCanvas->setMapTool(QGis::CapturePolygon); - } - } - - QgsVectorDataProvider* dprov=vlayer->getDataProvider(); - if(dprov) - { - if(dprov->supportsFeatureDeletion()) - { - toolPopupCapture->setItemEnabled(3,TRUE); - } - else - { - toolPopupCapture->setItemEnabled(3,FALSE); - } - } - } + } + } actionIdentify->setEnabled(TRUE); actionSelect->setEnabled(TRUE); diff --git a/src/qgsattributetabledisplay.cpp b/src/qgsattributetabledisplay.cpp index a000be172a6..f3caf53f049 100644 --- a/src/qgsattributetabledisplay.cpp +++ b/src/qgsattributetabledisplay.cpp @@ -49,7 +49,14 @@ QgsAttributeTableDisplay::QgsAttributeTableDisplay(QgsVectorLayer* layer):QgsAtt edit->setItemEnabled(1,false); btnStopEditing->setEnabled(false); - if(!layer->getDataProvider()->supportsAttributeEditing()) + int cap=layer->getDataProvider()->capabilities(); + if((cap&QgsVectorDataProvider::ChangeAttributeValues) + ||(cap&QgsVectorDataProvider::AddAttributes) + ||(cap&QgsVectorDataProvider::DeleteAttributes)) + { + btnStartEditing->setEnabled(true); + } + else { btnStartEditing->setEnabled(false); } @@ -113,7 +120,7 @@ void QgsAttributeTableDisplay::startEditing() edit->setItemEnabled(1,true); editing=true; } - if(provider->capabilities()&QgsVectorDataProvider::ChangeAttributes) + if(provider->capabilities()&QgsVectorDataProvider::ChangeAttributeValues) { table()->setReadOnly(false); table()->setColumnReadOnly(0,true);//id column is not editable diff --git a/src/qgsmapcanvas.cpp b/src/qgsmapcanvas.cpp index fb3578b7710..5cce7bb07f0 100644 --- a/src/qgsmapcanvas.cpp +++ b/src/qgsmapcanvas.cpp @@ -1354,7 +1354,7 @@ void QgsMapCanvas::mouseReleaseEvent(QMouseEvent * e) //only do the rest for provider with feature addition support //note that for the grass provider, this will return false since //grass provider has its own mechanism of feature addition - if(vlayer->getDataProvider()->supportsFeatureAddition()) + if(vlayer->getDataProvider()->capabilities()&QgsVectorDataProvider::AddFeatures) { if(!vlayer->isEditable() ) { diff --git a/src/qgsvectordataprovider.cpp b/src/qgsvectordataprovider.cpp index 0eb059528dc..468ace0ea78 100644 --- a/src/qgsvectordataprovider.cpp +++ b/src/qgsvectordataprovider.cpp @@ -53,27 +53,3 @@ QString QgsVectorDataProvider::getDefaultValue(const QString& attr, QgsFeature* f) { return ""; } - -bool QgsVectorDataProvider::supportsFeatureAddition() const -{ - //needs to be overwritten by providers if they provide feature editing - return false; -} - -bool QgsVectorDataProvider::supportsFeatureDeletion() const -{ - //needs to be overwritten by providers supporting this - return false; -} - -bool QgsVectorDataProvider::supportsAttributeEditing() const -{ - //needs to be overwritten by providers supporting this - return false; -} - -bool QgsVectorDataProvider::supportsSaveAsShapefile() const -{ - // default implementation is no support - return false; -} diff --git a/src/qgsvectordataprovider.h b/src/qgsvectordataprovider.h index 8c464db72a5..f6c2e584f32 100644 --- a/src/qgsvectordataprovider.h +++ b/src/qgsvectordataprovider.h @@ -37,7 +37,7 @@ class QgsVectorDataProvider : public QgsDataProvider NoCapabilities = 0, AddFeatures = 1, DeleteFeatures = 1 << 1, - ChangeAttributes = 1 << 2, + ChangeAttributeValues = 1 << 2, AddAttributes = 1 << 3, DeleteAttributes = 1 << 4, SaveAsShapefile = 1 << 5 @@ -166,19 +166,6 @@ class QgsVectorDataProvider : public QgsDataProvider */ virtual std::vector& identify(QgsRect *rect) = 0; - /**Returns true if a provider supports feature editing*/ - virtual bool supportsFeatureAddition() const; - - /**Returns true if a provider supports deleting features*/ - virtual bool supportsFeatureDeletion() const; - - /*Returns true if a provider supports adding/ removing attributes and - attribute changes to already existing features*/ - virtual bool supportsAttributeEditing() const; - - /** Returns true is the provider supports saving to shapefile*/ - virtual bool supportsSaveAsShapefile() const; - /** saves current data as Shape file, if it can */ virtual bool saveAsShapefile() { @@ -186,7 +173,7 @@ class QgsVectorDataProvider : public QgsDataProvider } /**Returns a bitmask containing the supported capabilities*/ - virtual int capabilities(){return QgsVectorDataProvider::NoCapabilities;} + virtual int capabilities() const {return QgsVectorDataProvider::NoCapabilities;} const std::list& nonNumericalTypes(){return mNonNumericalTypes;} const std::list& numericalTypes(){return mNumericalTypes;} diff --git a/src/qgsvectorlayer.cpp b/src/qgsvectorlayer.cpp index 20deb884b9c..fecdece083a 100644 --- a/src/qgsvectorlayer.cpp +++ b/src/qgsvectorlayer.cpp @@ -872,14 +872,16 @@ void QgsVectorLayer::initContextMenu_(QgisApp * app) popMenu->insertSeparator(); // XXX should this move to QgsMapLayer::initContextMenu()? - if(dataProvider->supportsFeatureAddition()) + int cap=dataProvider->capabilities(); + if((cap&QgsVectorDataProvider::AddFeatures) + ||(cap&QgsVectorDataProvider::DeleteFeatures)) { popMenu->insertItem(tr("Start editing"),this,SLOT(startEditing())); popMenu->insertItem(tr("Stop editing"),this,SLOT(stopEditing())); } // XXX Can we ask the provider if it wants to add things to the context menu? - if(dataProvider->supportsSaveAsShapefile()) + if(cap&QgsVectorDataProvider::SaveAsShapefile) { // add the save as shapefile menu item popMenu->insertSeparator(); @@ -1314,19 +1316,19 @@ QString QgsVectorLayer::getDefaultValue(const QString& attr, bool QgsVectorLayer::deleteSelectedFeatures() { - if(!dataProvider->supportsFeatureDeletion()) - { - QMessageBox::information(0, tr("Provider does not support deletion"), tr("Data provider does not support deleting features")); - return false; - } + if(dataProvider->capabilities()&QgsVectorDataProvider::DeleteFeatures) + { + QMessageBox::information(0, tr("Provider does not support deletion"), tr("Data provider does not support deleting features")); + return false; + } - if(!isEditable()) - { - QMessageBox::information(0, tr("Layer not editable"), tr("The current layer is not editable. Choose 'start editing' in the legend item right click menu")); - return false; - } + if(!isEditable()) + { + QMessageBox::information(0, tr("Layer not editable"), tr("The current layer is not editable. Choose 'start editing' in the legend item right click menu")); + return false; + } - for(std::set::iterator it=mSelected.begin();it!=mSelected.end();++it) + for(std::set::iterator it=mSelected.begin();it!=mSelected.end();++it) { bool notcommitedfeature=false; //first test, if the feature with this id is a not-commited feature @@ -1346,21 +1348,21 @@ bool QgsVectorLayer::deleteSelectedFeatures() mDeleted.insert(*it); } - if(mSelected.size()>0) - { - mModified=true; - mSelected.clear(); - triggerRepaint(); - - //hide and delete the table because it is not up to date any more - if (tabledisplay) + if(mSelected.size()>0) { - tabledisplay->close(); - delete tabledisplay; - tabledisplay=0; - } + mModified=true; + mSelected.clear(); + triggerRepaint(); - } + //hide and delete the table because it is not up to date any more + if (tabledisplay) + { + tabledisplay->close(); + delete tabledisplay; + tabledisplay=0; + } + + } return true; } @@ -1384,18 +1386,18 @@ void QgsVectorLayer::startEditing() { if(dataProvider) { - if(!dataProvider->supportsFeatureAddition()) - { - QMessageBox::information(0,"Start editing failed","Provider cannot be opened for editing",QMessageBox::Ok); - } - else - { - mEditable=true; - if(isValid()) + if(!(dataProvider->capabilities()&QgsVectorDataProvider::AddFeatures)) { - updateItemPixmap(); + QMessageBox::information(0,"Start editing failed","Provider cannot be opened for editing",QMessageBox::Ok); + } + else + { + mEditable=true; + if(isValid()) + { + updateItemPixmap(); + } } - } } }