Quantum GIS API Documentation
1.7.4
|
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 // when the command is added to the undo stack, the redo() function is called 00057 // but we have already done the changes in the layer, so we ignore the first redo() call 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 // geometry has been modified already: just alter the resulting geometry 00078 mGeometryChange[featureId].setTargetGeometry( target ); 00079 } 00080 else 00081 { 00082 // create new entry about changed geometry 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 }