Index: Core/Code/Controllers/mitkSlicesCoordinator.cpp =================================================================== --- Core/Code/Controllers/mitkSlicesCoordinator.cpp (revision 21081) +++ Core/Code/Controllers/mitkSlicesCoordinator.cpp (working copy) @@ -19,6 +19,7 @@ #include +#include "mitkBaseRenderer.h" namespace mitk { @@ -61,24 +62,35 @@ } } -void SlicesCoordinator::ResetMouseCursor() +void SlicesCoordinator::ResetMouseCursor( BaseRenderer* renderer ) { if ( m_MouseCursorSet ) { - ApplicationCursor::GetInstance()->PopCursor(); + vtkRenderWindow* vtkWindow = NULL; + if ( renderer != NULL ) + { + vtkWindow = renderer->GetRenderWindow(); + } + ApplicationCursor::GetInstance( )->PopCursor( vtkWindow ); m_MouseCursorSet = false; } } -void SlicesCoordinator::SetMouseCursor( const char *xpm[], int hotspotX, int hotspotY ) +void SlicesCoordinator::SetMouseCursor( BaseRenderer* renderer, const char *xpm[], int hotspotX, int hotspotY ) { + vtkRenderWindow* vtkWindow = NULL; + if ( renderer != NULL ) + { + vtkWindow = renderer->GetRenderWindow(); + } + // Remove previously set mouse cursor if ( m_MouseCursorSet ) { - ApplicationCursor::GetInstance()->PopCursor(); + ApplicationCursor::GetInstance( )->PopCursor( vtkWindow ); } - ApplicationCursor::GetInstance()->PushCursor( xpm, hotspotX, hotspotY ); + ApplicationCursor::GetInstance( )->PushCursor( vtkWindow, xpm, hotspotX, hotspotY ); m_MouseCursorSet = true; } Index: Core/Code/Controllers/mitkSlicesCoordinator.h =================================================================== --- Core/Code/Controllers/mitkSlicesCoordinator.h (revision 21081) +++ Core/Code/Controllers/mitkSlicesCoordinator.h (working copy) @@ -27,6 +27,7 @@ class SliceNavigationController; class Action; class StateEvent; +class BaseRenderer; /** * \brief Coordinates a list of SliceNavigationControllers. @@ -75,7 +76,7 @@ * * Should be used by subclasses and from external application instead * of using QmitkApplicationCursor directly to avoid conflicts. */ - void ResetMouseCursor(); + void ResetMouseCursor( BaseRenderer* renderer ); protected: @@ -89,7 +90,7 @@ * * Use this in subclasses instead of using QmitkApplicationCursor directly. */ - void SetMouseCursor( const char *xpm[], int hotspotX, int hotspotY ); + void SetMouseCursor( BaseRenderer* renderer, const char *xpm[], int hotspotX, int hotspotY ); /** for implementation in subclasses */ virtual void OnSliceControllerAdded(SliceNavigationController* snc); Index: Core/Code/Controllers/mitkSlicesRotator.cpp =================================================================== --- Core/Code/Controllers/mitkSlicesRotator.cpp (revision 21081) +++ Core/Code/Controllers/mitkSlicesRotator.cpp (working copy) @@ -557,12 +557,14 @@ } case AcROTATESTART: { - this->SetMouseCursor( rotate_cursor_xpm, 0, 0 ); + BaseRenderer* renderer = stateEvent->GetEvent()->GetSender(); + this->SetMouseCursor( renderer, rotate_cursor_xpm, 0, 0 ); break; } case AcROTATEEND: { - this->ResetMouseCursor(); + BaseRenderer* renderer = stateEvent->GetEvent()->GetSender(); + this->ResetMouseCursor( renderer ); break; } default: Index: Core/Code/DataManagement/mitkApplicationCursor.cpp =================================================================== --- Core/Code/DataManagement/mitkApplicationCursor.cpp (revision 21081) +++ Core/Code/DataManagement/mitkApplicationCursor.cpp (working copy) @@ -20,7 +20,7 @@ #include mitk::ApplicationCursor* mitk::ApplicationCursor::m_Instance = NULL; -mitk::ApplicationCursorImplementation* mitk::ApplicationCursor::m_Implementation = NULL; +std::map mitk::ApplicationCursor::m_Win2Instance; namespace mitk { @@ -38,42 +38,47 @@ return m_Instance; } -void ApplicationCursor::RegisterImplementation(ApplicationCursorImplementation* implementation) +void ApplicationCursor::RegisterImplementation( + vtkRenderWindow *window, + ApplicationCursorImplementation* implementation) { - m_Implementation = implementation; + m_Win2Instance[ window ] = implementation; } -void ApplicationCursor::PushCursor(const char* XPM[], int hotspotX, int hotspotY) +void ApplicationCursor::PushCursor( vtkRenderWindow *window, const char* XPM[], int hotspotX, int hotspotY) { - if (m_Implementation) + ApplicationCursorImplementation* instance = GetImpl( window ); + if ( instance ) { - m_Implementation->PushCursor(XPM, hotspotX, hotspotY); + instance->PushCursor(XPM, hotspotX, hotspotY); } else { - MITK_ERROR << "in mitk::ApplicationCursor::PushCursor(): no implementation registered." << std::endl; + MITK_ERROR << "in mitk::ApplicationCursor::GetCursorPosition(): no implementation registered." << std::endl; throw std::logic_error("No implementation registered for mitk::ApplicationCursor."); } } -void ApplicationCursor::PopCursor() +void ApplicationCursor::PopCursor( vtkRenderWindow *window ) { - if (m_Implementation) + ApplicationCursorImplementation* instance = GetImpl( window ); + if (instance) { - m_Implementation->PopCursor(); + instance->PopCursor(); } else { - MITK_ERROR << "in mitk::ApplicationCursor::PopCursor(): no implementation registered." << std::endl; + MITK_ERROR << "in mitk::ApplicationCursor::SetCursorPosition(): no implementation registered." << std::endl; throw std::logic_error("No implementation registered for mitk::ApplicationCursor."); } } -const Point2I ApplicationCursor::GetCursorPosition() +const Point2I ApplicationCursor::GetCursorPosition( vtkRenderWindow *window ) { - if (m_Implementation) + ApplicationCursorImplementation* instance = GetImpl( window ); + if (instance) { - return m_Implementation->GetCursorPosition(); + return instance->GetCursorPosition(); } else { @@ -82,11 +87,12 @@ } } -void ApplicationCursor::SetCursorPosition(const Point2I& p) +void ApplicationCursor::SetCursorPosition( vtkRenderWindow *window, const Point2I& p) { - if (m_Implementation) + ApplicationCursorImplementation* instance = GetImpl( window ); + if (instance) { - m_Implementation->SetCursorPosition(p); + instance->SetCursorPosition(p); } else { @@ -95,5 +101,26 @@ } } +ApplicationCursorImplementation* ApplicationCursor::GetImpl( vtkRenderWindow *window ) +{ + ApplicationCursorImplementation* instance = NULL; + std::map::iterator it; + it = m_Win2Instance.find( window ); + + // When there's only one instance, use always NULL as key + // else, use the vtkRenderWindow pointer + if ( it == m_Win2Instance.end( ) ) + { + instance = m_Win2Instance[ NULL ]; + } + else + { + instance = m_Win2Instance[ window ]; + } + + return instance; +} + } // namespace + Index: Core/Code/DataManagement/mitkApplicationCursor.h =================================================================== --- Core/Code/DataManagement/mitkApplicationCursor.h (revision 21081) +++ Core/Code/DataManagement/mitkApplicationCursor.h (working copy) @@ -21,6 +21,8 @@ #include "mitkCommon.h" #include "mitkVector.h" +class vtkRenderWindow; + namespace mitk { @@ -70,31 +72,38 @@ /// This class is a singleton. static ApplicationCursor* GetInstance(); - /// To be called by a toolkit specific ApplicationCursorImplementation. - static void RegisterImplementation(ApplicationCursorImplementation* implementation); + /** To be called by a toolkit specific ApplicationCursorImplementation. + Each window will have its own cursor manager + */ + static void RegisterImplementation( + vtkRenderWindow *window, + ApplicationCursorImplementation* implementation); /// Change the current application cursor - void PushCursor(const char* XPM[], int hotspotX = -1, int hotspotY = -1); + void PushCursor( vtkRenderWindow *window, const char* XPM[], int hotspotX = -1, int hotspotY = -1); /// Restore the previous cursor - void PopCursor(); + void PopCursor( vtkRenderWindow *window ); /// Get absolute mouse position on screen /// \return (-1, -1) if querying mouse position is not possible - const Point2I GetCursorPosition(); + const Point2I GetCursorPosition( vtkRenderWindow *window ); /// Set absolute mouse position on screen - void SetCursorPosition(const Point2I&); + void SetCursorPosition( vtkRenderWindow *window, const Point2I&); protected: + /// + ApplicationCursorImplementation* GetImpl( vtkRenderWindow *window ); + /// Purposely hidden - singleton ApplicationCursor(); private: - static ApplicationCursorImplementation* m_Implementation; + static std::map m_Win2Instance; static ApplicationCursor* m_Instance; }; Index: CoreUI/Qmitk/QmitkApplicationCursor.cpp =================================================================== --- CoreUI/Qmitk/QmitkApplicationCursor.cpp (revision 21081) +++ CoreUI/Qmitk/QmitkApplicationCursor.cpp (working copy) @@ -25,7 +25,7 @@ QmitkApplicationCursor::QmitkApplicationCursor() { - mitk::ApplicationCursor::RegisterImplementation(this); + mitk::ApplicationCursor::RegisterImplementation(NULL, this); } void QmitkApplicationCursor::PushCursor(const char* XPM[], int hotspotX, int hotspotY) Index: CoreUI/Qmitk/QmitkStdMultiWidget.cpp =================================================================== --- CoreUI/Qmitk/QmitkStdMultiWidget.cpp (revision 21081) +++ CoreUI/Qmitk/QmitkStdMultiWidget.cpp (working copy) @@ -1570,12 +1570,12 @@ break; case PLANE_MODE_ROTATION: - m_SlicesRotator->ResetMouseCursor(); + m_SlicesRotator->ResetMouseCursor( NULL ); gi->RemoveListener( m_SlicesRotator ); break; case PLANE_MODE_SWIVEL: - m_SlicesSwiveller->ResetMouseCursor(); + m_SlicesSwiveller->ResetMouseCursor( NULL ); gi->RemoveListener( m_SlicesSwiveller ); break; } @@ -1715,7 +1715,7 @@ // Notify MainTemplate GUI that this mode has been deselected emit WidgetPlaneModeRotation( false ); - m_SlicesRotator->ResetMouseCursor(); + m_SlicesRotator->ResetMouseCursor( NULL ); gi->RemoveListener( m_SlicesRotator ); break; @@ -1723,7 +1723,7 @@ // Notify MainTemplate GUI that this mode has been deselected emit WidgetPlaneModeSwivel( false ); - m_SlicesSwiveller->ResetMouseCursor(); + m_SlicesSwiveller->ResetMouseCursor( NULL ); gi->RemoveListener( m_SlicesSwiveller ); break; } Index: Modules/MitkExt/Interactions/mitkRegionGrowingTool.cpp =================================================================== --- Modules/MitkExt/Interactions/mitkRegionGrowingTool.cpp (revision 21081) +++ Modules/MitkExt/Interactions/mitkRegionGrowingTool.cpp (working copy) @@ -266,7 +266,7 @@ // 3.2.1 Remember Y cursor position and initial seed point //m_ScreenYPositionAtStart = static_cast(positionEvent->GetDisplayPosition()[1]); - m_LastScreenPosition = ApplicationCursor::GetInstance()->GetCursorPosition(); + m_LastScreenPosition = ApplicationCursor::GetInstance()->GetCursorPosition( NULL ); m_ScreenYDifference = 0; m_SeedPointMemoryOffset = projectedPointIn2D[1] * m_OriginalPicSlice->n[0] + projectedPointIn2D[0]; @@ -335,8 +335,8 @@ { ApplicationCursor* cursor = ApplicationCursor::GetInstance(); if (!cursor) return false; - m_ScreenYDifference += cursor->GetCursorPosition()[1] - m_LastScreenPosition[1]; - cursor->SetCursorPosition( m_LastScreenPosition ); + m_ScreenYDifference += cursor->GetCursorPosition(NULL)[1] - m_LastScreenPosition[1]; + cursor->SetCursorPosition( NULL, m_LastScreenPosition ); m_LowerThreshold = m_InitialLowerThreshold + static_cast( m_ScreenYDifference * m_MouseDistanceScaleFactor ); if (m_LowerThreshold < 1) m_LowerThreshold = 1;