diff options
Diffstat (limited to 'toolkit/source/controls')
-rw-r--r-- | toolkit/source/controls/unocontrol.cxx | 55 |
1 files changed, 39 insertions, 16 deletions
diff --git a/toolkit/source/controls/unocontrol.cxx b/toolkit/source/controls/unocontrol.cxx index 6c8435791883..2f41e3f367d4 100644 --- a/toolkit/source/controls/unocontrol.cxx +++ b/toolkit/source/controls/unocontrol.cxx @@ -94,27 +94,50 @@ static Sequence< OUString> lcl_ImplGetPropertyNames( const Reference< XMultiProp return aNames; } - -class VclListenerLock +namespace { -private: - VCLXWindow* m_pLockWindow; - -public: - explicit VclListenerLock( VCLXWindow* _pLockWindow ) - : m_pLockWindow( _pLockWindow ) +VCLXWindow* GetParentSystemWindow(vcl::Window* pWindow) +{ + while (pWindow) { - if ( m_pLockWindow ) - m_pLockWindow->suspendVclEventListening( ); + if (pWindow->IsSystemWindow()) + break; + + pWindow = pWindow->GetParent(); } - ~VclListenerLock() + + uno::Reference<awt::XWindow> xWindow = VCLUnoHelper::GetInterface(pWindow); + return VCLXWindow::GetImplementation(xWindow); +} +} + +VclListenerLock::VclListenerLock(VCLXWindow* _pLockWindow) + : m_pLockWindow(_pLockWindow) +{ + if (m_pLockWindow) + m_pLockWindow->suspendVclEventListening(); +} + +VclListenerLock::VclListenerLock(vcl::Window* pVclWindow, bool bSystemWindow) + : m_pLockWindow(nullptr) +{ + if (bSystemWindow) + m_pLockWindow = GetParentSystemWindow(pVclWindow); + else { - if ( m_pLockWindow ) - m_pLockWindow->resumeVclEventListening( ); + uno::Reference<awt::XWindow> xWindow = VCLUnoHelper::GetInterface(pVclWindow); + m_pLockWindow = VCLXWindow::GetImplementation(xWindow); } - VclListenerLock(const VclListenerLock&) = delete; - VclListenerLock& operator=(const VclListenerLock&) = delete; -}; + + if (m_pLockWindow) + m_pLockWindow->suspendVclEventListening(); +} + +VclListenerLock::~VclListenerLock() +{ + if (m_pLockWindow) + m_pLockWindow->resumeVclEventListening(); +} typedef ::std::map< OUString, sal_Int32 > MapString2Int; struct UnoControl_Data |