00001
00002 #include "qgsvectorlayerundocommand.h"
00003
00004 #include "qgsgeometry.h"
00005 #include "qgsvectorlayer.h"
00006
00007 #include "qgslogger.h"
00008
00009 QgsUndoCommand::GeometryChangeEntry::GeometryChangeEntry()
00010 : original( NULL ), target( NULL )
00011 {
00012 }
00013
00014 void QgsUndoCommand::GeometryChangeEntry::setOriginalGeometry( QgsGeometry& orig )
00015 {
00016 if ( orig.type() != QGis::UnknownGeometry )
00017 {
00018 original = new QgsGeometry( orig );
00019 }
00020 else
00021 {
00022 original = NULL;
00023 }
00024 }
00025
00026 void QgsUndoCommand::GeometryChangeEntry::setTargetGeometry( QgsGeometry& dest )
00027 {
00028 if ( dest.type() != QGis::UnknownGeometry )
00029 {
00030 target = new QgsGeometry( dest );
00031 }
00032 else
00033 {
00034 target = NULL;
00035 }
00036 }
00037
00038
00039 QgsUndoCommand::GeometryChangeEntry::~GeometryChangeEntry()
00040 {
00041 delete original;
00042 delete target;
00043 }
00044
00045
00046 QgsUndoCommand::QgsUndoCommand( QgsVectorLayer* vlayer, QString text )
00047 : QUndoCommand()
00048 {
00049 setText( text );
00050 mLayer = vlayer;
00051 mFirstRun = true;
00052 }
00053
00054 void QgsUndoCommand::redo()
00055 {
00056
00057
00058 if ( mFirstRun )
00059 {
00060 mFirstRun = false;
00061 return;
00062 }
00063
00064 mLayer->redoEditCommand( this );
00065 }
00066
00067 void QgsUndoCommand::undo()
00068 {
00069 mLayer->undoEditCommand( this );
00070 }
00071
00072
00073 void QgsUndoCommand::storeGeometryChange( int featureId, QgsGeometry& original, QgsGeometry& target )
00074 {
00075 if ( mGeometryChange.contains( featureId ) )
00076 {
00077
00078 mGeometryChange[featureId].setTargetGeometry( target );
00079 }
00080 else
00081 {
00082
00083 mGeometryChange.insert( featureId, GeometryChangeEntry() );
00084 mGeometryChange[featureId].setOriginalGeometry( original );
00085 mGeometryChange[featureId].setTargetGeometry( target );
00086 }
00087 }
00088
00089 void QgsUndoCommand::storeAttributeChange( int featureId, int field, QVariant original, QVariant target, bool isFirstChange )
00090 {
00091 AttributeChangeEntry entry;
00092 entry.isFirstChange = isFirstChange;
00093 entry.original = original;
00094 entry.target = target;
00095 mAttributeChange[featureId].insert( field, entry );
00096 }
00097
00098 void QgsUndoCommand::storeAttributeAdd( int index, const QgsField & value )
00099 {
00100 mAddedAttributes.insert( index, value );
00101 }
00102
00103 void QgsUndoCommand::storeAttributeDelete( int index, const QgsField & orig )
00104 {
00105 mDeletedAttributes.insert( index, orig );
00106 }
00107
00108 void QgsUndoCommand::storeFeatureDelete( int featureId )
00109 {
00110 mDeletedFeatureIdChange.insert( featureId );
00111 }
00112
00113 void QgsUndoCommand::storeFeatureAdd( QgsFeature& feature )
00114 {
00115 mAddedFeatures.append( feature );
00116 }