diff options
Diffstat (limited to 'sc/source/ui/Accessibility/AccessibleContextBase.cxx')
-rw-r--r-- | sc/source/ui/Accessibility/AccessibleContextBase.cxx | 258 |
1 files changed, 27 insertions, 231 deletions
diff --git a/sc/source/ui/Accessibility/AccessibleContextBase.cxx b/sc/source/ui/Accessibility/AccessibleContextBase.cxx index b121893e2f6c..a0a8c764ce0e 100644 --- a/sc/source/ui/Accessibility/AccessibleContextBase.cxx +++ b/sc/source/ui/Accessibility/AccessibleContextBase.cxx @@ -36,44 +36,11 @@ using namespace ::com::sun::star; using namespace ::com::sun::star::accessibility; -/** - The listener is an internal class to prevent reference-counting cycles and therefore memory leaks. -*/ -typedef cppu::WeakComponentImplHelper< - css::accessibility::XAccessibleEventListener - > ScAccessibleContextBaseEventListenerWeakImpl; -class ScAccessibleContextBase::ScAccessibleContextBaseEventListener : public cppu::BaseMutex, public ScAccessibleContextBaseEventListenerWeakImpl -{ -public: - ScAccessibleContextBaseEventListener(ScAccessibleContextBase& rBase) - : ScAccessibleContextBaseEventListenerWeakImpl(m_aMutex), mrBase(rBase) {} - - using WeakComponentImplHelperBase::disposing; - - ///===== XAccessibleEventListener ======================================== - - virtual void SAL_CALL disposing( const lang::EventObject& rSource ) override - { - SolarMutexGuard aGuard; - if (rSource.Source == mrBase.mxParent) - dispose(); - } - - virtual void SAL_CALL - notifyEvent( - const css::accessibility::AccessibleEventObject& /*aEvent*/ ) override {} -private: - ScAccessibleContextBase& mrBase; -}; - - ScAccessibleContextBase::ScAccessibleContextBase( uno::Reference<XAccessible> xParent, const sal_Int16 aRole) : - ScAccessibleContextBaseWeakImpl(m_aMutex), mxParent(std::move(xParent)), - mnClientId(0), maRole(aRole) { } @@ -82,7 +49,7 @@ ScAccessibleContextBase::~ScAccessibleContextBase() { if (!IsDefunc() && !rBHelper.bInDispose) { - // increment refcount to prevent double call off dtor + // increment refcount to prevent double call of dtor osl_atomic_increment( &m_refCount ); // call dispose to inform object which have a weak reference to this object dispose(); @@ -94,16 +61,6 @@ void ScAccessibleContextBase::Init() // hold reference to make sure that the destructor is not called uno::Reference< XAccessibleContext > xKeepAlive(this); - if (mxParent.is()) - { - uno::Reference< XAccessibleEventBroadcaster > xBroadcaster (mxParent->getAccessibleContext(), uno::UNO_QUERY); - if (xBroadcaster.is()) - { - if (!mxEventListener) - mxEventListener = new ScAccessibleContextBaseEventListener(*this); - xBroadcaster->addAccessibleEventListener(mxEventListener); - } - } msName = createAccessibleName(); msDescription = createAccessibleDescription(); } @@ -111,25 +68,13 @@ void ScAccessibleContextBase::Init() void SAL_CALL ScAccessibleContextBase::disposing() { SolarMutexGuard aGuard; -// CommitDefunc(); not necessary and should not be send, because it cost a lot of time // hold reference to make sure that the destructor is not called uno::Reference< XAccessibleContext > xKeepAlive(this); - if ( mnClientId ) - { - sal_Int32 nTemClientId(mnClientId); - mnClientId = 0; - comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( nTemClientId, *this ); - } + OAccessibleComponentHelper::disposing(); - if (mxParent.is()) - { - uno::Reference< XAccessibleEventBroadcaster > xBroadcaster (mxParent->getAccessibleContext(), uno::UNO_QUERY); - if (xBroadcaster && mxEventListener) - xBroadcaster->removeAccessibleEventListener(mxEventListener); - mxParent = nullptr; - } + mxParent.clear(); } @@ -152,55 +97,26 @@ uno::Reference< XAccessibleContext> SAL_CALL return this; } -//===== XAccessibleComponent ================================================ +// OAccessibleComponentHelper -sal_Bool SAL_CALL ScAccessibleContextBase::containsPoint(const awt::Point& rPoint ) +awt::Rectangle ScAccessibleContextBase::implGetBounds( ) { - SolarMutexGuard aGuard; - IsObjectValid(); - return tools::Rectangle(Point(), GetBoundingBox().GetSize()) - .Contains(vcl::unohelper::ConvertToVCLPoint(rPoint)); -} - -uno::Reference< XAccessible > SAL_CALL ScAccessibleContextBase::getAccessibleAtPoint( - const awt::Point& /* rPoint */ ) -{ - OSL_FAIL("not implemented"); - return uno::Reference<XAccessible>(); -} - -awt::Rectangle SAL_CALL ScAccessibleContextBase::getBounds( ) -{ - SolarMutexGuard aGuard; - IsObjectValid(); return vcl::unohelper::ConvertToAWTRect(GetBoundingBox()); } -awt::Point SAL_CALL ScAccessibleContextBase::getLocation( ) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - return vcl::unohelper::ConvertToAWTPoint(GetBoundingBox().TopLeft()); -} +//===== XAccessibleComponent ================================================ awt::Point SAL_CALL ScAccessibleContextBase::getLocationOnScreen( ) { SolarMutexGuard aGuard; - IsObjectValid(); + ensureAlive(); return vcl::unohelper::ConvertToAWTPoint(GetBoundingBoxOnScreen().TopLeft()); } -awt::Size SAL_CALL ScAccessibleContextBase::getSize( ) -{ - SolarMutexGuard aGuard; - IsObjectValid(); - return vcl::unohelper::ConvertToAWTSize(GetBoundingBox().GetSize()); -} - bool ScAccessibleContextBase::isShowing( ) { SolarMutexGuard aGuard; - IsObjectValid(); + ensureAlive(); bool bShowing(false); if (mxParent.is()) { @@ -238,55 +154,12 @@ sal_Int32 SAL_CALL ScAccessibleContextBase::getBackground( ) //===== XAccessibleContext ================================================== -sal_Int64 SAL_CALL ScAccessibleContextBase::getAccessibleChildCount() -{ - OSL_FAIL("should be implemented in the abrevated class"); - return 0; -} - -uno::Reference<XAccessible> SAL_CALL - ScAccessibleContextBase::getAccessibleChild(sal_Int64 /* nIndex */) -{ - OSL_FAIL("should be implemented in the abrevated class"); - return uno::Reference<XAccessible>(); -} - uno::Reference<XAccessible> SAL_CALL ScAccessibleContextBase::getAccessibleParent() { return mxParent; } -sal_Int64 SAL_CALL - ScAccessibleContextBase::getAccessibleIndexInParent() -{ - SolarMutexGuard aGuard; - IsObjectValid(); - // Use a simple but slow solution for now. Optimize later. - // Return -1 to indicate that this object's parent does not know about the - // object. - sal_Int64 nIndex(-1); - - // 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_Int64 nChildCount = xParentContext->getAccessibleChildCount(); - for (sal_Int64 i=0; i<nChildCount; ++i) - { - uno::Reference<XAccessible> xChild (xParentContext->getAccessibleChild (i)); - if (xChild.is() && xChild.get() == this) - nIndex = i; - } - } - } - - return nIndex; -} - sal_Int16 SAL_CALL ScAccessibleContextBase::getAccessibleRole() { @@ -297,22 +170,18 @@ OUString SAL_CALL ScAccessibleContextBase::getAccessibleDescription() { SolarMutexGuard aGuard; - IsObjectValid(); + ensureAlive(); if (msDescription.isEmpty()) { OUString sDescription(createAccessibleDescription()); if (msDescription != sDescription) { - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::DESCRIPTION_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(this); - aEvent.OldValue <<= msDescription; - aEvent.NewValue <<= sDescription; - + const OUString sOldDescription = msDescription; msDescription = sDescription; - CommitChange(aEvent); + CommitChange(AccessibleEventId::DESCRIPTION_CHANGED, uno::Any(sOldDescription), + uno::Any(sDescription)); } } return msDescription; @@ -322,7 +191,7 @@ OUString SAL_CALL ScAccessibleContextBase::getAccessibleName() { SolarMutexGuard aGuard; - IsObjectValid(); + ensureAlive(); if (msName.isEmpty()) { OUString sName(createAccessibleName()); @@ -330,15 +199,10 @@ OUString SAL_CALL if (msName != sName) { - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::NAME_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(this); - aEvent.OldValue <<= msName; - aEvent.NewValue <<= sName; - + const OUString sOldName = msName; msName = sName; - CommitChange(aEvent); + CommitChange(AccessibleEventId::NAME_CHANGED, uno::Any(sOldName), uno::Any(sName)); } } return msName; @@ -359,7 +223,7 @@ lang::Locale SAL_CALL ScAccessibleContextBase::getLocale() { SolarMutexGuard aGuard; - IsObjectValid(); + ensureAlive(); if (mxParent.is()) { uno::Reference<XAccessibleContext> xParentContext ( @@ -373,48 +237,6 @@ lang::Locale SAL_CALL throw IllegalAccessibleComponentStateException (); } - //===== XAccessibleEventBroadcaster ===================================== - -void SAL_CALL - ScAccessibleContextBase::addAccessibleEventListener( - const uno::Reference<XAccessibleEventListener>& xListener) -{ - if (xListener.is()) - { - SolarMutexGuard aGuard; - IsObjectValid(); - if (!IsDefunc()) - { - if (!mnClientId) - mnClientId = comphelper::AccessibleEventNotifier::registerClient( ); - comphelper::AccessibleEventNotifier::addEventListener( mnClientId, xListener ); - } - } -} - -void SAL_CALL - ScAccessibleContextBase::removeAccessibleEventListener( - const uno::Reference<XAccessibleEventListener>& xListener) -{ - if (!xListener.is()) - return; - - SolarMutexGuard aGuard; - if (IsDefunc() || !mnClientId) - return; - - 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; - } -} - // XServiceInfo OUString SAL_CALL ScAccessibleContextBase::getImplementationName() { @@ -438,58 +260,32 @@ uno::Sequence< OUString> SAL_CALL OUString ScAccessibleContextBase::createAccessibleDescription() { - OSL_FAIL("should be implemented in the abrevated class"); + OSL_FAIL("should be implemented in the abbreviated class"); return OUString(); } OUString ScAccessibleContextBase::createAccessibleName() { - OSL_FAIL("should be implemented in the abrevated class"); + OSL_FAIL("should be implemented in the abbreviated class"); return OUString(); } -void ScAccessibleContextBase::CommitChange(const AccessibleEventObject& rEvent) const -{ - if (mnClientId) - comphelper::AccessibleEventNotifier::addEvent( mnClientId, rEvent ); -} - -void ScAccessibleContextBase::CommitFocusGained() const -{ - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::STATE_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(const_cast<ScAccessibleContextBase*>(this)); - aEvent.NewValue <<= AccessibleStateType::FOCUSED; - - CommitChange(aEvent); -} - -void ScAccessibleContextBase::CommitFocusLost() const +void ScAccessibleContextBase::CommitChange(const sal_Int16 nEventId, const css::uno::Any& rOldValue, + const css::uno::Any& rNewValue, sal_Int32 nIndexHint) { - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::STATE_CHANGED; - aEvent.Source = uno::Reference< XAccessibleContext >(const_cast<ScAccessibleContextBase*>(this)); - aEvent.OldValue <<= AccessibleStateType::FOCUSED; - - CommitChange(aEvent); + NotifyAccessibleEvent(nEventId, rOldValue, rNewValue, nIndexHint); } -AbsoluteScreenPixelRectangle ScAccessibleContextBase::GetBoundingBoxOnScreen() const +void ScAccessibleContextBase::CommitFocusGained() { - OSL_FAIL("not implemented"); - return AbsoluteScreenPixelRectangle(); -} - -tools::Rectangle ScAccessibleContextBase::GetBoundingBox() const -{ - OSL_FAIL("not implemented"); - return tools::Rectangle(); + CommitChange(AccessibleEventId::STATE_CHANGED, uno::Any(), + uno::Any(AccessibleStateType::FOCUSED)); } -void ScAccessibleContextBase::IsObjectValid() const +void ScAccessibleContextBase::CommitFocusLost() { - if (rBHelper.bDisposed || rBHelper.bInDispose) - throw lang::DisposedException(); + CommitChange(AccessibleEventId::STATE_CHANGED, uno::Any(AccessibleStateType::FOCUSED), + uno::Any()); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |