21 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
22 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
34 ,m_bTransientChildren( true )
39 OWrappedAccessibleChildrenManager::~OWrappedAccessibleChildrenManager( )
44 void OWrappedAccessibleChildrenManager::setTransientChildren(
bool _bSet )
46 m_bTransientChildren = _bSet;
50 void OWrappedAccessibleChildrenManager::setOwningAccessible(
const Reference< XAccessible >& _rxAcc )
52 OSL_ENSURE( !m_aOwningAccessible.get().is(),
"OWrappedAccessibleChildrenManager::setOwningAccessible: to be called only once!" );
53 m_aOwningAccessible = WeakReference< XAccessible >( _rxAcc );
57 void OWrappedAccessibleChildrenManager::removeFromCache(
const Reference< XAccessible >& _rxKey )
59 AccessibleMap::iterator aRemovedPos = m_aChildrenMap.find( _rxKey );
60 if ( m_aChildrenMap.end() != aRemovedPos )
63 Reference< XComponent > xComp( aRemovedPos->first, UNO_QUERY );
65 xComp->removeEventListener(
this );
67 m_aChildrenMap.erase( aRemovedPos );
72 void OWrappedAccessibleChildrenManager::invalidateAll( )
75 for(
const auto& rChild : m_aChildrenMap )
77 Reference< XComponent > xComp( rChild.first, UNO_QUERY );
79 xComp->removeEventListener(
this );
86 Reference< XAccessible > OWrappedAccessibleChildrenManager::getAccessibleWrapperFor(
87 const Reference< XAccessible >& _rxKey )
89 Reference< XAccessible > xValue;
98 AccessibleMap::const_iterator aPos = m_aChildrenMap.find( _rxKey );
99 if ( m_aChildrenMap.end() != aPos )
101 xValue = aPos->second;
106 xValue =
new OAccessibleWrapper( m_xContext, _rxKey, m_aOwningAccessible );
109 if ( !m_bTransientChildren )
111 if (!m_aChildrenMap.emplace( _rxKey, xValue ).second)
114 "OWrappedAccessibleChildrenManager::"
115 "getAccessibleWrapperFor: element was already"
122 Reference< XComponent > xComp( _rxKey, UNO_QUERY );
124 xComp->addEventListener(
this );
132 void OWrappedAccessibleChildrenManager::dispose()
135 for(
const auto& rChild : m_aChildrenMap )
137 Reference< XComponent > xComp( rChild.first, UNO_QUERY );
139 xComp->removeEventListener(
this );
141 Reference< XComponent > xContextComponent;
142 if( rChild.second.is() )
143 xContextComponent.set( rChild.second->getAccessibleContext(),
144 ::css::uno::UNO_QUERY );
145 if( xContextComponent.is() )
146 xContextComponent->dispose();
154 void OWrappedAccessibleChildrenManager::implTranslateChildEventValue(
const Any& _rInValue, Any& _rOutValue )
157 Reference< XAccessible > xChild;
158 if ( _rInValue >>= xChild )
159 _rOutValue <<= getAccessibleWrapperFor( xChild );
163 void OWrappedAccessibleChildrenManager::translateAccessibleEvent(
const AccessibleEventObject& _rEvent, AccessibleEventObject& _rTranslatedEvent )
166 _rTranslatedEvent.NewValue = _rEvent.NewValue;
167 _rTranslatedEvent.OldValue = _rEvent.OldValue;
169 switch ( _rEvent.EventId )
171 case AccessibleEventId::CHILD:
172 case AccessibleEventId::ACTIVE_DESCENDANT_CHANGED:
173 case AccessibleEventId::CONTROLLED_BY_RELATION_CHANGED:
174 case AccessibleEventId::CONTROLLER_FOR_RELATION_CHANGED:
175 case AccessibleEventId::LABEL_FOR_RELATION_CHANGED:
176 case AccessibleEventId::LABELED_BY_RELATION_CHANGED:
177 case AccessibleEventId::CONTENT_FLOWS_FROM_RELATION_CHANGED:
178 case AccessibleEventId::CONTENT_FLOWS_TO_RELATION_CHANGED:
180 implTranslateChildEventValue( _rEvent.OldValue, _rTranslatedEvent.OldValue );
181 implTranslateChildEventValue( _rEvent.NewValue, _rTranslatedEvent.NewValue );
184 case AccessibleEventId::NAME_CHANGED:
185 case AccessibleEventId::DESCRIPTION_CHANGED:
186 case AccessibleEventId::ACTION_CHANGED:
187 case AccessibleEventId::STATE_CHANGED:
188 case AccessibleEventId::BOUNDRECT_CHANGED:
189 case AccessibleEventId::INVALIDATE_ALL_CHILDREN:
190 case AccessibleEventId::SELECTION_CHANGED:
191 case AccessibleEventId::VISIBLE_DATA_CHANGED:
192 case AccessibleEventId::VALUE_CHANGED:
193 case AccessibleEventId::MEMBER_OF_RELATION_CHANGED:
194 case AccessibleEventId::CARET_CHANGED:
195 case AccessibleEventId::TEXT_CHANGED:
196 case AccessibleEventId::HYPERTEXT_CHANGED:
197 case AccessibleEventId::TABLE_CAPTION_CHANGED:
198 case AccessibleEventId::TABLE_COLUMN_DESCRIPTION_CHANGED:
199 case AccessibleEventId::TABLE_COLUMN_HEADER_CHANGED:
200 case AccessibleEventId::TABLE_MODEL_CHANGED:
201 case AccessibleEventId::TABLE_ROW_DESCRIPTION_CHANGED:
202 case AccessibleEventId::TABLE_ROW_HEADER_CHANGED:
203 case AccessibleEventId::TABLE_SUMMARY_CHANGED:
205 case AccessibleEventId::TEXT_SELECTION_CHANGED:
210 OSL_FAIL(
"OWrappedAccessibleChildrenManager::translateAccessibleEvent: unknown (or unexpected) event id!" );
216 void OWrappedAccessibleChildrenManager::handleChildNotification(
const AccessibleEventObject& _rEvent )
218 if ( AccessibleEventId::INVALIDATE_ALL_CHILDREN == _rEvent.EventId )
222 else if ( AccessibleEventId::CHILD == _rEvent.EventId )
225 Reference< XAccessible > xRemoved;
226 if ( _rEvent.OldValue >>= xRemoved )
227 removeFromCache( xRemoved );
232 void SAL_CALL OWrappedAccessibleChildrenManager::disposing(
const EventObject& _rSource )
235 Reference< XAccessible > xSource( _rSource.Source, UNO_QUERY );
236 AccessibleMap::iterator aDisposedPos = m_aChildrenMap.find( xSource );
237 #if OSL_DEBUG_LEVEL > 0
238 if ( m_aChildrenMap.end() == aDisposedPos )
240 OSL_FAIL(
"OWrappedAccessibleChildrenManager::disposing: where did this come from?" );
242 Reference< XAccessible > xOwningAccessible( m_aOwningAccessible );
243 Reference< XAccessibleContext > xContext;
246 if ( xOwningAccessible.is() )
247 xContext = xOwningAccessible->getAccessibleContext();
256 catch(
const Exception& )
262 if ( m_aChildrenMap.end() != aDisposedPos )
264 m_aChildrenMap.erase( aDisposedPos );
269 const Reference< XAccessible >& _rxInnerAccessible,
const Reference< XAccessible >& _rxParentAccessible )
270 :OAccessibleWrapper_Base( )
271 ,OComponentProxyAggregation( _rxContext,
Reference< XComponent >( _rxInnerAccessible, UNO_QUERY ) )
272 ,m_xParentAccessible( _rxParentAccessible )
273 ,m_xInnerAccessible( _rxInnerAccessible )
292 Any OAccessibleWrapper::queryInterface( const
Type& _rType )
296 if ( !aReturn.hasValue() )
318 Reference< XAccessibleContext > xContext =
m_aContext;
319 if ( !xContext.is() )
322 Reference< XAccessibleContext > xInnerContext =
m_xInnerAccessible->getAccessibleContext( );
323 if ( xInnerContext.is() )
327 m_aContext = WeakReference< XAccessibleContext >( xContext );
337 const Reference< XAccessibleContext >& _rxInnerAccessibleContext,
338 const Reference< XAccessible >& _rxOwningAccessible,
339 const Reference< XAccessible >& _rxParentAccessible )
341 ,m_xInnerContext( _rxInnerAccessibleContext )
342 ,m_xOwningAccessible( _rxOwningAccessible )
343 ,m_xParentAccessible( _rxParentAccessible )
348 Reference< XAccessibleStateSet > xStates( m_xInnerContext->getAccessibleStateSet( ) );
349 OSL_ENSURE( xStates.is(),
"OAccessibleContextWrapperHelper::OAccessibleContextWrapperHelper: no inner state set!" );
350 m_xChildMapper->setTransientChildren( !xStates.is() || xStates->contains( AccessibleStateType::MANAGES_DESCENDANTS) );
352 m_xChildMapper->setOwningAccessible( m_xOwningAccessible );
359 OSL_ENSURE( xInnerComponent.is(),
"OComponentProxyAggregation::aggregateProxy: accessible is no XComponent!" );
360 if ( xInnerComponent.is() )
364 osl_atomic_increment( &_rRefCount );
366 Reference< XAccessibleEventBroadcaster > xBroadcaster(
m_xInner, UNO_QUERY );
367 if ( xBroadcaster.is() )
368 xBroadcaster->addAccessibleEventListener(
this );
370 osl_atomic_decrement( &_rRefCount );
376 OSL_ENSURE(
m_rBHelper.
bDisposed,
"OAccessibleContextWrapperHelper::~OAccessibleContextWrapperHelper: you should ensure (in your dtor) that the object is disposed!" );
383 if ( !aReturn.hasValue() )
394 return m_xInnerContext->getAccessibleChildCount();
401 Reference< XAccessible > xInnerChild =
m_xInnerContext->getAccessibleChild( i );
416 #if OSL_DEBUG_LEVEL > 0
417 if ( AccessibleEventId::STATE_CHANGED == _rEvent.EventId )
419 bool bChildTransienceChanged =
false;
420 sal_Int16 nChangeState = 0;
421 if ( _rEvent.OldValue >>= nChangeState )
422 bChildTransienceChanged = bChildTransienceChanged || AccessibleStateType::MANAGES_DESCENDANTS == nChangeState;
423 if ( _rEvent.NewValue >>= nChangeState )
424 bChildTransienceChanged = bChildTransienceChanged || AccessibleStateType::MANAGES_DESCENDANTS == nChangeState;
425 OSL_ENSURE( !bChildTransienceChanged,
"OAccessibleContextWrapperHelper::notifyEvent: MANAGES_DESCENDANTS is not expected to change during runtime!" );
430 AccessibleEventObject aTranslatedEvent( _rEvent );
437 m_xChildMapper->translateAccessibleEvent( _rEvent, aTranslatedEvent );
442 if ( aTranslatedEvent.NewValue ==
m_xInner )
443 aTranslatedEvent.NewValue <<= aTranslatedEvent.Source;
444 if ( aTranslatedEvent.OldValue ==
m_xInner )
445 aTranslatedEvent.OldValue <<= aTranslatedEvent.Source;
457 Reference< XAccessibleEventBroadcaster > xBroadcaster(
m_xInner, UNO_QUERY );
458 OSL_ENSURE( xBroadcaster.is(),
"OAccessibleContextWrapperHelper::disposing(): inner context is no broadcaster!" );
459 if ( xBroadcaster.is() )
460 xBroadcaster->removeAccessibleEventListener(
this );
482 OAccessibleContextWrapper::OAccessibleContextWrapper( const Reference< XComponentContext >& _rxContext,
483 const Reference< XAccessibleContext >& _rxInnerAccessibleContext, const Reference< XAccessible >& _rxOwningAccessible,
484 const Reference< XAccessible >& _rxParentAccessible )
485 :OAccessibleContextWrapper_CBase(
m_aMutex )
487 ,m_nNotifierClient( 0 )
489 aggregateProxy( m_refCount, *
this );
567 ::osl::MutexGuard aGuard(
m_aMutex );
576 ::osl::MutexGuard aGuard(
m_aMutex );
595 ::osl::MutexGuard aGuard(
m_aMutex );
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
virtual sal_Int32 SAL_CALL getAccessibleIndexInParent() override
::cppu::WeakComponentImplHelper< css::accessibility::XAccessibleEventBroadcaster, css::accessibility::XAccessibleContext > OAccessibleContextWrapper_CBase
::std::map< css::uno::Reference< css::accessibility::XAccessible >, css::uno::Reference< css::accessibility::XAccessible > > AccessibleMap
a class which aggregates a proxy for an XAccessible, and wrapping the context returned by this XAcces...
css::uno::WeakReference< css::accessibility::XAccessibleContext > m_aContext
::cppu::OBroadcastHelper & m_rBHelper
virtual void notifyTranslatedEvent(const css::accessibility::AccessibleEventObject &_rEvent)=0
notify an accessible event which has been translated (if necessary)
virtual sal_Int32 SAL_CALL getAccessibleChildCount() override
virtual css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext() override
virtual css::uno::Reference< css::accessibility::XAccessibleStateSet > SAL_CALL getAccessibleStateSet() override
mutable::osl::Mutex m_aMutex
#define IMPLEMENT_FORWARD_XTYPEPROVIDER2(classname, baseclass1, baseclass2)
virtual void SAL_CALL dispose() override
css::uno::Reference< css::accessibility::XAccessible > m_xInnerAccessible
virtual css::lang::Locale SAL_CALL getLocale() override
virtual ~OAccessibleWrapper() override
css::uno::Reference< css::accessibility::XAccessibleRelationSet > baseGetAccessibleRelationSet()
Helper for wrapping an XAccessibleContext by aggregating a proxy for it.
virtual rtl::Reference< OAccessibleContextWrapper > createAccessibleContext(const css::uno::Reference< css::accessibility::XAccessibleContext > &_rxInnerContext)
virtual ~OAccessibleContextWrapperHelper() override
virtual void SAL_CALL disposing() override
const css::uno::Reference< css::uno::XComponentContext > & getComponentContext() const
virtual OUString SAL_CALL getAccessibleDescription() override
::comphelper::AccessibleEventNotifier::TClientId m_nNotifierClient
virtual void SAL_CALL removeAccessibleEventListener(const css::uno::Reference< css::accessibility::XAccessibleEventListener > &xListener) override
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet > SAL_CALL getAccessibleRelationSet() override
sal_Int32 baseGetAccessibleChildCount()
virtual sal_Int16 SAL_CALL getAccessibleRole() override
static sal_Int32 removeEventListener(const TClientId _nClient, const css::uno::Reference< css::accessibility::XAccessibleEventListener > &_rxListener)
revokes a listener for the given client
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)
ctor
virtual void SAL_CALL notifyEvent(const css::accessibility::AccessibleEventObject &aEvent) override
void aggregateProxy(oslInterlockedCount &_rRefCount,::cppu::OWeakObject &_rDelegator)
to be called from within your ctor - does the aggregation of a proxy for m_xInnerContext ...
virtual OUString SAL_CALL getAccessibleName() override
Reference< XComponentContext > getComponentContext(Reference< XMultiServiceFactory > const &factory)
virtual ~OAccessibleContextWrapper() override
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild(sal_Int32 i) override
static void revokeClientNotifyDisposing(const TClientId _nClient, const css::uno::Reference< css::uno::XInterface > &_rxEventSource)
revokes a client, with additionally notifying a disposing event to all listeners registered for this ...
#define IMPLEMENT_FORWARD_XINTERFACE2(classname, refcountbase, baseclass2)
css::uno::Reference< css::accessibility::XAccessible > baseGetAccessibleChild(sal_Int32 i)
css::uno::Reference< css::accessibility::XAccessibleContext > getContextNoCreate() const
#define IMPLEMENT_FORWARD_REFCOUNT(classname, refcountbase)
virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const &rType) SAL_OVERRIDE
css::uno::Reference< css::lang::XComponent > m_xInner
virtual void SAL_CALL dispose()=0
rtl::Reference< OWrappedAccessibleChildrenManager > m_xChildMapper
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent() override
static void revokeClient(const TClientId _nClient)
revokes a broadcaster of AccessibleEvents
css::uno::Reference< css::accessibility::XAccessible > m_xParentAccessible
the XAccessible which is to be returned in getAccessibleParent
a helper class for aggregating a proxy to an XComponent
css::uno::Reference< css::accessibility::XAccessible > m_xParentAccessible
virtual void SAL_CALL dispose() override
css::uno::Reference< css::accessibility::XAccessibleContext > m_xInnerContext
the context we're wrapping (properly typed, in opposite to OComponentProxyAggregationHelper::m_xInner...
css::uno::Any SAL_CALL queryInterface(const css::uno::Type &_rType) override
void componentAggregateProxyFor(const css::uno::Reference< css::lang::XComponent > &_rxComponent, oslInterlockedCount &_rRefCount,::cppu::OWeakObject &_rDelegator)
to be called from within your ctor
virtual void notifyTranslatedEvent(const css::accessibility::AccessibleEventObject &_rEvent) override
notify an accessible event which has been translated (if necessary)
static void addEvent(const TClientId _nClient, const css::accessibility::AccessibleEventObject &_rEvent)
adds an event, which is to be broadcasted, to the queue
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)
ctor
Reference< XComponentContext > m_xContext
css::uno::Any SAL_CALL queryInterface(const css::uno::Type &_rType) override
static TClientId registerClient()
registers a client of this class, means a broadcaster of AccessibleEvents
virtual void SAL_CALL addAccessibleEventListener(const css::uno::Reference< css::accessibility::XAccessibleEventListener > &xListener) override
static sal_Int32 addEventListener(const TClientId _nClient, const css::uno::Reference< css::accessibility::XAccessibleEventListener > &_rxListener)
registers a listener for the given client