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 #include "mitkVtkEventProvider.h"
00019 #include "vtkCallbackCommand.h"
00020 #include "vtkObjectFactory.h"
00021 #include "vtkRenderWindowInteractor.h"
00022 #include "mitkVtkEventAdapter.h"
00023
00024 #include <mbilog.h>
00025
00026 #define VTKEVENTPROVIDER_INFO MBI_INFO("mitk.core.vtkeventprovider")
00027 #define VTKEVENTPROVIDER_WARN MBI_WARN("mitk.core.vtkeventprovider")
00028 #define VTKEVENTPROVIDER_ERROR MBI_ERROR("mitk.core.vtkeventprovider")
00029 #define VTKEVENTPROVIDER_DEBUG MBI_DEBUG("mitk.core.vtkeventprovider")
00030
00031
00032 namespace mitk
00033 {
00034 vtkCxxRevisionMacro(vtkEventProvider, "$Revision: 1.18 $");
00035 vtkStandardNewMacro(vtkEventProvider);
00036 }
00037
00038 mitk::vtkEventProvider::vtkEventProvider()
00039 {
00040
00041 this->Priority = 99999.99;
00042
00043
00044 this->EventCallbackCommand->SetCallback(
00045 vtkEventProvider::ProcessEvents);
00046
00047
00048
00049
00050
00051 this->EventCallbackCommand->SetPassiveObserver(1);
00052
00053
00054 AddInteractionEvent(vtkCommand::MouseMoveEvent);
00055
00056 AddInteractionEvent(vtkCommand::LeftButtonPressEvent);
00057 AddInteractionEvent(vtkCommand::MiddleButtonPressEvent);
00058 AddInteractionEvent(vtkCommand::RightButtonPressEvent);
00059
00060 AddInteractionEvent(vtkCommand::LeftButtonReleaseEvent);
00061 AddInteractionEvent(vtkCommand::MiddleButtonReleaseEvent);
00062 AddInteractionEvent(vtkCommand::RightButtonReleaseEvent);
00063
00064 AddInteractionEvent(vtkCommand::MouseWheelBackwardEvent);
00065 AddInteractionEvent(vtkCommand::MouseWheelForwardEvent);
00066
00067 AddInteractionEvent(vtkCommand::KeyPressEvent);
00068
00069 AddInteractionEvent(vtkCommand::WidgetModifiedEvent);
00070 }
00071
00072 mitk::vtkEventProvider::~vtkEventProvider()
00073 {
00074 this->SetInteractor(0);
00075 }
00076
00077 void mitk::vtkEventProvider::SetMitkRenderWindow(mitk::RenderWindow* renWin)
00078 {
00079 m_RenderWindow = renWin;
00080 }
00081
00082 mitk::RenderWindow* mitk::vtkEventProvider::GetRenderWindow()
00083 {
00084 return m_RenderWindow;
00085 }
00086
00087 void mitk::vtkEventProvider::SetEnabled(int enabling)
00088 {
00089 if ( ! this->Interactor )
00090 {
00091 VTKEVENTPROVIDER_ERROR <<"The interactor must be set prior to enabling/disabling widget";
00092 return;
00093 }
00094
00095 if ( enabling )
00096 {
00097 VTKEVENTPROVIDER_DEBUG << "Enabling widget";
00098
00099 if ( this->Enabled )
00100 {
00101 return;
00102 }
00103
00104 this->Enabled = 1;
00105
00106
00107 vtkRenderWindowInteractor *i = this->Interactor;
00108
00109 InteractionEventsVectorType::iterator it;
00110 for(it = m_InteractionEventsVector.begin(); it != m_InteractionEventsVector.end(); it++)
00111 {
00112 i->AddObserver((vtkCommand::EventIds) (*it), this->EventCallbackCommand,
00113 this->Priority);
00114 }
00115
00116 this->InvokeEvent(vtkCommand::EnableEvent,NULL);
00117 }
00118
00119 else
00120 {
00121 VTKEVENTPROVIDER_DEBUG <<"Disabling widget";
00122
00123 if ( ! this->Enabled )
00124 {
00125 return;
00126 }
00127
00128 this->Enabled = 0;
00129
00130
00131 this->Interactor->RemoveObserver(this->EventCallbackCommand);
00132
00133
00134 this->InvokeEvent(vtkCommand::DisableEvent,NULL);
00135 }
00136 }
00137
00138
00139
00140 void mitk::vtkEventProvider::SetInteractor(vtkRenderWindowInteractor* i)
00141 {
00142 if (i == this->Interactor)
00143 {
00144 return;
00145 }
00146
00147 if (this->Interactor)
00148 this->SetEnabled(0);
00149
00150 this->Interactor = i;
00151
00152 this->Modified();
00153 }
00154
00155
00156 void mitk::vtkEventProvider::ProcessEvents(vtkObject* object,
00157 unsigned long event,
00158 void* clientData,
00159 void* vtkNotUsed(callData))
00160 {
00161
00162 vtkEventProvider* self =
00163 reinterpret_cast<vtkEventProvider *>( clientData );
00164 vtkRenderWindowInteractor* rwi =
00165 static_cast<vtkRenderWindowInteractor *>( object );
00166
00167
00168 mitk::BaseRenderer* baseRenderer = mitk::BaseRenderer::GetInstance(self->GetRenderWindow()->GetVtkRenderWindow());
00169
00170
00171 switch(event)
00172 {
00173
00174 case vtkCommand::KeyPressEvent:
00175 {
00176 VTKEVENTPROVIDER_DEBUG << "key press event";
00177 mitk::KeyEvent mke(mitk::VtkEventAdapter::AdaptKeyEvent(baseRenderer,event,rwi));
00178 self->GetRenderWindow()->keyPressMitkEvent(&mke);
00179 break;
00180 }
00181
00182
00183 case vtkCommand::MouseMoveEvent:
00184 {
00185 VTKEVENTPROVIDER_DEBUG << "mouse move event";
00186 mitk::MouseEvent me(mitk::VtkEventAdapter::AdaptMouseEvent(baseRenderer,event,rwi));
00187 self->GetRenderWindow()->mouseMoveMitkEvent(&me);
00188 break;
00189 }
00190
00191 case vtkCommand::LeftButtonPressEvent:
00192 case vtkCommand::MiddleButtonPressEvent:
00193 case vtkCommand::RightButtonPressEvent:
00194 {
00195 VTKEVENTPROVIDER_DEBUG << "mouse press event";
00196 mitk::MouseEvent me(mitk::VtkEventAdapter::AdaptMouseEvent(baseRenderer,event,rwi));
00197 self->GetRenderWindow()->mousePressMitkEvent(&me);
00198 break;
00199 }
00200
00201 case vtkCommand::LeftButtonReleaseEvent:
00202 case vtkCommand::MiddleButtonReleaseEvent:
00203 case vtkCommand::RightButtonReleaseEvent:
00204 {
00205 VTKEVENTPROVIDER_DEBUG << "mouse release event";
00206 mitk::MouseEvent me(mitk::VtkEventAdapter::AdaptMouseEvent(baseRenderer,event,rwi));
00207 self->GetRenderWindow()->mouseReleaseMitkEvent(&me);
00208 break;
00209 }
00210
00211
00212 case vtkCommand::MouseWheelForwardEvent:
00213 case vtkCommand::MouseWheelBackwardEvent:
00214 {
00215 VTKEVENTPROVIDER_DEBUG << "mouse wheel event";
00216 mitk::WheelEvent we(mitk::VtkEventAdapter::AdaptWheelEvent(baseRenderer,event,rwi));
00217 self->GetRenderWindow()->wheelMitkEvent(&we);
00218 break;
00219 }
00220
00221
00222 case vtkCommand::WidgetModifiedEvent:
00223 {
00224 VTKEVENTPROVIDER_DEBUG << "widget resize event";
00225 self->GetRenderWindow()->resizeMitkEvent(rwi->GetRenderWindow()->GetSize()[0],rwi->GetRenderWindow()->GetSize()[1]);
00226 break;
00227 }
00228
00229 default:
00230 VTKEVENTPROVIDER_INFO << "VTK event not mapped properly.";
00231 break;
00232 }
00233
00234 }
00235
00236 void mitk::vtkEventProvider::RemoveInteractionEvent(unsigned long ievent)
00237 {
00238 InteractionEventsVectorType::iterator it;
00239 if(m_InteractionEventsVector.size() > 0)
00240 {
00241 it = std::find(m_InteractionEventsVector.begin(),m_InteractionEventsVector.end(),ievent);
00242 if(it != m_InteractionEventsVector.end())
00243 {
00244 m_InteractionEventsVector.erase(it);
00245 return;
00246 }
00247 }
00248 }
00249
00250 void mitk::vtkEventProvider::AddInteractionEvent(unsigned long ievent)
00251 {
00252
00253 RemoveInteractionEvent(ievent);
00254
00255 m_InteractionEventsVector.push_back(ievent);
00256
00257 }