diff options
Diffstat (limited to 'editeng/source/accessibility/AccessibleContextBase.cxx')
-rw-r--r-- | editeng/source/accessibility/AccessibleContextBase.cxx | 140 |
1 files changed, 60 insertions, 80 deletions
diff --git a/editeng/source/accessibility/AccessibleContextBase.cxx b/editeng/source/accessibility/AccessibleContextBase.cxx index 72ac002c9940..df52b70e78a4 100644 --- a/editeng/source/accessibility/AccessibleContextBase.cxx +++ b/editeng/source/accessibility/AccessibleContextBase.cxx @@ -26,11 +26,11 @@ #include <com/sun/star/accessibility/AccessibleEventId.hpp> #include <com/sun/star/accessibility/IllegalAccessibleComponentStateException.hpp> -#include <unotools/accessiblestatesethelper.hxx> #include <unotools/accessiblerelationsethelper.hxx> #include <comphelper/accessibleeventnotifier.hxx> #include <cppuhelper/supportsservice.hxx> #include <osl/mutex.hxx> +#include <rtl/ref.hxx> #include <utility> @@ -42,47 +42,41 @@ namespace accessibility { // internal AccessibleContextBase::AccessibleContextBase ( - const uno::Reference<XAccessible>& rxParent, + uno::Reference<XAccessible> xParent, const sal_Int16 aRole) - : WeakComponentImplHelper(MutexOwner::maMutex), - mxParent(rxParent), - msDescription(), + : WeakComponentImplHelper(m_aMutex), + mxParent(std::move(xParent)), meDescriptionOrigin(NotSet), - msName(), meNameOrigin(NotSet), mnClientId(0), maRole(aRole) { // Create the state set. - ::utl::AccessibleStateSetHelper* pStateSet = new ::utl::AccessibleStateSetHelper (); - mxStateSet = pStateSet; + mnStateSet = 0; // Set some states. Don't use the SetState method because no events // shall be broadcasted (that is not yet initialized anyway). - pStateSet->AddState (AccessibleStateType::ENABLED); - pStateSet->AddState (AccessibleStateType::SENSITIVE); - pStateSet->AddState (AccessibleStateType::SHOWING); - pStateSet->AddState (AccessibleStateType::VISIBLE); - pStateSet->AddState (AccessibleStateType::FOCUSABLE); - pStateSet->AddState (AccessibleStateType::SELECTABLE); + mnStateSet |= AccessibleStateType::ENABLED; + mnStateSet |= AccessibleStateType::SENSITIVE; + mnStateSet |= AccessibleStateType::SHOWING; + mnStateSet |= AccessibleStateType::VISIBLE; + mnStateSet |= AccessibleStateType::FOCUSABLE; + mnStateSet |= AccessibleStateType::SELECTABLE; // Create the relation set. - ::utl::AccessibleRelationSetHelper* pRelationSet = new ::utl::AccessibleRelationSetHelper (); - mxRelationSet = pRelationSet; + mxRelationSet = new ::utl::AccessibleRelationSetHelper (); } AccessibleContextBase::~AccessibleContextBase() { } -bool AccessibleContextBase::SetState (sal_Int16 aState) +bool AccessibleContextBase::SetState (sal_Int64 aState) { - ::osl::ClearableMutexGuard aGuard (maMutex); - ::utl::AccessibleStateSetHelper* pStateSet = - static_cast< ::utl::AccessibleStateSetHelper*>(mxStateSet.get()); - if ((pStateSet != nullptr) && !pStateSet->contains(aState)) + ::osl::ClearableMutexGuard aGuard (m_aMutex); + if (!(mnStateSet & aState)) { - pStateSet->AddState (aState); + mnStateSet |= aState; // Clear the mutex guard so that it is not locked during calls to // listeners. aGuard.clear(); @@ -95,7 +89,7 @@ bool AccessibleContextBase::SetState (sal_Int16 aState) CommitChange( AccessibleEventId::STATE_CHANGED, aNewValue, - uno::Any()); + uno::Any(), -1); } return true; } @@ -104,14 +98,12 @@ bool AccessibleContextBase::SetState (sal_Int16 aState) } -bool AccessibleContextBase::ResetState (sal_Int16 aState) +bool AccessibleContextBase::ResetState (sal_Int64 aState) { - ::osl::ClearableMutexGuard aGuard (maMutex); - ::utl::AccessibleStateSetHelper* pStateSet = - static_cast< ::utl::AccessibleStateSetHelper*>(mxStateSet.get()); - if ((pStateSet != nullptr) && pStateSet->contains(aState)) + ::osl::ClearableMutexGuard aGuard (m_aMutex); + if (mnStateSet & aState) { - pStateSet->RemoveState (aState); + mnStateSet &= ~aState; // Clear the mutex guard so that it is not locked during calls to listeners. aGuard.clear(); @@ -120,7 +112,7 @@ bool AccessibleContextBase::ResetState (sal_Int16 aState) CommitChange( AccessibleEventId::STATE_CHANGED, uno::Any(), - aOldValue); + aOldValue, -1); return true; } else @@ -128,21 +120,15 @@ bool AccessibleContextBase::ResetState (sal_Int16 aState) } -bool AccessibleContextBase::GetState (sal_Int16 aState) +bool AccessibleContextBase::GetState (sal_Int64 aState) { - ::osl::MutexGuard aGuard (maMutex); - ::utl::AccessibleStateSetHelper* pStateSet = - static_cast< ::utl::AccessibleStateSetHelper*>(mxStateSet.get()); - if (pStateSet != nullptr) - return pStateSet->contains(aState); - else - // If there is no state set then return false as a default value. - return false; + ::osl::MutexGuard aGuard (m_aMutex); + return mnStateSet & aState; } void AccessibleContextBase::SetRelationSet ( - const uno::Reference<XAccessibleRelationSet>& rxNewRelationSet) + const rtl::Reference<utl::AccessibleRelationSetHelper>& rxNewRelationSet) { // Try to emit some meaningful events indicating differing relations in // both sets. @@ -158,7 +144,7 @@ void AccessibleContextBase::SetRelationSet ( for (int i=0; aRelationDescriptors[i].first!=AccessibleRelationType::INVALID; i++) if (mxRelationSet->containsRelation(aRelationDescriptors[i].first) != rxNewRelationSet->containsRelation(aRelationDescriptors[i].first)) - CommitChange (aRelationDescriptors[i].second, uno::Any(), uno::Any()); + CommitChange (aRelationDescriptors[i].second, uno::Any(), uno::Any(), -1); mxRelationSet = rxNewRelationSet; } @@ -177,7 +163,7 @@ uno::Reference< XAccessibleContext> SAL_CALL /** No children. */ -sal_Int32 SAL_CALL +sal_Int64 SAL_CALL AccessibleContextBase::getAccessibleChildCount() { return 0; @@ -188,7 +174,7 @@ sal_Int32 SAL_CALL an exception for a wrong index. */ uno::Reference<XAccessible> SAL_CALL - AccessibleContextBase::getAccessibleChild (sal_Int32 nIndex) + AccessibleContextBase::getAccessibleChild (sal_Int64 nIndex) { ThrowIfDisposed (); throw lang::IndexOutOfBoundsException ( @@ -205,29 +191,31 @@ uno::Reference<XAccessible> SAL_CALL } -sal_Int32 SAL_CALL +sal_Int64 SAL_CALL AccessibleContextBase::getAccessibleIndexInParent() { ThrowIfDisposed (); // Use a simple but slow solution for now. Optimize later. // Iterate over all the parent's children and search for this object. - if (mxParent.is()) + if (!mxParent.is()) + // Return -1 to indicate that this object's parent does not know about the + // object. + return -1; + + uno::Reference<XAccessibleContext> xParentContext ( + mxParent->getAccessibleContext()); + if (xParentContext.is()) { - uno::Reference<XAccessibleContext> xParentContext ( - mxParent->getAccessibleContext()); - if (xParentContext.is()) + sal_Int64 nChildCount = xParentContext->getAccessibleChildCount(); + for (sal_Int64 i=0; i<nChildCount; i++) { - sal_Int32 nChildCount = xParentContext->getAccessibleChildCount(); - for (sal_Int32 i=0; i<nChildCount; i++) + uno::Reference<XAccessible> xChild (xParentContext->getAccessibleChild (i)); + if (xChild.is()) { - uno::Reference<XAccessible> xChild (xParentContext->getAccessibleChild (i)); - if (xChild.is()) - { - uno::Reference<XAccessibleContext> xChildContext = xChild->getAccessibleContext(); - if (xChildContext == static_cast<XAccessibleContext*>(this)) - return i; - } + uno::Reference<XAccessibleContext> xChildContext = xChild->getAccessibleContext(); + if (xChildContext == static_cast<XAccessibleContext*>(this)) + return i; } } } @@ -280,12 +268,9 @@ uno::Reference<XAccessibleRelationSet> SAL_CALL ThrowIfDisposed (); // Create a copy of the relation set and return it. - ::utl::AccessibleRelationSetHelper* pRelationSet = - static_cast< ::utl::AccessibleRelationSetHelper*>(mxRelationSet.get()); - if (pRelationSet != nullptr) + if (mxRelationSet) { - return uno::Reference<XAccessibleRelationSet> ( - new ::utl::AccessibleRelationSetHelper (*pRelationSet)); + return new ::utl::AccessibleRelationSetHelper(*mxRelationSet); } else return uno::Reference<XAccessibleRelationSet>(nullptr); @@ -298,28 +283,19 @@ uno::Reference<XAccessibleRelationSet> SAL_CALL SHOWING VISIBLE */ -uno::Reference<XAccessibleStateSet> SAL_CALL +sal_Int64 SAL_CALL AccessibleContextBase::getAccessibleStateSet() { - ::utl::AccessibleStateSetHelper* pStateSet = nullptr; - if (rBHelper.bDisposed) { // We are already disposed! // Create a new state set that has only set the DEFUNC state. - pStateSet = new ::utl::AccessibleStateSetHelper (); - pStateSet->AddState (AccessibleStateType::DEFUNC); + return AccessibleStateType::DEFUNC; } else { - // Create a copy of the state set and return it. - pStateSet = static_cast< ::utl::AccessibleStateSetHelper*>(mxStateSet.get()); - - if (pStateSet != nullptr) - pStateSet = new ::utl::AccessibleStateSetHelper (*pStateSet); + return mnStateSet; } - - return uno::Reference<XAccessibleStateSet>(pStateSet); } @@ -417,7 +393,7 @@ void SAL_CALL AccessibleContextBase::disposing() { SetState (AccessibleStateType::DEFUNC); - ::osl::MutexGuard aGuard (maMutex); + ::osl::MutexGuard aGuard (m_aMutex); // Send a disposing to all listeners. if ( mnClientId ) @@ -425,6 +401,8 @@ void SAL_CALL AccessibleContextBase::disposing() comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this ); mnClientId = 0; } + mxParent.clear(); + mxRelationSet.clear(); } @@ -446,7 +424,7 @@ void AccessibleContextBase::SetAccessibleDescription ( CommitChange( AccessibleEventId::DESCRIPTION_CHANGED, aNewValue, - aOldValue); + aOldValue, -1); } @@ -468,7 +446,7 @@ void AccessibleContextBase::SetAccessibleName ( CommitChange( AccessibleEventId::NAME_CHANGED, aNewValue, - aOldValue); + aOldValue, -1); } @@ -481,7 +459,8 @@ OUString AccessibleContextBase::CreateAccessibleName() void AccessibleContextBase::CommitChange ( sal_Int16 nEventId, const uno::Any& rNewValue, - const uno::Any& rOldValue) + const uno::Any& rOldValue, + sal_Int32 nValueIndex) { // Do not call FireEvent and do not even create the event object when no // listener has been registered yet. Creating the event object can @@ -492,7 +471,8 @@ void AccessibleContextBase::CommitChange ( static_cast<XAccessibleContext*>(this), nEventId, rNewValue, - rOldValue); + rOldValue, + nValueIndex); FireEvent (aEvent); } @@ -511,7 +491,7 @@ void AccessibleContextBase::ThrowIfDisposed() if (rBHelper.bDisposed || rBHelper.bInDispose) { throw lang::DisposedException ("object has been already disposed", - static_cast<uno::XWeak*>(this)); + getXWeak()); } } |