Quantum GIS API Documentation  1.7.4
src/core/qgsvectorlayerundocommand.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines