Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkOperationEvent.h"
00020 #include <itkCommand.h>
00021
00022 int mitk::UndoStackItem::m_CurrObjectEventId = 0;
00023 int mitk::UndoStackItem::m_CurrGroupEventId = 0;
00024
00025 bool mitk::UndoStackItem::m_IncrObjectEventId = false;
00026 bool mitk::UndoStackItem::m_IncrGroupEventId = false;
00027
00028
00029 mitk::UndoStackItem::UndoStackItem(std::string description)
00030 : m_Reversed(false),
00031 m_Description(description)
00032 {
00033 m_ObjectEventId = GetCurrObjectEventId();
00034 m_GroupEventId = GetCurrGroupEventId();
00035 }
00036
00037 mitk::UndoStackItem::~UndoStackItem()
00038 {
00039
00040 }
00041
00042 void mitk::UndoStackItem::ExecuteIncrement()
00043 {
00044 if (m_IncrObjectEventId)
00045 {
00046 ++m_CurrObjectEventId;
00047 m_IncrObjectEventId = false;
00048 }
00049
00050 if (m_IncrGroupEventId)
00051 {
00052 ++m_CurrGroupEventId;
00053 m_IncrGroupEventId = false;
00054 }
00055 }
00056
00057 int mitk::UndoStackItem::GetCurrObjectEventId()
00058 {
00059 return m_CurrObjectEventId;
00060 }
00061
00062 int mitk::UndoStackItem::GetCurrGroupEventId()
00063 {
00064 return m_CurrGroupEventId;
00065 }
00066
00067 void mitk::UndoStackItem::IncCurrObjectEventId()
00068 {
00069 m_IncrObjectEventId = true;
00070 }
00071
00072 void mitk::UndoStackItem::IncCurrGroupEventId()
00073 {
00074 m_IncrGroupEventId = true;
00075 }
00076
00077 int mitk::UndoStackItem::GetObjectEventId()
00078 {
00079 return m_ObjectEventId;
00080 }
00081
00082 int mitk::UndoStackItem::GetGroupEventId()
00083 {
00084 return m_GroupEventId;
00085 }
00086
00087 std::string mitk::UndoStackItem::GetDescription()
00088 {
00089 return m_Description;
00090 }
00091
00092 void mitk::UndoStackItem::ReverseOperations()
00093 {
00094 m_Reversed = !m_Reversed;
00095 }
00096
00097 void mitk::UndoStackItem::ReverseAndExecute()
00098 {
00099 ReverseOperations();
00100 }
00101
00102
00103
00104 mitk::Operation* mitk::OperationEvent::GetOperation()
00105 {
00106 return m_Operation;
00107 }
00108
00109 mitk::OperationEvent::OperationEvent(OperationActor* destination,
00110 Operation* operation, Operation* undoOperation,
00111 std::string description)
00112 : UndoStackItem(description),
00113 m_Destination(destination),
00114 m_Operation(operation),
00115 m_UndoOperation(undoOperation),
00116 m_Invalid(false)
00117 {
00118
00119 if (itk::Object* object = dynamic_cast<itk::Object*>( m_Destination ))
00120 {
00121 itk::SimpleMemberCommand< OperationEvent >::Pointer command = itk::SimpleMemberCommand< OperationEvent >::New();
00122 command->SetCallbackFunction( this, &OperationEvent::OnObjectDeleted );
00123 m_DeleteTag = object->AddObserver( itk::DeleteEvent(), command );
00124 }
00125 }
00126
00127 mitk::OperationEvent::~OperationEvent()
00128 {
00129
00130 if (!m_Invalid)
00131 {
00132 if (itk::Object* object = dynamic_cast<itk::Object*>( m_Destination ))
00133 {
00134 object->RemoveObserver( m_DeleteTag );
00135 }
00136 }
00137
00138 delete m_Operation;
00139 delete m_UndoOperation;
00140 }
00141
00142
00143
00144 void mitk::OperationEvent::ReverseOperations()
00145 {
00146 if (m_Operation == NULL)
00147 return;
00148
00149 Operation *tempOperation = m_Operation;
00150 m_Operation = m_UndoOperation;
00151 m_UndoOperation = tempOperation;
00152
00153 UndoStackItem::ReverseOperations();
00154 }
00155
00156 void mitk::OperationEvent::ReverseAndExecute()
00157 {
00158 ReverseOperations();
00159 if (m_Destination && m_Operation && !m_Invalid)
00160 m_Destination->ExecuteOperation( m_Operation );
00161 }
00162
00163 mitk::OperationActor* mitk::OperationEvent::GetDestination()
00164 {
00165 return m_Destination;
00166 }
00167
00168 void mitk::OperationEvent::OnObjectDeleted()
00169 {
00170 m_Invalid = true;
00171 }
00172
00173 bool mitk::OperationEvent::IsValid()
00174 {
00175 return !m_Invalid;
00176 }