comphelper/source/misc/accessiblewrapper.cxx | 888 +++++++++++++-------------- include/comphelper/accessiblewrapper.hxx | 606 +++++++++--------- 2 files changed, 743 insertions(+), 751 deletions(-)
New commits: commit e32b425520d5634f29df6cc05fb192e5114bae17 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Wed May 21 16:30:16 2025 +0200 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Thu May 22 05:52:29 2025 +0200 comphelper a11y: Drop extra indentation level Change-Id: I0e2cb7eb82947036f36f737d5fb9b29376d12365 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185624 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/comphelper/source/misc/accessiblewrapper.cxx b/comphelper/source/misc/accessiblewrapper.cxx index 8d56245740dd..be0548e52fc1 100644 --- a/comphelper/source/misc/accessiblewrapper.cxx +++ b/comphelper/source/misc/accessiblewrapper.cxx @@ -29,596 +29,596 @@ using namespace ::com::sun::star::lang; namespace comphelper { - OWrappedAccessibleChildrenManager::OWrappedAccessibleChildrenManager( const Reference< XComponentContext >& _rxContext ) - :m_xContext( _rxContext ) - ,m_bTransientChildren( true ) - { - } +OWrappedAccessibleChildrenManager::OWrappedAccessibleChildrenManager( const Reference< XComponentContext >& _rxContext ) + :m_xContext( _rxContext ) + ,m_bTransientChildren( true ) +{ +} - OWrappedAccessibleChildrenManager::~OWrappedAccessibleChildrenManager( ) - { - } +OWrappedAccessibleChildrenManager::~OWrappedAccessibleChildrenManager( ) +{ +} - void OWrappedAccessibleChildrenManager::setTransientChildren( bool _bSet ) - { - m_bTransientChildren = _bSet; - } +void OWrappedAccessibleChildrenManager::setTransientChildren( bool _bSet ) +{ + m_bTransientChildren = _bSet; +} - void OWrappedAccessibleChildrenManager::setOwningAccessible( const Reference< XAccessible >& _rxAcc ) - { - OSL_ENSURE( !m_aOwningAccessible.get().is(), "OWrappedAccessibleChildrenManager::setOwningAccessible: to be called only once!" ); - m_aOwningAccessible = WeakReference< XAccessible >( _rxAcc ); - } +void OWrappedAccessibleChildrenManager::setOwningAccessible( const Reference< XAccessible >& _rxAcc ) +{ + OSL_ENSURE( !m_aOwningAccessible.get().is(), "OWrappedAccessibleChildrenManager::setOwningAccessible: to be called only once!" ); + m_aOwningAccessible = WeakReference< XAccessible >( _rxAcc ); +} - void OWrappedAccessibleChildrenManager::removeFromCache( const Reference< XAccessible >& _rxKey ) - { - AccessibleMap::iterator aRemovedPos = m_aChildrenMap.find( _rxKey ); - if ( m_aChildrenMap.end() != aRemovedPos ) - { // it was cached - // remove ourself as event listener - Reference< XComponent > xComp( aRemovedPos->first, UNO_QUERY ); - if( xComp.is() ) - xComp->removeEventListener( this ); - // and remove the entry from the map - m_aChildrenMap.erase( aRemovedPos ); - } +void OWrappedAccessibleChildrenManager::removeFromCache( const Reference< XAccessible >& _rxKey ) +{ + AccessibleMap::iterator aRemovedPos = m_aChildrenMap.find( _rxKey ); + if ( m_aChildrenMap.end() != aRemovedPos ) + { // it was cached + // remove ourself as event listener + Reference< XComponent > xComp( aRemovedPos->first, UNO_QUERY ); + if( xComp.is() ) + xComp->removeEventListener( this ); + // and remove the entry from the map + m_aChildrenMap.erase( aRemovedPos ); } +} - void OWrappedAccessibleChildrenManager::invalidateAll( ) +void OWrappedAccessibleChildrenManager::invalidateAll( ) +{ + // remove as event listener from the map elements + for( const auto& rChild : m_aChildrenMap ) { - // remove as event listener from the map elements - for( const auto& rChild : m_aChildrenMap ) - { - Reference< XComponent > xComp( rChild.first, UNO_QUERY ); - if( xComp.is() ) - xComp->removeEventListener( this ); - } - // clear the map - m_aChildrenMap.clear(); + Reference< XComponent > xComp( rChild.first, UNO_QUERY ); + if( xComp.is() ) + xComp->removeEventListener( this ); } + // clear the map + m_aChildrenMap.clear(); +} - Reference< XAccessible > OWrappedAccessibleChildrenManager::getAccessibleWrapperFor( - const Reference< XAccessible >& _rxKey ) +Reference< XAccessible > OWrappedAccessibleChildrenManager::getAccessibleWrapperFor( + const Reference< XAccessible >& _rxKey ) +{ + rtl::Reference< OAccessibleWrapper > xValue; + + if( !_rxKey.is() ) { - rtl::Reference< OAccessibleWrapper > xValue; + // fprintf( stderr, "It was this path that was crashing stuff " ); + return xValue; + } - if( !_rxKey.is() ) - { - // fprintf( stderr, "It was this path that was crashing stuff " ); - return xValue; - } + // do we have this child in the cache? + AccessibleMap::const_iterator aPos = m_aChildrenMap.find( _rxKey ); + if ( m_aChildrenMap.end() != aPos ) + { + xValue = aPos->second; + } + else + { // not found in the cache, and allowed to create + // -> new wrapper + xValue = new OAccessibleWrapper( m_xContext, _rxKey, m_aOwningAccessible ); - // do we have this child in the cache? - AccessibleMap::const_iterator aPos = m_aChildrenMap.find( _rxKey ); - if ( m_aChildrenMap.end() != aPos ) + // see if we do cache children + if ( !m_bTransientChildren ) { - xValue = aPos->second; - } - else - { // not found in the cache, and allowed to create - // -> new wrapper - xValue = new OAccessibleWrapper( m_xContext, _rxKey, m_aOwningAccessible ); - - // see if we do cache children - if ( !m_bTransientChildren ) + if (!m_aChildrenMap.emplace( _rxKey, xValue ).second) { - if (!m_aChildrenMap.emplace( _rxKey, xValue ).second) - { - OSL_FAIL( - "OWrappedAccessibleChildrenManager::" - "getAccessibleWrapperFor: element was already" - " inserted!" ); - } - - // listen for disposals of inner children - this may happen when the inner context - // is the owner for the inner children (it will dispose these children, and of course - // not our wrapper for these children) - Reference< XComponent > xComp( _rxKey, UNO_QUERY ); - if ( xComp.is() ) - xComp->addEventListener( this ); + OSL_FAIL( + "OWrappedAccessibleChildrenManager::" + "getAccessibleWrapperFor: element was already" + " inserted!" ); } - } - return xValue; + // listen for disposals of inner children - this may happen when the inner context + // is the owner for the inner children (it will dispose these children, and of course + // not our wrapper for these children) + Reference< XComponent > xComp( _rxKey, UNO_QUERY ); + if ( xComp.is() ) + xComp->addEventListener( this ); + } } + return xValue; +} + - void OWrappedAccessibleChildrenManager::dispose() +void OWrappedAccessibleChildrenManager::dispose() +{ + // dispose our children + for( const auto& rChild : m_aChildrenMap ) { - // dispose our children - for( const auto& rChild : m_aChildrenMap ) - { - Reference< XComponent > xComp( rChild.first, UNO_QUERY ); - if( xComp.is() ) - xComp->removeEventListener( this ); - - Reference< XComponent > xContextComponent; - if( rChild.second.is() ) - xContextComponent.set( rChild.second->getContextNoCreate(), - ::css::uno::UNO_QUERY ); - if( xContextComponent.is() ) - xContextComponent->dispose(); - } + Reference< XComponent > xComp( rChild.first, UNO_QUERY ); + if( xComp.is() ) + xComp->removeEventListener( this ); - // clear our children - m_aChildrenMap.clear(); + Reference< XComponent > xContextComponent; + if( rChild.second.is() ) + xContextComponent.set( rChild.second->getContextNoCreate(), + ::css::uno::UNO_QUERY ); + if( xContextComponent.is() ) + xContextComponent->dispose(); } + // clear our children + m_aChildrenMap.clear(); +} - void OWrappedAccessibleChildrenManager::implTranslateChildEventValue( const Any& _rInValue, Any& _rOutValue ) - { - _rOutValue.clear(); - Reference< XAccessible > xChild; - if ( _rInValue >>= xChild ) - _rOutValue <<= getAccessibleWrapperFor( xChild ); - } +void OWrappedAccessibleChildrenManager::implTranslateChildEventValue( const Any& _rInValue, Any& _rOutValue ) +{ + _rOutValue.clear(); + Reference< XAccessible > xChild; + if ( _rInValue >>= xChild ) + _rOutValue <<= getAccessibleWrapperFor( xChild ); +} - void OWrappedAccessibleChildrenManager::translateAccessibleEvent( const AccessibleEventObject& _rEvent, AccessibleEventObject& _rTranslatedEvent ) - { - // just in case we can't translate some of the values: - _rTranslatedEvent.NewValue = _rEvent.NewValue; - _rTranslatedEvent.OldValue = _rEvent.OldValue; - switch ( _rEvent.EventId ) - { - case AccessibleEventId::CHILD: - case AccessibleEventId::ACTIVE_DESCENDANT_CHANGED: - case AccessibleEventId::CONTROLLED_BY_RELATION_CHANGED: - case AccessibleEventId::CONTROLLER_FOR_RELATION_CHANGED: - case AccessibleEventId::LABEL_FOR_RELATION_CHANGED: - case AccessibleEventId::LABELED_BY_RELATION_CHANGED: - case AccessibleEventId::CONTENT_FLOWS_FROM_RELATION_CHANGED: - case AccessibleEventId::CONTENT_FLOWS_TO_RELATION_CHANGED: - // these are events where both the old and the new value contain child references - implTranslateChildEventValue( _rEvent.OldValue, _rTranslatedEvent.OldValue ); - implTranslateChildEventValue( _rEvent.NewValue, _rTranslatedEvent.NewValue ); - break; - - case AccessibleEventId::NAME_CHANGED: - case AccessibleEventId::DESCRIPTION_CHANGED: - case AccessibleEventId::ACTION_CHANGED: - case AccessibleEventId::STATE_CHANGED: - case AccessibleEventId::BOUNDRECT_CHANGED: - case AccessibleEventId::INVALIDATE_ALL_CHILDREN: - case AccessibleEventId::SELECTION_CHANGED: - case AccessibleEventId::VISIBLE_DATA_CHANGED: - case AccessibleEventId::VALUE_CHANGED: - case AccessibleEventId::MEMBER_OF_RELATION_CHANGED: - case AccessibleEventId::CARET_CHANGED: - case AccessibleEventId::TEXT_CHANGED: - case AccessibleEventId::HYPERTEXT_CHANGED: - case AccessibleEventId::TABLE_CAPTION_CHANGED: - case AccessibleEventId::TABLE_COLUMN_DESCRIPTION_CHANGED: - case AccessibleEventId::TABLE_COLUMN_HEADER_CHANGED: - case AccessibleEventId::TABLE_MODEL_CHANGED: - case AccessibleEventId::TABLE_ROW_DESCRIPTION_CHANGED: - case AccessibleEventId::TABLE_ROW_HEADER_CHANGED: - case AccessibleEventId::TABLE_SUMMARY_CHANGED: - // these Ids are also missed: SUB_WINDOW_OF_RELATION_CHANGED & TEXT_ATTRIBUTE_CHANGED - case AccessibleEventId::TEXT_SELECTION_CHANGED: - // nothing to translate - break; - - default: - OSL_FAIL( "OWrappedAccessibleChildrenManager::translateAccessibleEvent: unknown (or unexpected) event id!" ); - break; - } +void OWrappedAccessibleChildrenManager::translateAccessibleEvent( const AccessibleEventObject& _rEvent, AccessibleEventObject& _rTranslatedEvent ) +{ + // just in case we can't translate some of the values: + _rTranslatedEvent.NewValue = _rEvent.NewValue; + _rTranslatedEvent.OldValue = _rEvent.OldValue; + + switch ( _rEvent.EventId ) + { + case AccessibleEventId::CHILD: + case AccessibleEventId::ACTIVE_DESCENDANT_CHANGED: + case AccessibleEventId::CONTROLLED_BY_RELATION_CHANGED: + case AccessibleEventId::CONTROLLER_FOR_RELATION_CHANGED: + case AccessibleEventId::LABEL_FOR_RELATION_CHANGED: + case AccessibleEventId::LABELED_BY_RELATION_CHANGED: + case AccessibleEventId::CONTENT_FLOWS_FROM_RELATION_CHANGED: + case AccessibleEventId::CONTENT_FLOWS_TO_RELATION_CHANGED: + // these are events where both the old and the new value contain child references + implTranslateChildEventValue( _rEvent.OldValue, _rTranslatedEvent.OldValue ); + implTranslateChildEventValue( _rEvent.NewValue, _rTranslatedEvent.NewValue ); + break; + + case AccessibleEventId::NAME_CHANGED: + case AccessibleEventId::DESCRIPTION_CHANGED: + case AccessibleEventId::ACTION_CHANGED: + case AccessibleEventId::STATE_CHANGED: + case AccessibleEventId::BOUNDRECT_CHANGED: + case AccessibleEventId::INVALIDATE_ALL_CHILDREN: + case AccessibleEventId::SELECTION_CHANGED: + case AccessibleEventId::VISIBLE_DATA_CHANGED: + case AccessibleEventId::VALUE_CHANGED: + case AccessibleEventId::MEMBER_OF_RELATION_CHANGED: + case AccessibleEventId::CARET_CHANGED: + case AccessibleEventId::TEXT_CHANGED: + case AccessibleEventId::HYPERTEXT_CHANGED: + case AccessibleEventId::TABLE_CAPTION_CHANGED: + case AccessibleEventId::TABLE_COLUMN_DESCRIPTION_CHANGED: + case AccessibleEventId::TABLE_COLUMN_HEADER_CHANGED: + case AccessibleEventId::TABLE_MODEL_CHANGED: + case AccessibleEventId::TABLE_ROW_DESCRIPTION_CHANGED: + case AccessibleEventId::TABLE_ROW_HEADER_CHANGED: + case AccessibleEventId::TABLE_SUMMARY_CHANGED: + // these Ids are also missed: SUB_WINDOW_OF_RELATION_CHANGED & TEXT_ATTRIBUTE_CHANGED + case AccessibleEventId::TEXT_SELECTION_CHANGED: + // nothing to translate + break; + + default: + OSL_FAIL( "OWrappedAccessibleChildrenManager::translateAccessibleEvent: unknown (or unexpected) event id!" ); + break; + } +} + + +void OWrappedAccessibleChildrenManager::handleChildNotification( const AccessibleEventObject& _rEvent ) +{ + if ( AccessibleEventId::INVALIDATE_ALL_CHILDREN == _rEvent.EventId ) + { // clear our child map + invalidateAll( ); } - - - void OWrappedAccessibleChildrenManager::handleChildNotification( const AccessibleEventObject& _rEvent ) + else if ( AccessibleEventId::CHILD == _rEvent.EventId ) { - if ( AccessibleEventId::INVALIDATE_ALL_CHILDREN == _rEvent.EventId ) - { // clear our child map - invalidateAll( ); - } - else if ( AccessibleEventId::CHILD == _rEvent.EventId ) - { - // check if the removed or replaced element is cached - Reference< XAccessible > xRemoved; - if ( _rEvent.OldValue >>= xRemoved ) - removeFromCache( xRemoved ); - } + // check if the removed or replaced element is cached + Reference< XAccessible > xRemoved; + if ( _rEvent.OldValue >>= xRemoved ) + removeFromCache( xRemoved ); } +} - void SAL_CALL OWrappedAccessibleChildrenManager::disposing( const EventObject& _rSource ) - { - // this should come from one of the inner XAccessible's of our children - Reference< XAccessible > xSource( _rSource.Source, UNO_QUERY ); - AccessibleMap::iterator aDisposedPos = m_aChildrenMap.find( xSource ); +void SAL_CALL OWrappedAccessibleChildrenManager::disposing( const EventObject& _rSource ) +{ + // this should come from one of the inner XAccessible's of our children + Reference< XAccessible > xSource( _rSource.Source, UNO_QUERY ); + AccessibleMap::iterator aDisposedPos = m_aChildrenMap.find( xSource ); #if OSL_DEBUG_LEVEL > 0 - if ( m_aChildrenMap.end() == aDisposedPos ) + if ( m_aChildrenMap.end() == aDisposedPos ) + { + OSL_FAIL( "OWrappedAccessibleChildrenManager::disposing: where did this come from?" ); + // helper for diagnostics + Reference< XAccessible > xOwningAccessible( m_aOwningAccessible ); + Reference< XAccessibleContext > xContext; + try { - OSL_FAIL( "OWrappedAccessibleChildrenManager::disposing: where did this come from?" ); - // helper for diagnostics - Reference< XAccessible > xOwningAccessible( m_aOwningAccessible ); - Reference< XAccessibleContext > xContext; - try - { - if ( xOwningAccessible.is() ) - xContext = xOwningAccessible->getAccessibleContext(); - if ( xContext.is() ) - { - //TODO: do something - //OUString sName = xContext->getAccessibleName(); - //OUString sDescription = xContext->getAccessibleDescription(); - //sal_Int32 nPlaceYourBreakpointHere = 0; - } - } - catch( const Exception& /*e*/ ) + if ( xOwningAccessible.is() ) + xContext = xOwningAccessible->getAccessibleContext(); + if ( xContext.is() ) { - // silent this, it's only diagnostics which failed + //TODO: do something + //OUString sName = xContext->getAccessibleName(); + //OUString sDescription = xContext->getAccessibleDescription(); + //sal_Int32 nPlaceYourBreakpointHere = 0; } } -#endif - if ( m_aChildrenMap.end() != aDisposedPos ) + catch( const Exception& /*e*/ ) { - m_aChildrenMap.erase( aDisposedPos ); + // silent this, it's only diagnostics which failed } } - - OAccessibleWrapper::OAccessibleWrapper( const Reference< XComponentContext >& _rxContext, - const Reference< XAccessible >& _rxInnerAccessible, const Reference< XAccessible >& _rxParentAccessible ) - :OAccessibleWrapper_Base( ) - ,OComponentProxyAggregation( _rxContext, Reference< XComponent >( _rxInnerAccessible, UNO_QUERY ) ) - ,m_xParentAccessible( _rxParentAccessible ) - ,m_xInnerAccessible( _rxInnerAccessible ) +#endif + if ( m_aChildrenMap.end() != aDisposedPos ) { + m_aChildrenMap.erase( aDisposedPos ); } +} + +OAccessibleWrapper::OAccessibleWrapper( const Reference< XComponentContext >& _rxContext, + const Reference< XAccessible >& _rxInnerAccessible, const Reference< XAccessible >& _rxParentAccessible ) + :OAccessibleWrapper_Base( ) + ,OComponentProxyAggregation( _rxContext, Reference< XComponent >( _rxInnerAccessible, UNO_QUERY ) ) + ,m_xParentAccessible( _rxParentAccessible ) + ,m_xInnerAccessible( _rxInnerAccessible ) +{ +} - OAccessibleWrapper::~OAccessibleWrapper( ) +OAccessibleWrapper::~OAccessibleWrapper( ) +{ + if ( !m_rBHelper.bDisposed ) { - if ( !m_rBHelper.bDisposed ) - { - acquire(); // to prevent duplicate dtor calls - dispose(); - } + acquire(); // to prevent duplicate dtor calls + dispose(); } +} - IMPLEMENT_FORWARD_XTYPEPROVIDER2( OAccessibleWrapper, OComponentProxyAggregation, OAccessibleWrapper_Base ) - IMPLEMENT_FORWARD_REFCOUNT( OAccessibleWrapper, OComponentProxyAggregation ) +IMPLEMENT_FORWARD_XTYPEPROVIDER2( OAccessibleWrapper, OComponentProxyAggregation, OAccessibleWrapper_Base ) +IMPLEMENT_FORWARD_REFCOUNT( OAccessibleWrapper, OComponentProxyAggregation ) - Any OAccessibleWrapper::queryInterface( const Type& _rType ) - { - // #111089# instead of the inner XAccessible the proxy XAccessible must be returned - Any aReturn = OAccessibleWrapper_Base::queryInterface( _rType ); - if ( !aReturn.hasValue() ) - aReturn = OComponentProxyAggregation::queryInterface( _rType ); +Any OAccessibleWrapper::queryInterface( const Type& _rType ) +{ + // #111089# instead of the inner XAccessible the proxy XAccessible must be returned + Any aReturn = OAccessibleWrapper_Base::queryInterface( _rType ); + if ( !aReturn.hasValue() ) + aReturn = OComponentProxyAggregation::queryInterface( _rType ); - return aReturn; - } + return aReturn; +} - Reference< XAccessibleContext > OAccessibleWrapper::getContextNoCreate( ) const - { - return m_aContext; - } +Reference< XAccessibleContext > OAccessibleWrapper::getContextNoCreate( ) const +{ + return m_aContext; +} - Reference< XAccessibleContext > SAL_CALL OAccessibleWrapper::getAccessibleContext( ) +Reference< XAccessibleContext > SAL_CALL OAccessibleWrapper::getAccessibleContext( ) +{ + // see if the context is still alive (we cache it) + Reference< XAccessibleContext > xContext = m_aContext; + if ( !xContext.is() ) { - // see if the context is still alive (we cache it) - Reference< XAccessibleContext > xContext = m_aContext; - if ( !xContext.is() ) + // create a new context + Reference< XAccessibleContext > xInnerContext = m_xInnerAccessible->getAccessibleContext( ); + if ( xInnerContext.is() ) { - // create a new context - Reference< XAccessibleContext > xInnerContext = m_xInnerAccessible->getAccessibleContext( ); - if ( xInnerContext.is() ) - { - xContext = new OAccessibleContextWrapper(getComponentContext(), xInnerContext, this, m_xParentAccessible); - // cache it - m_aContext = WeakReference< XAccessibleContext >( xContext ); - } + xContext = new OAccessibleContextWrapper(getComponentContext(), xInnerContext, this, m_xParentAccessible); + // cache it + m_aContext = WeakReference< XAccessibleContext >( xContext ); } - - return xContext; } - OAccessibleContextWrapperHelper::OAccessibleContextWrapperHelper( - const Reference< XComponentContext >& _rxContext, - ::cppu::OBroadcastHelper& _rBHelper, - const Reference< XAccessibleContext >& _rxInnerAccessibleContext, - const Reference< XAccessible >& _rxOwningAccessible, - const Reference< XAccessible >& _rxParentAccessible ) - :OComponentProxyAggregationHelper( _rxContext, _rBHelper ) - ,m_xInnerContext( _rxInnerAccessibleContext ) - ,m_xOwningAccessible( _rxOwningAccessible ) - ,m_xParentAccessible( _rxParentAccessible ) - // initialize the mapper for our children - ,m_xChildMapper( new OWrappedAccessibleChildrenManager( getComponentContext() ) ) - { - // determine if we're allowed to cache children - sal_Int64 aStates = m_xInnerContext->getAccessibleStateSet( ); - m_xChildMapper->setTransientChildren( aStates & AccessibleStateType::MANAGES_DESCENDANTS ); - - m_xChildMapper->setOwningAccessible( m_xOwningAccessible ); - } + return xContext; +} +OAccessibleContextWrapperHelper::OAccessibleContextWrapperHelper( + const Reference< XComponentContext >& _rxContext, + ::cppu::OBroadcastHelper& _rBHelper, + const Reference< XAccessibleContext >& _rxInnerAccessibleContext, + const Reference< XAccessible >& _rxOwningAccessible, + const Reference< XAccessible >& _rxParentAccessible ) + :OComponentProxyAggregationHelper( _rxContext, _rBHelper ) + ,m_xInnerContext( _rxInnerAccessibleContext ) + ,m_xOwningAccessible( _rxOwningAccessible ) + ,m_xParentAccessible( _rxParentAccessible ) + // initialize the mapper for our children + ,m_xChildMapper( new OWrappedAccessibleChildrenManager( getComponentContext() ) ) +{ + // determine if we're allowed to cache children + sal_Int64 aStates = m_xInnerContext->getAccessibleStateSet( ); + m_xChildMapper->setTransientChildren( aStates & AccessibleStateType::MANAGES_DESCENDANTS ); - void OAccessibleContextWrapperHelper::aggregateProxy( oslInterlockedCount& _rRefCount, ::cppu::OWeakObject& _rDelegator ) - { - Reference< XComponent > xInnerComponent( m_xInnerContext, UNO_QUERY ); - OSL_ENSURE( xInnerComponent.is(), "OComponentProxyAggregation::aggregateProxy: accessible is no XComponent!" ); - if ( xInnerComponent.is() ) - componentAggregateProxyFor( xInnerComponent, _rRefCount, _rDelegator ); + m_xChildMapper->setOwningAccessible( m_xOwningAccessible ); +} - // add as event listener to the inner context, because we want to multiplex the AccessibleEvents - osl_atomic_increment( &_rRefCount ); - { - Reference< XAccessibleEventBroadcaster > xBroadcaster( m_xInner, UNO_QUERY ); - if ( xBroadcaster.is() ) - xBroadcaster->addAccessibleEventListener( this ); - } - osl_atomic_decrement( &_rRefCount ); - } +void OAccessibleContextWrapperHelper::aggregateProxy( oslInterlockedCount& _rRefCount, ::cppu::OWeakObject& _rDelegator ) +{ + Reference< XComponent > xInnerComponent( m_xInnerContext, UNO_QUERY ); + OSL_ENSURE( xInnerComponent.is(), "OComponentProxyAggregation::aggregateProxy: accessible is no XComponent!" ); + if ( xInnerComponent.is() ) + componentAggregateProxyFor( xInnerComponent, _rRefCount, _rDelegator ); - OAccessibleContextWrapperHelper::~OAccessibleContextWrapperHelper( ) + // add as event listener to the inner context, because we want to multiplex the AccessibleEvents + osl_atomic_increment( &_rRefCount ); { - OSL_ENSURE( m_rBHelper.bDisposed, "OAccessibleContextWrapperHelper::~OAccessibleContextWrapperHelper: you should ensure (in your dtor) that the object is disposed!" ); + Reference< XAccessibleEventBroadcaster > xBroadcaster( m_xInner, UNO_QUERY ); + if ( xBroadcaster.is() ) + xBroadcaster->addAccessibleEventListener( this ); } + osl_atomic_decrement( &_rRefCount ); +} - Any SAL_CALL OAccessibleContextWrapperHelper::queryInterface( const Type& _rType ) - { - Any aReturn = OComponentProxyAggregationHelper::queryInterface( _rType ); - if ( !aReturn.hasValue() ) - aReturn = OAccessibleContextWrapperHelper_Base::queryInterface( _rType ); - return aReturn; - } +OAccessibleContextWrapperHelper::~OAccessibleContextWrapperHelper( ) +{ + OSL_ENSURE( m_rBHelper.bDisposed, "OAccessibleContextWrapperHelper::~OAccessibleContextWrapperHelper: you should ensure (in your dtor) that the object is disposed!" ); +} - IMPLEMENT_FORWARD_XTYPEPROVIDER2( OAccessibleContextWrapperHelper, OComponentProxyAggregationHelper, OAccessibleContextWrapperHelper_Base ) +Any SAL_CALL OAccessibleContextWrapperHelper::queryInterface( const Type& _rType ) +{ + Any aReturn = OComponentProxyAggregationHelper::queryInterface( _rType ); + if ( !aReturn.hasValue() ) + aReturn = OAccessibleContextWrapperHelper_Base::queryInterface( _rType ); + return aReturn; +} - sal_Int64 OAccessibleContextWrapperHelper::baseGetAccessibleChildCount( ) - { - return m_xInnerContext->getAccessibleChildCount(); - } +IMPLEMENT_FORWARD_XTYPEPROVIDER2( OAccessibleContextWrapperHelper, OComponentProxyAggregationHelper, OAccessibleContextWrapperHelper_Base ) - Reference< XAccessible > OAccessibleContextWrapperHelper::baseGetAccessibleChild( sal_Int64 i ) - { - // get the child of the wrapped component - Reference< XAccessible > xInnerChild = m_xInnerContext->getAccessibleChild( i ); - return m_xChildMapper->getAccessibleWrapperFor( xInnerChild ); - } +sal_Int64 OAccessibleContextWrapperHelper::baseGetAccessibleChildCount( ) +{ + return m_xInnerContext->getAccessibleChildCount(); +} - Reference< XAccessibleRelationSet > OAccessibleContextWrapperHelper::baseGetAccessibleRelationSet( ) - { - return m_xInnerContext->getAccessibleRelationSet(); - // TODO: if this relation set would contain relations to siblings, we would normally need - // to wrap them, too... - } +Reference< XAccessible > OAccessibleContextWrapperHelper::baseGetAccessibleChild( sal_Int64 i ) +{ + // get the child of the wrapped component + Reference< XAccessible > xInnerChild = m_xInnerContext->getAccessibleChild( i ); + return m_xChildMapper->getAccessibleWrapperFor( xInnerChild ); +} - void SAL_CALL OAccessibleContextWrapperHelper::notifyEvent( const AccessibleEventObject& _rEvent ) - { +Reference< XAccessibleRelationSet > OAccessibleContextWrapperHelper::baseGetAccessibleRelationSet( ) +{ + return m_xInnerContext->getAccessibleRelationSet(); + // TODO: if this relation set would contain relations to siblings, we would normally need + // to wrap them, too... +} + + +void SAL_CALL OAccessibleContextWrapperHelper::notifyEvent( const AccessibleEventObject& _rEvent ) +{ #if OSL_DEBUG_LEVEL > 0 - if ( AccessibleEventId::STATE_CHANGED == _rEvent.EventId ) - { - bool bChildTransienceChanged = false; - sal_Int64 nChangeState = 0; - if ( _rEvent.OldValue >>= nChangeState ) - bChildTransienceChanged = bChildTransienceChanged || AccessibleStateType::MANAGES_DESCENDANTS == nChangeState; - if ( _rEvent.NewValue >>= nChangeState ) - bChildTransienceChanged = bChildTransienceChanged || AccessibleStateType::MANAGES_DESCENDANTS == nChangeState; - OSL_ENSURE( !bChildTransienceChanged, "OAccessibleContextWrapperHelper::notifyEvent: MANAGES_DESCENDANTS is not expected to change during runtime!" ); - // if this asserts, then we would need to update our m_bTransientChildren flag here, - // as well as (potentially) our child cache - } + if ( AccessibleEventId::STATE_CHANGED == _rEvent.EventId ) + { + bool bChildTransienceChanged = false; + sal_Int64 nChangeState = 0; + if ( _rEvent.OldValue >>= nChangeState ) + bChildTransienceChanged = bChildTransienceChanged || AccessibleStateType::MANAGES_DESCENDANTS == nChangeState; + if ( _rEvent.NewValue >>= nChangeState ) + bChildTransienceChanged = bChildTransienceChanged || AccessibleStateType::MANAGES_DESCENDANTS == nChangeState; + OSL_ENSURE( !bChildTransienceChanged, "OAccessibleContextWrapperHelper::notifyEvent: MANAGES_DESCENDANTS is not expected to change during runtime!" ); + // if this asserts, then we would need to update our m_bTransientChildren flag here, + // as well as (potentially) our child cache + } #endif - AccessibleEventObject aTranslatedEvent( _rEvent ); + AccessibleEventObject aTranslatedEvent( _rEvent ); - { - ::osl::MutexGuard aGuard( m_rBHelper.rMutex ); - - // translate the event - queryInterface( cppu::UnoType<XInterface>::get() ) >>= aTranslatedEvent.Source; - m_xChildMapper->translateAccessibleEvent( _rEvent, aTranslatedEvent ); + { + ::osl::MutexGuard aGuard( m_rBHelper.rMutex ); - // see if any of these notifications affect our child manager - m_xChildMapper->handleChildNotification( _rEvent ); + // translate the event + queryInterface( cppu::UnoType<XInterface>::get() ) >>= aTranslatedEvent.Source; + m_xChildMapper->translateAccessibleEvent( _rEvent, aTranslatedEvent ); - if ( aTranslatedEvent.NewValue == m_xInner ) - aTranslatedEvent.NewValue <<= aTranslatedEvent.Source; - if ( aTranslatedEvent.OldValue == m_xInner ) - aTranslatedEvent.OldValue <<= aTranslatedEvent.Source; - } + // see if any of these notifications affect our child manager + m_xChildMapper->handleChildNotification( _rEvent ); - notifyTranslatedEvent( aTranslatedEvent ); + if ( aTranslatedEvent.NewValue == m_xInner ) + aTranslatedEvent.NewValue <<= aTranslatedEvent.Source; + if ( aTranslatedEvent.OldValue == m_xInner ) + aTranslatedEvent.OldValue <<= aTranslatedEvent.Source; } + notifyTranslatedEvent( aTranslatedEvent ); +} - void SAL_CALL OAccessibleContextWrapperHelper::dispose() - { - ::osl::MutexGuard aGuard( m_rBHelper.rMutex ); - // stop multiplexing events - Reference< XAccessibleEventBroadcaster > xBroadcaster( m_xInner, UNO_QUERY ); - OSL_ENSURE( xBroadcaster.is(), "OAccessibleContextWrapperHelper::disposing(): inner context is no broadcaster!" ); - if ( xBroadcaster.is() ) - xBroadcaster->removeAccessibleEventListener( this ); +void SAL_CALL OAccessibleContextWrapperHelper::dispose() +{ + ::osl::MutexGuard aGuard( m_rBHelper.rMutex ); - // dispose the child cache/map - m_xChildMapper->dispose(); + // stop multiplexing events + Reference< XAccessibleEventBroadcaster > xBroadcaster( m_xInner, UNO_QUERY ); + OSL_ENSURE( xBroadcaster.is(), "OAccessibleContextWrapperHelper::disposing(): inner context is no broadcaster!" ); + if ( xBroadcaster.is() ) + xBroadcaster->removeAccessibleEventListener( this ); - // let the base class dispose the inner component - OComponentProxyAggregationHelper::dispose(); - } + // dispose the child cache/map + m_xChildMapper->dispose(); + // let the base class dispose the inner component + OComponentProxyAggregationHelper::dispose(); +} - void SAL_CALL OAccessibleContextWrapperHelper::disposing( const EventObject& _rEvent ) - { - // simply disambiguate this - OComponentProxyAggregationHelper::disposing( _rEvent ); - } - IMPLEMENT_FORWARD_XINTERFACE2( OAccessibleContextWrapper, OAccessibleContextWrapper_CBase, OAccessibleContextWrapperHelper ) +void SAL_CALL OAccessibleContextWrapperHelper::disposing( const EventObject& _rEvent ) +{ + // simply disambiguate this + OComponentProxyAggregationHelper::disposing( _rEvent ); +} +IMPLEMENT_FORWARD_XINTERFACE2( OAccessibleContextWrapper, OAccessibleContextWrapper_CBase, OAccessibleContextWrapperHelper ) - IMPLEMENT_FORWARD_XTYPEPROVIDER2( OAccessibleContextWrapper, OAccessibleContextWrapper_CBase, OAccessibleContextWrapperHelper ) +IMPLEMENT_FORWARD_XTYPEPROVIDER2( OAccessibleContextWrapper, OAccessibleContextWrapper_CBase, OAccessibleContextWrapperHelper ) - OAccessibleContextWrapper::OAccessibleContextWrapper( const Reference< XComponentContext >& _rxContext, - const Reference< XAccessibleContext >& _rxInnerAccessibleContext, const Reference< XAccessible >& _rxOwningAccessible, - const Reference< XAccessible >& _rxParentAccessible ) - :OAccessibleContextWrapper_CBase( m_aMutex ) - ,OAccessibleContextWrapperHelper( _rxContext, rBHelper, _rxInnerAccessibleContext, _rxOwningAccessible, _rxParentAccessible ) - ,m_nNotifierClient( 0 ) - { - aggregateProxy( m_refCount, *this ); - } +OAccessibleContextWrapper::OAccessibleContextWrapper( const Reference< XComponentContext >& _rxContext, + const Reference< XAccessibleContext >& _rxInnerAccessibleContext, const Reference< XAccessible >& _rxOwningAccessible, + const Reference< XAccessible >& _rxParentAccessible ) + :OAccessibleContextWrapper_CBase( m_aMutex ) + ,OAccessibleContextWrapperHelper( _rxContext, rBHelper, _rxInnerAccessibleContext, _rxOwningAccessible, _rxParentAccessible ) + ,m_nNotifierClient( 0 ) +{ + aggregateProxy( m_refCount, *this ); +} - OAccessibleContextWrapper::~OAccessibleContextWrapper() - { - } +OAccessibleContextWrapper::~OAccessibleContextWrapper() +{ +} - sal_Int64 SAL_CALL OAccessibleContextWrapper::getAccessibleChildCount( ) - { - return baseGetAccessibleChildCount(); - } +sal_Int64 SAL_CALL OAccessibleContextWrapper::getAccessibleChildCount( ) +{ + return baseGetAccessibleChildCount(); +} - Reference< XAccessible > SAL_CALL OAccessibleContextWrapper::getAccessibleChild( sal_Int64 i ) - { - return baseGetAccessibleChild( i ); - } +Reference< XAccessible > SAL_CALL OAccessibleContextWrapper::getAccessibleChild( sal_Int64 i ) +{ + return baseGetAccessibleChild( i ); +} - Reference< XAccessible > SAL_CALL OAccessibleContextWrapper::getAccessibleParent( ) - { - return m_xParentAccessible; - } +Reference< XAccessible > SAL_CALL OAccessibleContextWrapper::getAccessibleParent( ) +{ + return m_xParentAccessible; +} - sal_Int64 SAL_CALL OAccessibleContextWrapper::getAccessibleIndexInParent( ) - { - return m_xInnerContext->getAccessibleIndexInParent(); - } +sal_Int64 SAL_CALL OAccessibleContextWrapper::getAccessibleIndexInParent( ) +{ + return m_xInnerContext->getAccessibleIndexInParent(); +} - sal_Int16 SAL_CALL OAccessibleContextWrapper::getAccessibleRole( ) - { - return m_xInnerContext->getAccessibleRole(); - } +sal_Int16 SAL_CALL OAccessibleContextWrapper::getAccessibleRole( ) +{ + return m_xInnerContext->getAccessibleRole(); +} - OUString SAL_CALL OAccessibleContextWrapper::getAccessibleDescription( ) - { - return m_xInnerContext->getAccessibleDescription(); - } +OUString SAL_CALL OAccessibleContextWrapper::getAccessibleDescription( ) +{ + return m_xInnerContext->getAccessibleDescription(); +} - OUString SAL_CALL OAccessibleContextWrapper::getAccessibleName( ) - { - return m_xInnerContext->getAccessibleName(); - } +OUString SAL_CALL OAccessibleContextWrapper::getAccessibleName( ) +{ + return m_xInnerContext->getAccessibleName(); +} - Reference< XAccessibleRelationSet > SAL_CALL OAccessibleContextWrapper::getAccessibleRelationSet( ) - { - return baseGetAccessibleRelationSet(); - } +Reference< XAccessibleRelationSet > SAL_CALL OAccessibleContextWrapper::getAccessibleRelationSet( ) +{ + return baseGetAccessibleRelationSet(); +} - sal_Int64 SAL_CALL OAccessibleContextWrapper::getAccessibleStateSet( ) - { - return m_xInnerContext->getAccessibleStateSet(); - } +sal_Int64 SAL_CALL OAccessibleContextWrapper::getAccessibleStateSet( ) +{ + return m_xInnerContext->getAccessibleStateSet(); +} - Locale SAL_CALL OAccessibleContextWrapper::getLocale( ) - { - return m_xInnerContext->getLocale(); - } +Locale SAL_CALL OAccessibleContextWrapper::getLocale( ) +{ + return m_xInnerContext->getLocale(); +} - void OAccessibleContextWrapper::notifyTranslatedEvent( const AccessibleEventObject& _rEvent ) - { - if ( m_nNotifierClient ) - AccessibleEventNotifier::addEvent( m_nNotifierClient, _rEvent ); - } +void OAccessibleContextWrapper::notifyTranslatedEvent( const AccessibleEventObject& _rEvent ) +{ + if ( m_nNotifierClient ) + AccessibleEventNotifier::addEvent( m_nNotifierClient, _rEvent ); +} - void SAL_CALL OAccessibleContextWrapper::addAccessibleEventListener( const Reference< XAccessibleEventListener >& _rxListener ) - { - ::osl::MutexGuard aGuard( m_aMutex ); - if ( !m_nNotifierClient ) - m_nNotifierClient = AccessibleEventNotifier::registerClient( ); - AccessibleEventNotifier::addEventListener( m_nNotifierClient, _rxListener ); - } + +void SAL_CALL OAccessibleContextWrapper::addAccessibleEventListener( const Reference< XAccessibleEventListener >& _rxListener ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + if ( !m_nNotifierClient ) + m_nNotifierClient = AccessibleEventNotifier::registerClient( ); + AccessibleEventNotifier::addEventListener( m_nNotifierClient, _rxListener ); +} - void SAL_CALL OAccessibleContextWrapper::removeAccessibleEventListener( const Reference< XAccessibleEventListener >& _rxListener ) +void SAL_CALL OAccessibleContextWrapper::removeAccessibleEventListener( const Reference< XAccessibleEventListener >& _rxListener ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + if ( m_nNotifierClient ) { - ::osl::MutexGuard aGuard( m_aMutex ); - if ( m_nNotifierClient ) + if ( 0 == AccessibleEventNotifier::removeEventListener( m_nNotifierClient, _rxListener ) ) { - if ( 0 == AccessibleEventNotifier::removeEventListener( m_nNotifierClient, _rxListener ) ) - { - AccessibleEventNotifier::TClientId nId( m_nNotifierClient ); - m_nNotifierClient = 0; - AccessibleEventNotifier::revokeClient( nId ); - } + AccessibleEventNotifier::TClientId nId( m_nNotifierClient ); + m_nNotifierClient = 0; + AccessibleEventNotifier::revokeClient( nId ); } } +} + +void OAccessibleContextWrapper::implDisposing(const css::lang::EventObject* pEvent) +{ + AccessibleEventNotifier::TClientId nClientId( 0 ); - void OAccessibleContextWrapper::implDisposing(const css::lang::EventObject* pEvent) + // --- <mutex lock> ----------------------------------------- { - AccessibleEventNotifier::TClientId nClientId( 0 ); + ::osl::MutexGuard aGuard( m_aMutex ); - // --- <mutex lock> ----------------------------------------- + // prepare notifying our AccessibleListeners + if ( m_nNotifierClient ) { - ::osl::MutexGuard aGuard( m_aMutex ); - - // prepare notifying our AccessibleListeners - if ( m_nNotifierClient ) - { - nClientId = m_nNotifierClient; - m_nNotifierClient = 0; - } + nClientId = m_nNotifierClient; + m_nNotifierClient = 0; } - // --- </mutex lock> ----------------------------------------- + } + // --- </mutex lock> ----------------------------------------- - // let the base class do - if (pEvent) - OAccessibleContextWrapperHelper::disposing(*pEvent); - else - OAccessibleContextWrapperHelper::dispose(); + // let the base class do + if (pEvent) + OAccessibleContextWrapperHelper::disposing(*pEvent); + else + OAccessibleContextWrapperHelper::dispose(); - // notify the disposal - if ( nClientId ) - AccessibleEventNotifier::revokeClientNotifyDisposing( nClientId, *this ); - } + // notify the disposal + if ( nClientId ) + AccessibleEventNotifier::revokeClientNotifyDisposing( nClientId, *this ); +} - void SAL_CALL OAccessibleContextWrapper::disposing() - { - implDisposing(nullptr); - } +void SAL_CALL OAccessibleContextWrapper::disposing() +{ + implDisposing(nullptr); +} - void SAL_CALL OAccessibleContextWrapper::disposing(const css::lang::EventObject& rEvent) - { - assert(rEvent.Source == Reference<XInterface>(m_xInnerContext, UNO_QUERY) - && "OAccessibleContextWrapper::disposing called with event source that's not the " - "wrapped a11y context"); +void SAL_CALL OAccessibleContextWrapper::disposing(const css::lang::EventObject& rEvent) +{ + assert(rEvent.Source == Reference<XInterface>(m_xInnerContext, UNO_QUERY) + && "OAccessibleContextWrapper::disposing called with event source that's not the " + "wrapped a11y context"); - implDisposing(&rEvent); - } + implDisposing(&rEvent); +} } // namespace accessibility diff --git a/include/comphelper/accessiblewrapper.hxx b/include/comphelper/accessiblewrapper.hxx index b3a56646f35c..af18d3ade4e5 100644 --- a/include/comphelper/accessiblewrapper.hxx +++ b/include/comphelper/accessiblewrapper.hxx @@ -45,339 +45,339 @@ namespace com::sun::star::uno { class XComponentContext; } namespace comphelper { - //= OAccessibleWrapper +//= OAccessibleWrapper - class OWrappedAccessibleChildrenManager; +class OWrappedAccessibleChildrenManager; - using OAccessibleWrapper_Base = cppu::ImplHelper1<css::accessibility::XAccessible>; +using OAccessibleWrapper_Base = cppu::ImplHelper1<css::accessibility::XAccessible>; - /** a class which aggregates a proxy for an XAccessible, and wrapping the context returned by this - XAccessible. +/** a class which aggregates a proxy for an XAccessible, and wrapping the context returned by this + XAccessible. +*/ +class UNLESS_MERGELIBS_MORE(COMPHELPER_DLLPUBLIC) OAccessibleWrapper final : public OAccessibleWrapper_Base + ,public OComponentProxyAggregation + +{ +private: + css::uno::Reference< css::accessibility::XAccessible > + m_xParentAccessible; + css::uno::WeakReference< css::accessibility::XAccessibleContext > + m_aContext; + css::uno::Reference< css::accessibility::XAccessible > + m_xInnerAccessible; + +public: + /** ctor + @param _rxContext + a service factory + + @param _rxInnerAccessible + the object to wrap + + @param _rxParentAccessible + The XAccessible which is our parent */ - class UNLESS_MERGELIBS_MORE(COMPHELPER_DLLPUBLIC) OAccessibleWrapper final : public OAccessibleWrapper_Base - ,public OComponentProxyAggregation + OAccessibleWrapper( + const css::uno::Reference< css::uno::XComponentContext >& _rxContext, + const css::uno::Reference< css::accessibility::XAccessible >& _rxInnerAccessible, + const css::uno::Reference< css::accessibility::XAccessible >& _rxParentAccessible + ); + DECLARE_XINTERFACE() + DECLARE_XTYPEPROVIDER() - { - private: - css::uno::Reference< css::accessibility::XAccessible > - m_xParentAccessible; - css::uno::WeakReference< css::accessibility::XAccessibleContext > - m_aContext; - css::uno::Reference< css::accessibility::XAccessible > - m_xInnerAccessible; + // returns the context without creating it + css::uno::Reference< css::accessibility::XAccessibleContext > + getContextNoCreate( ) const; - public: - /** ctor - @param _rxContext - a service factory +protected: + virtual css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL + getAccessibleContext( ) override final; - @param _rxInnerAccessible - the object to wrap +protected: + virtual ~OAccessibleWrapper( ) override; - @param _rxParentAccessible - The XAccessible which is our parent - */ - OAccessibleWrapper( - const css::uno::Reference< css::uno::XComponentContext >& _rxContext, - const css::uno::Reference< css::accessibility::XAccessible >& _rxInnerAccessible, - const css::uno::Reference< css::accessibility::XAccessible >& _rxParentAccessible - ); - DECLARE_XINTERFACE() - DECLARE_XTYPEPROVIDER() +private: + OAccessibleWrapper( const OAccessibleWrapper& ) = delete; + OAccessibleWrapper& operator=( const OAccessibleWrapper& ) = delete; +}; - // returns the context without creating it - css::uno::Reference< css::accessibility::XAccessibleContext > - getContextNoCreate( ) const; - protected: - virtual css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL - getAccessibleContext( ) override final; +//= OAccessibleContextWrapperHelper - protected: - virtual ~OAccessibleWrapper( ) override; - private: - OAccessibleWrapper( const OAccessibleWrapper& ) = delete; - OAccessibleWrapper& operator=( const OAccessibleWrapper& ) = delete; - }; +typedef ::cppu::ImplHelper1 < css::accessibility::XAccessibleEventListener + > OAccessibleContextWrapperHelper_Base; +/** Helper for wrapping an XAccessibleContext by aggregating a proxy for it. - //= OAccessibleContextWrapperHelper + <p>This class does not have own ref counting. In addition, it does not implement + the XAccessibleContext interface, but provides all the methods from this interface + which must be implemented using the inner context (such as getAccessibleChild*).</p> + <p>Children of the aggregated XAccessibleContext are wrapped, too.</p> - typedef ::cppu::ImplHelper1 < css::accessibility::XAccessibleEventListener - > OAccessibleContextWrapperHelper_Base; + <p>AccessibleEvents fired by the inner context are multiplexed, especially, any references to + children in such events are translated. This means that even in such events, no un-wrapped object + will ever leave this class - if the aggregated context notifies a child event, the child passed + to the event is wrapped</p> - /** Helper for wrapping an XAccessibleContext by aggregating a proxy for it. + @seealso OAccessibleContextWrapper +*/ +class UNLESS_MERGELIBS_MORE(COMPHELPER_DLLPUBLIC) OAccessibleContextWrapperHelper + :private OComponentProxyAggregationHelper + ,public OAccessibleContextWrapperHelper_Base +{ +protected: + /// the context we're wrapping (properly typed, in opposite to OComponentProxyAggregationHelper::m_xInner) + css::uno::Reference< css::accessibility::XAccessibleContext > + m_xInnerContext; + /// the XAccessible which created this context + css::uno::Reference< css::accessibility::XAccessible > + m_xOwningAccessible; + /// the XAccessible which is to be returned in getAccessibleParent + css::uno::Reference< css::accessibility::XAccessible > + m_xParentAccessible; + + rtl::Reference<OWrappedAccessibleChildrenManager> m_xChildMapper; // for mapping children from our inner context to our callers + +protected: + /** ctor + + @param _rxContext + a service factory + + @param _rxInnerAccessibleContext + the object to wrap + + @param _rxOwningAccessible + The XAccessible which created this object. This is necessary because children + of our wrapped context need to be wrapped, too, and if they're asked for a parent, + they of course should return the proper parent<br/> + The object will be held with a hard reference + + @param _rxParentAccessible + The XAccessible to return in the getAccessibleParent call + */ + OAccessibleContextWrapperHelper( + const css::uno::Reference< css::uno::XComponentContext >& _rxContext, + ::cppu::OBroadcastHelper& _rBHelper, + const css::uno::Reference< css::accessibility::XAccessibleContext >& _rxInnerAccessibleContext, + const css::uno::Reference< css::accessibility::XAccessible >& _rxOwningAccessible, + const css::uno::Reference< css::accessibility::XAccessible >& _rxParentAccessible + ); + + /// to be called from within your ctor - does the aggregation of a proxy for m_xInnerContext + void aggregateProxy( + oslInterlockedCount& _rRefCount, + ::cppu::OWeakObject& _rDelegator + ); + +protected: + // XInterface + css::uno::Any SAL_CALL queryInterface( const css::uno::Type& _rType ) override; + + // XTypeProvider + DECLARE_XTYPEPROVIDER( ) + + // XAccessibleContext + /// @throws css::uno::RuntimeException + sal_Int64 baseGetAccessibleChildCount( ); + /// @throws css::lang::IndexOutOfBoundsException + /// @throws css::uno::RuntimeException + css::uno::Reference< css::accessibility::XAccessible > baseGetAccessibleChild( sal_Int64 i ); + /// @throws css::uno::RuntimeException + css::uno::Reference< css::accessibility::XAccessibleRelationSet > baseGetAccessibleRelationSet( ); + + // XAccessibleEventListener + virtual void SAL_CALL notifyEvent( const css::accessibility::AccessibleEventObject& aEvent ) override final; + + // XEventListener + virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; + + // XComponent/OComponentProxyAggregationHelper + virtual void SAL_CALL dispose() override; + + // own overridables + /** notify an accessible event which has been translated (if necessary) + + <p>Usually, you derive your class from both OAccessibleContextWrapperHelper and XAccessibleEventBroadcaster, + and simply call all your XAccessibleEventListener with the given event.</p> + + <p>The mutex of the BroadcastHelper passed to the instance's ctor is <em>not</em> locked when calling + into this method</p> + + @throws css::uno::RuntimeException + */ + virtual void notifyTranslatedEvent( const css::accessibility::AccessibleEventObject& _rEvent ) = 0; - <p>This class does not have own ref counting. In addition, it does not implement - the XAccessibleContext interface, but provides all the methods from this interface - which must be implemented using the inner context (such as getAccessibleChild*).</p> +protected: + virtual ~OAccessibleContextWrapperHelper( ) override; - <p>Children of the aggregated XAccessibleContext are wrapped, too.</p> + OAccessibleContextWrapperHelper(const OAccessibleContextWrapperHelper&) = delete; + OAccessibleContextWrapperHelper& operator=(const OAccessibleContextWrapperHelper&) = delete; +}; - <p>AccessibleEvents fired by the inner context are multiplexed, especially, any references to - children in such events are translated. This means that even in such events, no un-wrapped object - will ever leave this class - if the aggregated context notifies a child event, the child passed - to the event is wrapped</p> - @seealso OAccessibleContextWrapper - */ - class UNLESS_MERGELIBS_MORE(COMPHELPER_DLLPUBLIC) OAccessibleContextWrapperHelper - :private OComponentProxyAggregationHelper - ,public OAccessibleContextWrapperHelper_Base - { - protected: - /// the context we're wrapping (properly typed, in opposite to OComponentProxyAggregationHelper::m_xInner) - css::uno::Reference< css::accessibility::XAccessibleContext > - m_xInnerContext; - /// the XAccessible which created this context - css::uno::Reference< css::accessibility::XAccessible > - m_xOwningAccessible; - /// the XAccessible which is to be returned in getAccessibleParent - css::uno::Reference< css::accessibility::XAccessible > - m_xParentAccessible; - - rtl::Reference<OWrappedAccessibleChildrenManager> m_xChildMapper; // for mapping children from our inner context to our callers - - protected: - /** ctor - - @param _rxContext - a service factory - - @param _rxInnerAccessibleContext - the object to wrap - - @param _rxOwningAccessible - The XAccessible which created this object. This is necessary because children - of our wrapped context need to be wrapped, too, and if they're asked for a parent, - they of course should return the proper parent<br/> - The object will be held with a hard reference - - @param _rxParentAccessible - The XAccessible to return in the getAccessibleParent call - */ - OAccessibleContextWrapperHelper( - const css::uno::Reference< css::uno::XComponentContext >& _rxContext, - ::cppu::OBroadcastHelper& _rBHelper, - const css::uno::Reference< css::accessibility::XAccessibleContext >& _rxInnerAccessibleContext, - const css::uno::Reference< css::accessibility::XAccessible >& _rxOwningAccessible, - const css::uno::Reference< css::accessibility::XAccessible >& _rxParentAccessible - ); - - /// to be called from within your ctor - does the aggregation of a proxy for m_xInnerContext - void aggregateProxy( - oslInterlockedCount& _rRefCount, - ::cppu::OWeakObject& _rDelegator - ); - - protected: - // XInterface - css::uno::Any SAL_CALL queryInterface( const css::uno::Type& _rType ) override; - - // XTypeProvider - DECLARE_XTYPEPROVIDER( ) - - // XAccessibleContext - /// @throws css::uno::RuntimeException - sal_Int64 baseGetAccessibleChildCount( ); - /// @throws css::lang::IndexOutOfBoundsException - /// @throws css::uno::RuntimeException - css::uno::Reference< css::accessibility::XAccessible > baseGetAccessibleChild( sal_Int64 i ); - /// @throws css::uno::RuntimeException - css::uno::Reference< css::accessibility::XAccessibleRelationSet > baseGetAccessibleRelationSet( ); - - // XAccessibleEventListener - virtual void SAL_CALL notifyEvent( const css::accessibility::AccessibleEventObject& aEvent ) override final; - - // XEventListener - virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; - - // XComponent/OComponentProxyAggregationHelper - virtual void SAL_CALL dispose() override; - - // own overridables - /** notify an accessible event which has been translated (if necessary) - - <p>Usually, you derive your class from both OAccessibleContextWrapperHelper and XAccessibleEventBroadcaster, - and simply call all your XAccessibleEventListener with the given event.</p> - - <p>The mutex of the BroadcastHelper passed to the instance's ctor is <em>not</em> locked when calling - into this method</p> - - @throws css::uno::RuntimeException - */ - virtual void notifyTranslatedEvent( const css::accessibility::AccessibleEventObject& _rEvent ) = 0; - - protected: - virtual ~OAccessibleContextWrapperHelper( ) override; - - OAccessibleContextWrapperHelper(const OAccessibleContextWrapperHelper&) = delete; - OAccessibleContextWrapperHelper& operator=(const OAccessibleContextWrapperHelper&) = delete; - }; - - - //= OAccessibleContextWrapper - - typedef ::cppu::WeakComponentImplHelper< css::accessibility::XAccessibleEventBroadcaster - , css::accessibility::XAccessibleContext - > OAccessibleContextWrapper_CBase; - - class UNLESS_MERGELIBS_MORE(COMPHELPER_DLLPUBLIC) OAccessibleContextWrapper final - :public cppu::BaseMutex - ,public OAccessibleContextWrapper_CBase - ,public OAccessibleContextWrapperHelper - { - private: - ::comphelper::AccessibleEventNotifier::TClientId m_nNotifierClient; // for notifying AccessibleEvents - - public: - /** ctor - - @param _rxContext - a service factory - - @param _rxInnerAccessibleContext - the object to wrap - - @param _rxOwningAccessible - The XAccessible which created this object. This is necessary because children - of our wrapped context need to be wrapped, too, and if they're asked for a parent, - they of course should return the proper parent<br/> - The object will be held with a hard reference - - @param _rxParentAccessible - The XAccessible to return in the getAccessibleParent call - */ - OAccessibleContextWrapper( - const css::uno::Reference< css::uno::XComponentContext >& _rxContext, - const css::uno::Reference< css::accessibility::XAccessibleContext >& _rxInnerAccessibleContext, - const css::uno::Reference< css::accessibility::XAccessible >& _rxOwningAccessible, - const css::uno::Reference< css::accessibility::XAccessible >& _rxParentAccessible - ); - - // XInterface - DECLARE_XINTERFACE( ) - // XTypeProvider - DECLARE_XTYPEPROVIDER( ) - - // XAccessibleContext - virtual sal_Int64 SAL_CALL getAccessibleChildCount( ) override final; - virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int64 i ) override final; - virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) override final; - virtual sal_Int64 SAL_CALL getAccessibleIndexInParent( ) override; - virtual sal_Int16 SAL_CALL getAccessibleRole( ) override final; - virtual OUString SAL_CALL getAccessibleDescription( ) override final; - virtual OUString SAL_CALL getAccessibleName( ) override final; - virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) override final; - virtual sal_Int64 SAL_CALL getAccessibleStateSet( ) override final; - virtual css::lang::Locale SAL_CALL getLocale( ) override final; +//= OAccessibleContextWrapper - // XAccessibleEventBroadcaster - virtual void SAL_CALL addAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override final; - virtual void SAL_CALL removeAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override final; +typedef ::cppu::WeakComponentImplHelper< css::accessibility::XAccessibleEventBroadcaster + , css::accessibility::XAccessibleContext + > OAccessibleContextWrapper_CBase; - // OAccessibleContextWrapper - virtual void notifyTranslatedEvent( const css::accessibility::AccessibleEventObject& _rEvent ) override final; +class UNLESS_MERGELIBS_MORE(COMPHELPER_DLLPUBLIC) OAccessibleContextWrapper final + :public cppu::BaseMutex + ,public OAccessibleContextWrapper_CBase + ,public OAccessibleContextWrapperHelper +{ +private: + ::comphelper::AccessibleEventNotifier::TClientId m_nNotifierClient; // for notifying AccessibleEvents - // helper method for both 'disposing' methods - void implDisposing(const css::lang::EventObject* pEvent); +public: + /** ctor - // OComponentHelper - void SAL_CALL disposing() override final; + @param _rxContext + a service factory - // XAccessibleEventListener - virtual void SAL_CALL disposing(const css::lang::EventObject& rEvent) override final; + @param _rxInnerAccessibleContext + the object to wrap - protected: - virtual ~OAccessibleContextWrapper() override; + @param _rxOwningAccessible + The XAccessible which created this object. This is necessary because children + of our wrapped context need to be wrapped, too, and if they're asked for a parent, + they of course should return the proper parent<br/> + The object will be held with a hard reference - private: - OAccessibleContextWrapper( const OAccessibleContextWrapper& ) = delete; - OAccessibleContextWrapper& operator=( const OAccessibleContextWrapper& ) = delete; - }; + @param _rxParentAccessible + The XAccessible to return in the getAccessibleParent call + */ + OAccessibleContextWrapper( + const css::uno::Reference< css::uno::XComponentContext >& _rxContext, + const css::uno::Reference< css::accessibility::XAccessibleContext >& _rxInnerAccessibleContext, + const css::uno::Reference< css::accessibility::XAccessible >& _rxOwningAccessible, + const css::uno::Reference< css::accessibility::XAccessible >& _rxParentAccessible + ); + + // XInterface + DECLARE_XINTERFACE( ) + // XTypeProvider + DECLARE_XTYPEPROVIDER( ) + + // XAccessibleContext + virtual sal_Int64 SAL_CALL getAccessibleChildCount( ) override final; + virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int64 i ) override final; + virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) override final; + virtual sal_Int64 SAL_CALL getAccessibleIndexInParent( ) override; + virtual sal_Int16 SAL_CALL getAccessibleRole( ) override final; + virtual OUString SAL_CALL getAccessibleDescription( ) override final; + virtual OUString SAL_CALL getAccessibleName( ) override final; + virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet( ) override final; + virtual sal_Int64 SAL_CALL getAccessibleStateSet( ) override final; + virtual css::lang::Locale SAL_CALL getLocale( ) override final; + + // XAccessibleEventBroadcaster + virtual void SAL_CALL addAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override final; + virtual void SAL_CALL removeAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override final; + + // OAccessibleContextWrapper + virtual void notifyTranslatedEvent( const css::accessibility::AccessibleEventObject& _rEvent ) override final; + + // helper method for both 'disposing' methods + void implDisposing(const css::lang::EventObject* pEvent); + + // OComponentHelper + void SAL_CALL disposing() override final; + + // XAccessibleEventListener + virtual void SAL_CALL disposing(const css::lang::EventObject& rEvent) override final; + +protected: + virtual ~OAccessibleContextWrapper() override; + +private: + OAccessibleContextWrapper( const OAccessibleContextWrapper& ) = delete; + OAccessibleContextWrapper& operator=( const OAccessibleContextWrapper& ) = delete; +}; + + +//= OWrappedAccessibleChildrenManager + + +typedef ::std::map < css::uno::Reference< css::accessibility::XAccessible > + , rtl::Reference< comphelper::OAccessibleWrapper > + > AccessibleMap; + // TODO: think about if we should hold these objects weak + +typedef ::cppu::WeakImplHelper< css::lang::XEventListener + > OWrappedAccessibleChildrenManager_Base; +/** manages wrapping XAccessible's to XAccessible's +*/ +class UNLESS_MERGELIBS(COMPHELPER_DLLPUBLIC) OWrappedAccessibleChildrenManager final : public OWrappedAccessibleChildrenManager_Base +{ + css::uno::Reference< css::uno::XComponentContext > + m_xContext; + css::uno::WeakReference< css::accessibility::XAccessible > + m_aOwningAccessible; // the XAccessible which belongs to the XAccessibleContext which we work for + AccessibleMap m_aChildrenMap; // for caching children + bool m_bTransientChildren; // are we prohibited to cache our children? + +public: + /// ctor + OWrappedAccessibleChildrenManager( + const css::uno::Reference< css::uno::XComponentContext >& _rxContext + ); + + /** specifies if the children are to be considered transient (i.e.: not cached) + <p>to be called only once per lifetime</p> + */ + void setTransientChildren( bool _bSet ); + /** sets the XAccessible which belongs to the XAccessibleContext which we work for + <p>to be called only once per lifetime</p> + */ + void setOwningAccessible( const css::uno::Reference< css::accessibility::XAccessible >& _rxAcc ); - //= OWrappedAccessibleChildrenManager + /// retrieves a wrapper for the given accessible + css::uno::Reference< css::accessibility::XAccessible > + getAccessibleWrapperFor( + const css::uno::Reference< css::accessibility::XAccessible >& _rxKey + ); + /// erases the given key from the map (if it is present there) + void removeFromCache( const css::uno::Reference< css::accessibility::XAccessible >& _rxKey ); - typedef ::std::map < css::uno::Reference< css::accessibility::XAccessible > - , rtl::Reference< comphelper::OAccessibleWrapper > - > AccessibleMap; - // TODO: think about if we should hold these objects weak - - typedef ::cppu::WeakImplHelper< css::lang::XEventListener - > OWrappedAccessibleChildrenManager_Base; - /** manages wrapping XAccessible's to XAccessible's + /// invalidates (i.e. empties) the map + void invalidateAll( ); + + /** disposes (i.e. clears) the manager + + <p>Note that the XAccessibleContext's of the mapped XAccessible objects are disposed, too.</p> + */ + void dispose(); + + /** handles a notification as got from the parent of the children we're managing + <p>This applies only to the notifications which have a direct impact on our map.</p> + */ + void handleChildNotification( const css::accessibility::AccessibleEventObject& _rEvent ); + + /** translates events as got from the parent of the children we're managing + <p>This applies only to the notifications which deal with child objects which we manage.</p> */ - class UNLESS_MERGELIBS(COMPHELPER_DLLPUBLIC) OWrappedAccessibleChildrenManager final : public OWrappedAccessibleChildrenManager_Base - { - css::uno::Reference< css::uno::XComponentContext > - m_xContext; - css::uno::WeakReference< css::accessibility::XAccessible > - m_aOwningAccessible; // the XAccessible which belongs to the XAccessibleContext which we work for - AccessibleMap m_aChildrenMap; // for caching children - bool m_bTransientChildren; // are we prohibited to cache our children? - - public: - /// ctor - OWrappedAccessibleChildrenManager( - const css::uno::Reference< css::uno::XComponentContext >& _rxContext - ); - - /** specifies if the children are to be considered transient (i.e.: not cached) - <p>to be called only once per lifetime</p> - */ - void setTransientChildren( bool _bSet ); - - /** sets the XAccessible which belongs to the XAccessibleContext which we work for - <p>to be called only once per lifetime</p> - */ - void setOwningAccessible( const css::uno::Reference< css::accessibility::XAccessible >& _rxAcc ); - - /// retrieves a wrapper for the given accessible - css::uno::Reference< css::accessibility::XAccessible > - getAccessibleWrapperFor( - const css::uno::Reference< css::accessibility::XAccessible >& _rxKey - ); - - /// erases the given key from the map (if it is present there) - void removeFromCache( const css::uno::Reference< css::accessibility::XAccessible >& _rxKey ); - - /// invalidates (i.e. empties) the map - void invalidateAll( ); - - /** disposes (i.e. clears) the manager - - <p>Note that the XAccessibleContext's of the mapped XAccessible objects are disposed, too.</p> - */ - void dispose(); - - /** handles a notification as got from the parent of the children we're managing - <p>This applies only to the notifications which have a direct impact on our map.</p> - */ - void handleChildNotification( const css::accessibility::AccessibleEventObject& _rEvent ); - - /** translates events as got from the parent of the children we're managing - <p>This applies only to the notifications which deal with child objects which we manage.</p> - */ - void translateAccessibleEvent( - const css::accessibility::AccessibleEventObject& _rEvent, - css::accessibility::AccessibleEventObject& _rTranslatedEvent - ); - - private: - // XEventListener - virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; - - void implTranslateChildEventValue( const css::uno::Any& _rInValue, css::uno::Any& _rOutValue ); - - virtual ~OWrappedAccessibleChildrenManager( ) override; - - OWrappedAccessibleChildrenManager( const OWrappedAccessibleChildrenManager& ) = delete; - OWrappedAccessibleChildrenManager& operator=( const OWrappedAccessibleChildrenManager& ) = delete; - }; + void translateAccessibleEvent( + const css::accessibility::AccessibleEventObject& _rEvent, + css::accessibility::AccessibleEventObject& _rTranslatedEvent + ); + +private: + // XEventListener + virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; + + void implTranslateChildEventValue( const css::uno::Any& _rInValue, css::uno::Any& _rOutValue ); + + virtual ~OWrappedAccessibleChildrenManager( ) override; + + OWrappedAccessibleChildrenManager( const OWrappedAccessibleChildrenManager& ) = delete; + OWrappedAccessibleChildrenManager& operator=( const OWrappedAccessibleChildrenManager& ) = delete; +}; } // namespace accessibility commit db9f4b127e895f0d631c0004e867f4d4abedba05 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Wed May 21 16:26:48 2025 +0200 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Thu May 22 05:52:22 2025 +0200 comphelper a11y: Drop unnecessary forward-decl Change-Id: Ieacde9c0ef12bb030653d398c34731e434fcf857 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185623 Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> Tested-by: Jenkins diff --git a/include/comphelper/accessiblewrapper.hxx b/include/comphelper/accessiblewrapper.hxx index 518a150d390a..b3a56646f35c 100644 --- a/include/comphelper/accessiblewrapper.hxx +++ b/include/comphelper/accessiblewrapper.hxx @@ -45,11 +45,8 @@ namespace com::sun::star::uno { class XComponentContext; } namespace comphelper { - //= OAccessibleWrapper - - class OAccessibleContextWrapper; class OWrappedAccessibleChildrenManager; using OAccessibleWrapper_Base = cppu::ImplHelper1<css::accessibility::XAccessible>; commit 9ad80f9dafeec7e4f81fdbc3c657e7682a77a1cf Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Wed May 21 16:23:52 2025 +0200 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Thu May 22 05:52:15 2025 +0200 a11y: Turn cppu::ImplHelper1 subclass into alias Make OAccessibleWrapper_Base a simple alias instead of a subclass, as it doesn't add any functionality. Change-Id: I17ee04b70696a61b234acd4be515e269a869c95f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185622 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/include/comphelper/accessiblewrapper.hxx b/include/comphelper/accessiblewrapper.hxx index 803fb76217e4..518a150d390a 100644 --- a/include/comphelper/accessiblewrapper.hxx +++ b/include/comphelper/accessiblewrapper.hxx @@ -52,12 +52,7 @@ namespace comphelper class OAccessibleContextWrapper; class OWrappedAccessibleChildrenManager; - struct OAccessibleWrapper_Base : - public ::cppu::ImplHelper1 < css::accessibility::XAccessible > - { - protected: - ~OAccessibleWrapper_Base() {} - }; + using OAccessibleWrapper_Base = cppu::ImplHelper1<css::accessibility::XAccessible>; /** a class which aggregates a proxy for an XAccessible, and wrapping the context returned by this XAccessible.