1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_forms.hxx" 26*b1cdbd2cSJim Jagielski #include "windowstateguard.hxx" 27*b1cdbd2cSJim Jagielski #include "frm_strings.hxx" 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/ 30*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindowListener2.hpp> 31*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp> 32*b1cdbd2cSJim Jagielski /** === end UNO includes === **/ 33*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx> 34*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h> 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski //........................................................................ 37*b1cdbd2cSJim Jagielski namespace frm 38*b1cdbd2cSJim Jagielski { 39*b1cdbd2cSJim Jagielski //........................................................................ 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski /** === begin UNO using === **/ 42*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::XWindowListener2; 43*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference; 44*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::XWindow2; 45*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::WindowEvent; 46*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::RuntimeException; 47*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::XControlModel; 48*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::XPropertySet; 49*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::EventObject; 50*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::RuntimeException; 51*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY; 52*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Exception; 53*b1cdbd2cSJim Jagielski /** === end UNO using === **/ 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski //==================================================================== 56*b1cdbd2cSJim Jagielski //= WindowStateGuard_Impl 57*b1cdbd2cSJim Jagielski //==================================================================== 58*b1cdbd2cSJim Jagielski typedef ::cppu::WeakImplHelper1 < XWindowListener2 59*b1cdbd2cSJim Jagielski > WindowStateGuard_Impl_Base; 60*b1cdbd2cSJim Jagielski class WindowStateGuard_Impl : public WindowStateGuard_Impl_Base 61*b1cdbd2cSJim Jagielski { 62*b1cdbd2cSJim Jagielski private: 63*b1cdbd2cSJim Jagielski ::osl::Mutex m_aMutex; 64*b1cdbd2cSJim Jagielski Reference< XWindow2 > m_xWindow; 65*b1cdbd2cSJim Jagielski Reference< XPropertySet > m_xModelProps; 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski public: 68*b1cdbd2cSJim Jagielski /** constructs the instance 69*b1cdbd2cSJim Jagielski @param _rxWindow 70*b1cdbd2cSJim Jagielski the window at which to listen. Must not be <NULL/>. 71*b1cdbd2cSJim Jagielski @param _rxModel 72*b1cdbd2cSJim Jagielski the model which acts as the reference for the states to be enforced. Must not be <NULL/>. 73*b1cdbd2cSJim Jagielski */ 74*b1cdbd2cSJim Jagielski WindowStateGuard_Impl( const Reference< XWindow2 >& _rxWindow, const Reference< XPropertySet >& _rxMdelProps ); 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski void dispose(); 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski protected: 79*b1cdbd2cSJim Jagielski // XWindowListener2 80*b1cdbd2cSJim Jagielski virtual void SAL_CALL windowEnabled( const ::com::sun::star::lang::EventObject& e ) throw (::com::sun::star::uno::RuntimeException); 81*b1cdbd2cSJim Jagielski virtual void SAL_CALL windowDisabled( const ::com::sun::star::lang::EventObject& e ) throw (::com::sun::star::uno::RuntimeException); 82*b1cdbd2cSJim Jagielski 83*b1cdbd2cSJim Jagielski // XWindowListener 84*b1cdbd2cSJim Jagielski virtual void SAL_CALL windowResized( const ::com::sun::star::awt::WindowEvent& e ) throw (::com::sun::star::uno::RuntimeException); 85*b1cdbd2cSJim Jagielski virtual void SAL_CALL windowMoved( const ::com::sun::star::awt::WindowEvent& e ) throw (::com::sun::star::uno::RuntimeException); 86*b1cdbd2cSJim Jagielski virtual void SAL_CALL windowShown( const ::com::sun::star::lang::EventObject& e ) throw (::com::sun::star::uno::RuntimeException); 87*b1cdbd2cSJim Jagielski virtual void SAL_CALL windowHidden( const ::com::sun::star::lang::EventObject& e ) throw (::com::sun::star::uno::RuntimeException); 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski // XEventListener 90*b1cdbd2cSJim Jagielski virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim Jagielski private: 93*b1cdbd2cSJim Jagielski /** ensures that the window's Enabled state matches what is described at the model 94*b1cdbd2cSJim Jagielski @precond 95*b1cdbd2cSJim Jagielski our mutex is locked 96*b1cdbd2cSJim Jagielski */ 97*b1cdbd2cSJim Jagielski void impl_ensureEnabledState_nothrow_nolck(); 98*b1cdbd2cSJim Jagielski }; 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- WindowStateGuard_Impl(const Reference<XWindow2> & _rxWindow,const Reference<XPropertySet> & _rxMdelProps)101*b1cdbd2cSJim Jagielski WindowStateGuard_Impl::WindowStateGuard_Impl( const Reference< XWindow2 >& _rxWindow, const Reference< XPropertySet >& _rxMdelProps ) 102*b1cdbd2cSJim Jagielski :m_xWindow( _rxWindow ) 103*b1cdbd2cSJim Jagielski ,m_xModelProps( _rxMdelProps ) 104*b1cdbd2cSJim Jagielski { 105*b1cdbd2cSJim Jagielski if ( !m_xWindow.is() || !m_xModelProps.is() ) 106*b1cdbd2cSJim Jagielski throw RuntimeException(); 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski osl_incrementInterlockedCount( &m_refCount ); 109*b1cdbd2cSJim Jagielski { 110*b1cdbd2cSJim Jagielski m_xWindow->addWindowListener( this ); 111*b1cdbd2cSJim Jagielski } 112*b1cdbd2cSJim Jagielski osl_decrementInterlockedCount( &m_refCount ); 113*b1cdbd2cSJim Jagielski } 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- dispose()116*b1cdbd2cSJim Jagielski void WindowStateGuard_Impl::dispose() 117*b1cdbd2cSJim Jagielski { 118*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 119*b1cdbd2cSJim Jagielski if ( !m_xWindow.is() ) 120*b1cdbd2cSJim Jagielski // already disposed 121*b1cdbd2cSJim Jagielski return; 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski m_xWindow->removeWindowListener( this ); 124*b1cdbd2cSJim Jagielski m_xWindow.clear(); 125*b1cdbd2cSJim Jagielski } 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_ensureEnabledState_nothrow_nolck()128*b1cdbd2cSJim Jagielski void WindowStateGuard_Impl::impl_ensureEnabledState_nothrow_nolck() 129*b1cdbd2cSJim Jagielski { 130*b1cdbd2cSJim Jagielski try 131*b1cdbd2cSJim Jagielski { 132*b1cdbd2cSJim Jagielski Reference< XWindow2 > xWindow; 133*b1cdbd2cSJim Jagielski sal_Bool bEnabled = sal_False; 134*b1cdbd2cSJim Jagielski sal_Bool bShouldBeEnabled = sal_False; 135*b1cdbd2cSJim Jagielski { 136*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 137*b1cdbd2cSJim Jagielski if ( !m_xWindow.is() || !m_xModelProps.is() ) 138*b1cdbd2cSJim Jagielski return; 139*b1cdbd2cSJim Jagielski xWindow = m_xWindow; 140*b1cdbd2cSJim Jagielski bEnabled = xWindow->isEnabled(); 141*b1cdbd2cSJim Jagielski OSL_VERIFY( m_xModelProps->getPropertyValue( PROPERTY_ENABLED ) >>= bShouldBeEnabled ); 142*b1cdbd2cSJim Jagielski } 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski if ( !bShouldBeEnabled && bEnabled && xWindow.is() ) 145*b1cdbd2cSJim Jagielski xWindow->setEnable( sal_False ); 146*b1cdbd2cSJim Jagielski } 147*b1cdbd2cSJim Jagielski catch( const Exception& ) 148*b1cdbd2cSJim Jagielski { 149*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 150*b1cdbd2cSJim Jagielski } 151*b1cdbd2cSJim Jagielski } 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- windowEnabled(const EventObject &)154*b1cdbd2cSJim Jagielski void SAL_CALL WindowStateGuard_Impl::windowEnabled( const EventObject& /*e*/ ) throw (RuntimeException) 155*b1cdbd2cSJim Jagielski { 156*b1cdbd2cSJim Jagielski impl_ensureEnabledState_nothrow_nolck(); 157*b1cdbd2cSJim Jagielski } 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- windowDisabled(const EventObject &)160*b1cdbd2cSJim Jagielski void SAL_CALL WindowStateGuard_Impl::windowDisabled( const EventObject& /*e*/ ) throw (RuntimeException) 161*b1cdbd2cSJim Jagielski { 162*b1cdbd2cSJim Jagielski impl_ensureEnabledState_nothrow_nolck(); 163*b1cdbd2cSJim Jagielski } 164*b1cdbd2cSJim Jagielski 165*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- windowResized(const WindowEvent &)166*b1cdbd2cSJim Jagielski void SAL_CALL WindowStateGuard_Impl::windowResized( const WindowEvent& /*e*/ ) throw (RuntimeException) 167*b1cdbd2cSJim Jagielski { 168*b1cdbd2cSJim Jagielski // not interested in 169*b1cdbd2cSJim Jagielski } 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- windowMoved(const WindowEvent &)172*b1cdbd2cSJim Jagielski void SAL_CALL WindowStateGuard_Impl::windowMoved( const WindowEvent& /*e*/ ) throw (RuntimeException) 173*b1cdbd2cSJim Jagielski { 174*b1cdbd2cSJim Jagielski // not interested in 175*b1cdbd2cSJim Jagielski } 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- windowShown(const EventObject &)178*b1cdbd2cSJim Jagielski void SAL_CALL WindowStateGuard_Impl::windowShown( const EventObject& /*e*/ ) throw (RuntimeException) 179*b1cdbd2cSJim Jagielski { 180*b1cdbd2cSJim Jagielski // not interested in 181*b1cdbd2cSJim Jagielski } 182*b1cdbd2cSJim Jagielski 183*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- windowHidden(const EventObject &)184*b1cdbd2cSJim Jagielski void SAL_CALL WindowStateGuard_Impl::windowHidden( const EventObject& /*e*/ ) throw (RuntimeException) 185*b1cdbd2cSJim Jagielski { 186*b1cdbd2cSJim Jagielski // not interested in 187*b1cdbd2cSJim Jagielski } 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- disposing(const EventObject & Source)190*b1cdbd2cSJim Jagielski void SAL_CALL WindowStateGuard_Impl::disposing( const EventObject& Source ) throw (RuntimeException) 191*b1cdbd2cSJim Jagielski { 192*b1cdbd2cSJim Jagielski OSL_ENSURE( Source.Source == m_xWindow, "WindowStateGuard_Impl::disposing: where does this come from?" ); 193*b1cdbd2cSJim Jagielski (void)Source; 194*b1cdbd2cSJim Jagielski dispose(); 195*b1cdbd2cSJim Jagielski } 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski //==================================================================== 198*b1cdbd2cSJim Jagielski //= WindowStateGuard 199*b1cdbd2cSJim Jagielski //==================================================================== 200*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- WindowStateGuard()201*b1cdbd2cSJim Jagielski WindowStateGuard::WindowStateGuard() 202*b1cdbd2cSJim Jagielski { 203*b1cdbd2cSJim Jagielski } 204*b1cdbd2cSJim Jagielski 205*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- ~WindowStateGuard()206*b1cdbd2cSJim Jagielski WindowStateGuard::~WindowStateGuard() 207*b1cdbd2cSJim Jagielski { 208*b1cdbd2cSJim Jagielski } 209*b1cdbd2cSJim Jagielski 210*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- attach(const Reference<XWindow2> & _rxWindow,const Reference<XControlModel> & _rxModel)211*b1cdbd2cSJim Jagielski void WindowStateGuard::attach( const Reference< XWindow2 >& _rxWindow, const Reference< XControlModel >& _rxModel ) 212*b1cdbd2cSJim Jagielski { 213*b1cdbd2cSJim Jagielski if ( m_pImpl.is() ) 214*b1cdbd2cSJim Jagielski { 215*b1cdbd2cSJim Jagielski m_pImpl->dispose(); 216*b1cdbd2cSJim Jagielski m_pImpl = NULL; 217*b1cdbd2cSJim Jagielski } 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski Reference< XPropertySet > xModelProps( _rxModel, UNO_QUERY ); 220*b1cdbd2cSJim Jagielski OSL_ENSURE( xModelProps.is() || !_rxModel.is(), "WindowStateGuard::attach: a model which is no XPropertySet?" ); 221*b1cdbd2cSJim Jagielski if ( _rxWindow.is() && xModelProps.is() ) 222*b1cdbd2cSJim Jagielski m_pImpl = new WindowStateGuard_Impl( _rxWindow, xModelProps ); 223*b1cdbd2cSJim Jagielski } 224*b1cdbd2cSJim Jagielski 225*b1cdbd2cSJim Jagielski //........................................................................ 226*b1cdbd2cSJim Jagielski } // namespace frm 227*b1cdbd2cSJim Jagielski //........................................................................ 228*b1cdbd2cSJim Jagielski 229