summaryrefslogtreecommitdiff
path: root/sc/source/ui/Accessibility/AccessibleContextBase.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/Accessibility/AccessibleContextBase.cxx')
-rw-r--r--sc/source/ui/Accessibility/AccessibleContextBase.cxx258
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: */