00001
00002 #ifndef QGSVECTORLAYERUNDOCOMMAND_H
00003 #define QGSVECTORLAYERUNDOCOMMAND_H
00004
00005 #include <QUndoCommand>
00006
00007 #include <QVariant>
00008 #include <QSet>
00009 #include <QList>
00010
00011 #include "qgsfield.h"
00012 #include "qgsfeature.h"
00013
00014 class QgsGeometry;
00015 class QgsVectorLayer;
00016
00017
00018
00019 typedef QList<int> QgsAttributeList;
00020 typedef QSet<int> QgsFeatureIds;
00021 typedef QSet<int> QgsAttributeIds;
00022
00023
00024
00028 class QgsUndoCommand : public QUndoCommand
00029 {
00030 public:
00031
00033 class AttributeChangeEntry
00034 {
00035 public:
00036 bool isFirstChange;
00037 QVariant original;
00038 QVariant target;
00039 };
00040
00041 typedef QMap<int, AttributeChangeEntry> AttributeChanges;
00042
00044 class GeometryChangeEntry
00045 {
00046 public:
00047 GeometryChangeEntry();
00048 ~GeometryChangeEntry();
00049
00050 void setOriginalGeometry( QgsGeometry& orig );
00051 void setTargetGeometry( QgsGeometry& target );
00052
00053 QgsGeometry* original;
00054 QgsGeometry* target;
00055 };
00056
00057
00058 QgsUndoCommand( QgsVectorLayer* layer, QString text );
00059
00063 void undo();
00064
00068 void redo();
00069
00076 void storeGeometryChange( int featureId, QgsGeometry& original, QgsGeometry& target );
00077
00086 void storeAttributeChange( int featureId, int field, QVariant original, QVariant target, bool isFirstChange );
00087
00092 void storeFeatureDelete( int featureId );
00093
00098 void storeFeatureAdd( QgsFeature& feature );
00099
00105 void storeAttributeAdd( int index, const QgsField & value );
00106
00112 void storeAttributeDelete( int index, const QgsField & orig );
00113
00114 private:
00116 bool mFirstRun;
00117
00119 QgsVectorLayer* mLayer;
00120
00122 QMap<int, GeometryChangeEntry> mGeometryChange;
00123
00125 QMap<int, AttributeChanges> mAttributeChange;
00126
00131 QgsFeatureIds mDeletedFeatureIdChange;
00132
00134 QgsFieldMap mAddedAttributes;
00135
00137 QgsFieldMap mDeletedAttributes;
00138
00142 QgsFeatureList mAddedFeatures;
00143
00144 friend class QgsVectorLayer;
00145 };
00146
00147 #endif