/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" #ifndef _SVTRULERACCESSIBLE_HXX #include #endif #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_ #include #endif #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEEVENTID_HPP_ #include #endif #ifndef _UTL_ACCESSIBLESTATESETHELPER_HXX_ #include #endif #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLESTATETYPE_HPP_ #include #endif #ifndef _COM_SUN_STAR_BEANS_PROPERTYCHANGEEVENT_HPP_ #include #endif #ifndef _COM_SUN_STAR_AWT_XWINDOW_HPP_ #include #endif #ifndef _CPPUHELPER_TYPEPROVIDER_HXX_ #include #endif #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_ #include #endif #ifndef _TOOLKIT_HELPER_CONVERT_HXX_ #include #endif #ifndef _SV_SVAPP_HXX #include #endif #ifndef _OSL_MUTEX_HXX_ #include #endif #ifndef _RTL_UUID_H_ #include #endif #ifndef _TOOLS_DEBUG_HXX #include #endif #ifndef _SV_GEN_HXX #include #endif #include "ruler.hxx" #ifndef COMPHELPER_ACCESSIBLE_EVENT_NOTIFIER #include #endif using namespace ::cppu; using namespace ::osl; using namespace ::rtl; using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::accessibility; DBG_NAME( SvtRulerAccessible ) //===== internal ============================================================ SvtRulerAccessible::SvtRulerAccessible( const uno::Reference< XAccessible >& rxParent, Ruler& rRepr, const OUString& rName ) : SvtRulerAccessible_Base( m_aMutex ), msName( rName ), mxParent( rxParent ), mpRepr( &rRepr ), mnClientId( 0 ) { DBG_CTOR( SvtRulerAccessible, NULL ); } SvtRulerAccessible::~SvtRulerAccessible() { DBG_DTOR( SvtRulerAccessible, NULL ); if( IsAlive() ) { osl_incrementInterlockedCount( &m_refCount ); dispose(); // set mpRepr = NULL & release all childs } } //===== XAccessible ========================================================= uno::Reference< XAccessibleContext > SAL_CALL SvtRulerAccessible::getAccessibleContext( void ) throw( RuntimeException ) { return this; } //===== XAccessibleComponent ================================================ sal_Bool SAL_CALL SvtRulerAccessible::containsPoint( const awt::Point& rPoint ) throw( RuntimeException ) { // no guard -> done in getBounds() // return GetBoundingBox().IsInside( VCLPoint( rPoint ) ); return Rectangle( Point( 0, 0 ), GetBoundingBox().GetSize() ).IsInside( VCLPoint( rPoint ) ); } uno::Reference< XAccessible > SAL_CALL SvtRulerAccessible::getAccessibleAtPoint( const awt::Point& ) throw( RuntimeException ) { ::osl::MutexGuard aGuard( m_aMutex ); ThrowExceptionIfNotAlive(); uno::Reference< XAccessible > xRet; return xRet; } awt::Rectangle SAL_CALL SvtRulerAccessible::getBounds() throw( RuntimeException ) { // no guard -> done in GetBoundingBox() return AWTRectangle( GetBoundingBox() ); } awt::Point SAL_CALL SvtRulerAccessible::getLocation() throw( RuntimeException ) { // no guard -> done in GetBoundingBox() return AWTPoint( GetBoundingBox().TopLeft() ); } awt::Point SAL_CALL SvtRulerAccessible::getLocationOnScreen() throw( RuntimeException ) { // no guard -> done in GetBoundingBoxOnScreen() return AWTPoint( GetBoundingBoxOnScreen().TopLeft() ); } awt::Size SAL_CALL SvtRulerAccessible::getSize() throw( RuntimeException ) { // no guard -> done in GetBoundingBox() return AWTSize( GetBoundingBox().GetSize() ); } sal_Bool SAL_CALL SvtRulerAccessible::isShowing() throw( RuntimeException ) { return sal_True; } sal_Bool SAL_CALL SvtRulerAccessible::isVisible() throw( RuntimeException ) { ::osl::MutexGuard aGuard( m_aMutex ); ThrowExceptionIfNotAlive(); return mpRepr->IsVisible(); } sal_Bool SAL_CALL SvtRulerAccessible::isFocusTraversable() throw( RuntimeException ) { return sal_True; } //===== XAccessibleContext ================================================== sal_Int32 SAL_CALL SvtRulerAccessible::getAccessibleChildCount( void ) throw( RuntimeException ) { ::osl::MutexGuard aGuard( m_aMutex ); ThrowExceptionIfNotAlive(); return 0; } uno::Reference< XAccessible > SAL_CALL SvtRulerAccessible::getAccessibleChild( sal_Int32 ) throw( RuntimeException, lang::IndexOutOfBoundsException ) { uno::Reference< XAccessible > xChild ; return xChild; } uno::Reference< XAccessible > SAL_CALL SvtRulerAccessible::getAccessibleParent( void ) throw( RuntimeException ) { return mxParent; } sal_Int32 SAL_CALL SvtRulerAccessible::getAccessibleIndexInParent( void ) throw( RuntimeException ) { ::osl::MutexGuard aGuard( m_aMutex ); // Use a simple but slow solution for now. Optimize later. // Iterate over all the parent's children and search for this object. if( mxParent.is() ) { uno::Reference< XAccessibleContext > xParentContext( mxParent->getAccessibleContext() ); if( xParentContext.is() ) { sal_Int32 nChildCount = xParentContext->getAccessibleChildCount(); for( sal_Int32 i = 0 ; i < nChildCount ; ++i ) { uno::Reference< XAccessible > xChild( xParentContext->getAccessibleChild( i ) ); if( xChild.get() == ( XAccessible* ) this ) return i; } } } // Return -1 to indicate that this object's parent does not know about the // object. return -1; } sal_Int16 SAL_CALL SvtRulerAccessible::getAccessibleRole( void ) throw( RuntimeException ) { return AccessibleRole::RULER; } OUString SAL_CALL SvtRulerAccessible::getAccessibleDescription( void ) throw( RuntimeException ) { ::osl::MutexGuard aGuard( m_aMutex ); return msDescription; } OUString SAL_CALL SvtRulerAccessible::getAccessibleName( void ) throw( RuntimeException ) { ::osl::MutexGuard aGuard( m_aMutex ); return msName; } /** Return empty uno::Reference to indicate that the relation set is not supported. */ uno::Reference< XAccessibleRelationSet > SAL_CALL SvtRulerAccessible::getAccessibleRelationSet( void ) throw( RuntimeException ) { return uno::Reference< XAccessibleRelationSet >(); } uno::Reference< XAccessibleStateSet > SAL_CALL SvtRulerAccessible::getAccessibleStateSet( void ) throw( RuntimeException ) { ::osl::MutexGuard aGuard( m_aMutex ); utl::AccessibleStateSetHelper* pStateSetHelper = new utl::AccessibleStateSetHelper; if( IsAlive() ) { pStateSetHelper->AddState( AccessibleStateType::ENABLED ); if( isShowing() ) pStateSetHelper->AddState( AccessibleStateType::SHOWING ); if( isVisible() ) pStateSetHelper->AddState( AccessibleStateType::VISIBLE ); if ( mpRepr ) { if ( mpRepr->GetStyle() & WB_HORZ ) pStateSetHelper->AddState( AccessibleStateType::HORIZONTAL ); else pStateSetHelper->AddState( AccessibleStateType::VERTICAL ); } if(pStateSetHelper->contains(AccessibleStateType::FOCUSABLE)) { pStateSetHelper->RemoveState( AccessibleStateType::FOCUSABLE ); } } return pStateSetHelper; } lang::Locale SAL_CALL SvtRulerAccessible::getLocale( void ) throw( IllegalAccessibleComponentStateException, RuntimeException ) { ::osl::MutexGuard aGuard( m_aMutex ); if( mxParent.is() ) { uno::Reference< XAccessibleContext > xParentContext( mxParent->getAccessibleContext() ); if( xParentContext.is() ) return xParentContext->getLocale(); } // No parent. Therefore throw exception to indicate this cluelessness. throw IllegalAccessibleComponentStateException(); } void SAL_CALL SvtRulerAccessible::addEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) throw( RuntimeException ) { if (xListener.is()) { ::osl::MutexGuard aGuard( m_aMutex ); if (!mnClientId) mnClientId = comphelper::AccessibleEventNotifier::registerClient( ); comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener ); } } void SAL_CALL SvtRulerAccessible::removeEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) throw( RuntimeException ) { if (xListener.is()) { ::osl::MutexGuard aGuard( m_aMutex ); sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, xListener ); if ( !nListenerCount ) { // no listeners anymore // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client), // and at least to us not firing any events anymore, in case somebody calls // NotifyAccessibleEvent, again comphelper::AccessibleEventNotifier::revokeClient( mnClientId ); mnClientId = 0; } } } void SAL_CALL SvtRulerAccessible::addFocusListener( const uno::Reference< awt::XFocusListener >& xListener ) throw( RuntimeException ) { if( xListener.is() ) { ::osl::MutexGuard aGuard( m_aMutex ); ThrowExceptionIfNotAlive(); uno::Reference< awt::XWindow > xWindow = VCLUnoHelper::GetInterface( mpRepr ); if( xWindow.is() ) xWindow->addFocusListener( xListener ); } } void SAL_CALL SvtRulerAccessible::removeFocusListener( const uno::Reference< awt::XFocusListener >& xListener ) throw (RuntimeException) { if( xListener.is() ) { ::osl::MutexGuard aGuard( m_aMutex ); ThrowExceptionIfNotAlive(); uno::Reference< awt::XWindow > xWindow = VCLUnoHelper::GetInterface( mpRepr ); if( xWindow.is() ) xWindow->removeFocusListener( xListener ); } } void SAL_CALL SvtRulerAccessible::grabFocus() throw( RuntimeException ) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); ThrowExceptionIfNotAlive(); mpRepr->GrabFocus(); } Any SAL_CALL SvtRulerAccessible::getAccessibleKeyBinding() throw( RuntimeException ) { // here is no implementation, because here are no KeyBindings for every object return Any(); } sal_Int32 SvtRulerAccessible::getForeground( ) throw (::com::sun::star::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); ThrowExceptionIfNotAlive(); return mpRepr->GetControlForeground().GetColor(); } sal_Int32 SvtRulerAccessible::getBackground( ) throw (::com::sun::star::uno::RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); ThrowExceptionIfNotAlive(); return mpRepr->GetControlBackground().GetColor(); } //===== XServiceInfo ======================================================== OUString SAL_CALL SvtRulerAccessible::getImplementationName( void ) throw( RuntimeException ) { return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.ui.SvtRulerAccessible" ) ); } sal_Bool SAL_CALL SvtRulerAccessible::supportsService( const OUString& sServiceName ) throw( RuntimeException ) { ::osl::MutexGuard aGuard( m_aMutex ); // Iterate over all supported service names and return true if on of them // matches the given name. Sequence< OUString > aSupportedServices( getSupportedServiceNames() ); int nLength = aSupportedServices.getLength(); const OUString* pStr = aSupportedServices.getConstArray(); for( int i = nLength ; i ; --i, ++pStr ) { if( sServiceName == *pStr ) return sal_True; } return sal_False; } Sequence< OUString > SAL_CALL SvtRulerAccessible::getSupportedServiceNames( void ) throw( RuntimeException ) { const OUString sServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.accessibility.AccessibleContext" ) ); return Sequence< OUString >( &sServiceName, 1 ); } //===== XTypeProvider ======================================================= Sequence< sal_Int8 > SAL_CALL SvtRulerAccessible::getImplementationId( void ) throw( RuntimeException ) { return getUniqueId(); } //===== internals ======================================================== void SvtRulerAccessible::setName( const OUString& rName ) { msName = rName; } void SvtRulerAccessible::setDescription( const OUString& rDescr ) { msDescription = rDescr; } void SAL_CALL SvtRulerAccessible::disposing() { if( !rBHelper.bDisposed ) { { ::osl::MutexGuard aGuard( m_aMutex ); mpRepr = NULL; // object dies with representation } { ::osl::MutexGuard aGuard( m_aMutex ); // Send a disposing to all listeners. if ( mnClientId ) { comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this ); mnClientId = 0; } mxParent = uno::Reference< XAccessible >(); } } } Rectangle SvtRulerAccessible::GetBoundingBoxOnScreen( void ) throw( RuntimeException ) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); ThrowExceptionIfNotAlive(); //the absolute on screen pixel is wrong //return Rectangle( mpRepr->GetParent()->OutputToScreenPixel( mpRepr->GetPosPixel() ), mpRepr->GetSizePixel() ); return Rectangle( mpRepr->GetParent()->OutputToAbsoluteScreenPixel( mpRepr->GetPosPixel() ), mpRepr->GetSizePixel() ); } Rectangle SvtRulerAccessible::GetBoundingBox( void ) throw( RuntimeException ) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); ThrowExceptionIfNotAlive(); return Rectangle( mpRepr->GetPosPixel(), mpRepr->GetSizePixel() ); } Sequence< sal_Int8 > SvtRulerAccessible::getUniqueId( void ) { static OImplementationId* pId = 0; if( !pId ) { MutexGuard aGuard( Mutex::getGlobalMutex() ); if( !pId) { static OImplementationId aId; pId = &aId; } } return pId->getImplementationId(); } void SvtRulerAccessible::ThrowExceptionIfNotAlive( void ) throw( lang::DisposedException ) { if( IsNotAlive() ) throw lang::DisposedException(); } void SvtRulerAccessible::addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener )throw( com::sun::star::uno::RuntimeException ) { cppu::WeakAggComponentImplHelperBase::addEventListener( xListener ); } void SvtRulerAccessible::removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw( com::sun::star::uno::RuntimeException ) { cppu::WeakAggComponentImplHelperBase::removeEventListener( xListener ); } // -------------------------------------------------------------------------------------------------