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 "mitkDisplayVectorInteractor.h"
00020 #include "mitkOperation.h"
00021 #include "mitkDisplayCoordinateOperation.h"
00022 #include "mitkDisplayPositionEvent.h"
00023 #include "mitkUndoController.h"
00024 #include "mitkStateEvent.h"
00025 #include "mitkInteractionConst.h"
00026 #include "mitkAction.h"
00027
00028 void mitk::DisplayVectorInteractor::ExecuteOperation(Operation* itkNotUsed( operation ) )
00029 {
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 }
00052
00053 bool mitk::DisplayVectorInteractor::ExecuteAction(Action* action, mitk::StateEvent const* stateEvent)
00054 {
00055 bool ok=false;
00056
00057 const DisplayPositionEvent* posEvent=dynamic_cast<const DisplayPositionEvent*>(stateEvent->GetEvent());
00058 if(posEvent==NULL) return false;
00059
00060 int actionId = action->GetActionId();
00061
00062 if (actionId == AcINITZOOM)
00063 actionId = AcINITMOVE;
00064 switch(actionId)
00065 {
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 case AcSENDCOORDINATES:
00084 {
00085 DisplayCoordinateOperation* doOp = new mitk::DisplayCoordinateOperation(OpSENDCOORDINATES, posEvent->GetSender(), posEvent->GetDisplayPosition(), posEvent->GetDisplayPosition(), posEvent->GetDisplayPosition());
00086 m_Destination->ExecuteOperation(doOp);
00087 ok = true;
00088 break;
00089 }
00090 case AcINITMOVE:
00091 {
00092 m_Sender=posEvent->GetSender();
00093
00094 mitk::Vector2D origin = m_Sender->GetDisplayGeometry()->GetOriginInMM();
00095 double scaleFactorMMPerDisplayUnit = m_Sender->GetDisplayGeometry()->GetScaleFactorMMPerDisplayUnit();
00096
00097 m_StartDisplayCoordinate=posEvent->GetDisplayPosition();
00098 m_LastDisplayCoordinate=posEvent->GetDisplayPosition();
00099 m_CurrentDisplayCoordinate=posEvent->GetDisplayPosition();
00100 m_StartCoordinateInMM=mitk::Point2D( ( origin+m_StartDisplayCoordinate.GetVectorFromOrigin()*scaleFactorMMPerDisplayUnit ).GetDataPointer() );
00101 ok = true;
00102 break;
00103 }
00104 case AcMOVE:
00105 {
00106 DisplayCoordinateOperation* doOp = new DisplayCoordinateOperation(OpMOVE, m_Sender, m_StartDisplayCoordinate, m_CurrentDisplayCoordinate, posEvent->GetDisplayPosition());
00107
00108 m_LastDisplayCoordinate=m_CurrentDisplayCoordinate;
00109 m_CurrentDisplayCoordinate=posEvent->GetDisplayPosition();
00110
00111
00112 m_Destination->ExecuteOperation(doOp);
00113 ok = true;
00114 break;
00115 }
00116 case AcFINISHMOVE:
00117 {
00118 if (m_UndoEnabled)
00119 {
00120 DisplayCoordinateOperation* doOp = new mitk::DisplayCoordinateOperation(OpMOVE, m_Sender, m_StartDisplayCoordinate, m_StartDisplayCoordinate, posEvent->GetDisplayPosition());
00121 DisplayCoordinateOperation* undoOp = new mitk::DisplayCoordinateOperation(OpMOVE, posEvent->GetSender(), posEvent->GetDisplayPosition(), posEvent->GetDisplayPosition(), m_StartDisplayCoordinate);
00122
00123 OperationEvent *operationEvent = new OperationEvent(m_Destination, doOp, undoOp, "Move view");
00124 m_UndoController->SetOperationEvent(operationEvent);
00125 }
00126 ok = true;
00127 break;
00128 }
00129 case AcZOOM:
00130 {
00131 DisplayCoordinateOperation* doOp = new DisplayCoordinateOperation(OpZOOM, m_Sender, m_StartDisplayCoordinate, m_LastDisplayCoordinate, posEvent->GetDisplayPosition(),m_StartCoordinateInMM);
00132
00133 if (m_UndoEnabled)
00134 {
00135 DisplayCoordinateOperation* undoOp = new mitk::DisplayCoordinateOperation(OpZOOM, posEvent->GetSender(), posEvent->GetDisplayPosition(), posEvent->GetDisplayPosition(), m_LastDisplayCoordinate);
00136
00137 OperationEvent *operationEvent = new OperationEvent(m_Destination, doOp, undoOp, "Zoom view");
00138 m_UndoController->SetOperationEvent(operationEvent);
00139 }
00140
00141 m_LastDisplayCoordinate=m_CurrentDisplayCoordinate;
00142 m_CurrentDisplayCoordinate=posEvent->GetDisplayPosition();
00143
00144
00145
00146 m_Destination->ExecuteOperation(doOp);
00147 ok = true;
00148 break;
00149 }
00150 default:
00151 ok = false;
00152 break;
00153 }
00154 return ok;
00155 }
00156
00157 mitk::DisplayVectorInteractor::DisplayVectorInteractor(const char * type, mitk::OperationActor* destination)
00158 : mitk::StateMachine(type), m_Sender(NULL), m_Destination(destination)
00159 {
00160 m_StartDisplayCoordinate.Fill(0);
00161 m_LastDisplayCoordinate.Fill(0);
00162 m_CurrentDisplayCoordinate.Fill(0);
00163
00164 if(m_Destination==NULL)
00165 m_Destination=this;
00166 }
00167
00168
00169 mitk::DisplayVectorInteractor::~DisplayVectorInteractor()
00170 {
00171 }
00172