include/toolkit/awt/vclxwindows.hxx | 5 -- include/vcl/accessiblefactory.hxx | 11 ----- include/vcl/toolkit/edit.hxx | 2 + test/source/a11y/accessibletestbase.cxx | 13 +++++- test/source/a11y/eventposter.cxx | 13 ++++-- toolkit/inc/awt/vclxwindows.hxx | 3 - toolkit/source/awt/vclxwindows.cxx | 34 ----------------- vcl/inc/accessibility/svtaccessiblenumericfield.hxx | 7 --- vcl/inc/accessibility/vclxaccessibleedit.hxx | 13 ++++-- vcl/source/accessibility/acc_factory.cxx | 5 -- vcl/source/accessibility/svtaccessiblenumericfield.cxx | 9 ---- vcl/source/accessibility/vclxaccessibleedit.cxx | 9 ++++ vcl/source/control/edit.cxx | 6 +++ vcl/source/control/field2.cxx | 4 +- 14 files changed, 46 insertions(+), 88 deletions(-)
New commits: commit 3cb6bae61d0d7a34570d035b229a38069380abad Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Mon May 26 09:34:24 2025 +0200 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Wed May 28 09:20:47 2025 +0200 vcl a11y: Let Edit and subclasses create their accessible directly This is the equivalent of commit f82aac71ede9c3f2dc059ca4c8b24f60e0841933 Author: Michael Weghorn <m.wegh...@posteo.de> Date: Thu May 22 12:30:12 2025 +0200 vcl a11y: Let PushButton create its accessible directly for Edit subclasses, see that commit's message for more background. Since all of DateField, TimeField, MultiLineEdit and VclMultiLineEdit are (not necessarily direct) subclasses of Edit and none of their subclasses further up the class hierarchy than Edit override Edit::CreateAccessible, there is no need for them to do so either, but they can use the Edit implementation. Therefore, just drop the corresponding methods of their VCLXWindow subclasses that were calling `AccessibleFactory::createAccessibleContext(Edit* pEdit)` explicitly. (Before Change-Id: Ifb7452de3e011a73aa798d1ea0302bbbc74ed7d2 Author: Michael Weghorn <m.wegh...@posteo.de> Date: Thu May 22 20:13:09 2025 +0200 vcl a11y: Set DateField/TimeField window type in ctor , two of them had some additional extra logic that might have required them to override the base class implementation.) Since VCLXAccessibleEdit implements the XAccessible interface now, its SVTXAccessibleNumericField subclass no longer needs to implement that directly. Change-Id: I5fe96a9061afb9f51e494cdd41a27636d0aa4d74 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185838 Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> Tested-by: Jenkins diff --git a/include/toolkit/awt/vclxwindows.hxx b/include/toolkit/awt/vclxwindows.hxx index f65bef419d65..814fa7670baf 100644 --- a/include/toolkit/awt/vclxwindows.hxx +++ b/include/toolkit/awt/vclxwindows.hxx @@ -356,8 +356,6 @@ private: protected: void ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) override; - virtual css::uno::Reference< css::accessibility::XAccessibleContext > CreateAccessibleContext() override; - public: VCLXEdit(); @@ -453,9 +451,6 @@ public: static void ImplGetPropertyIds( std::vector< sal_uInt16 > &aIds ); virtual void GetPropertyIds( std::vector< sal_uInt16 > &aIds ) override { return ImplGetPropertyIds( aIds ); } - -protected: - virtual css::uno::Reference<css::accessibility::XAccessibleContext> CreateAccessibleContext() override; }; // class VCLXSpinField diff --git a/include/vcl/accessiblefactory.hxx b/include/vcl/accessiblefactory.hxx index b70e99e64108..1d119216e9d1 100644 --- a/include/vcl/accessiblefactory.hxx +++ b/include/vcl/accessiblefactory.hxx @@ -21,21 +21,12 @@ #include <vcl/dllapi.h> -#include <com/sun/star/lang/XUnoTunnel.hpp> #include <com/sun/star/uno/Reference.hxx> -#include <salhelper/simplereferenceobject.hxx> -#include <tools/gen.hxx> -#include <rtl/ref.hxx> - namespace com::sun::star { namespace accessibility { - class XAccessible; class XAccessibleContext; } - namespace awt { - class XWindow; - } } namespace vcl { class Window; } @@ -62,8 +53,6 @@ class VCL_DLLPUBLIC AccessibleFactory public: AccessibleFactory() = delete; - static css::uno::Reference<css::accessibility::XAccessibleContext> - createAccessibleContext(Edit* pEdit); static css::uno::Reference<css::accessibility::XAccessibleContext> createAccessibleContext(vcl::Window* pWindow); }; diff --git a/include/vcl/toolkit/edit.hxx b/include/vcl/toolkit/edit.hxx index 2451f89f2166..44c4f8244e21 100644 --- a/include/vcl/toolkit/edit.hxx +++ b/include/vcl/toolkit/edit.hxx @@ -148,6 +148,8 @@ public: virtual ~Edit() override; virtual void dispose() override; + virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override; + virtual void MouseButtonDown( const MouseEvent& rMEvt ) override; virtual void MouseButtonUp( const MouseEvent& rMEvt ) override; virtual void KeyInput( const KeyEvent& rKEvt ) override; diff --git a/toolkit/inc/awt/vclxwindows.hxx b/toolkit/inc/awt/vclxwindows.hxx index 22367ddcc08b..3f8035b19385 100644 --- a/toolkit/inc/awt/vclxwindows.hxx +++ b/toolkit/inc/awt/vclxwindows.hxx @@ -263,8 +263,6 @@ public: class VCLXDateField : public cppu::ImplInheritanceHelper<VCLXFormattedSpinField, css::awt::XDateField> { -protected: - virtual css::uno::Reference< css::accessibility::XAccessibleContext > CreateAccessibleContext() override; public: VCLXDateField(); virtual ~VCLXDateField() override; @@ -302,7 +300,6 @@ public: class VCLXTimeField final : public cppu::ImplInheritanceHelper<VCLXFormattedSpinField, css::awt::XTimeField> { - virtual css::uno::Reference< css::accessibility::XAccessibleContext > CreateAccessibleContext() override; public: VCLXTimeField(); virtual ~VCLXTimeField() override; diff --git a/toolkit/source/awt/vclxwindows.cxx b/toolkit/source/awt/vclxwindows.cxx index 36d92741a9d8..e0ae26a51718 100644 --- a/toolkit/source/awt/vclxwindows.cxx +++ b/toolkit/source/awt/vclxwindows.cxx @@ -3592,12 +3592,6 @@ VCLXEdit::VCLXEdit() : maTextListeners( *this ) { } -css::uno::Reference< css::accessibility::XAccessibleContext > VCLXEdit::CreateAccessibleContext() -{ - VclPtr<Edit> pEdit = GetAs<Edit>(); - return AccessibleFactory::createAccessibleContext(pEdit); -} - void VCLXEdit::dispose() { SolarMutexGuard aGuard; @@ -4583,12 +4577,6 @@ VCLXDateField::~VCLXDateField() { } -css::uno::Reference< css::accessibility::XAccessibleContext > VCLXDateField::CreateAccessibleContext() -{ - VclPtr<Edit> pEdit = GetAs<Edit>(); - return AccessibleFactory::createAccessibleContext(pEdit); -} - void VCLXDateField::setProperty( const OUString& PropertyName, const css::uno::Any& Value) { SolarMutexGuard aGuard; @@ -4912,12 +4900,6 @@ VCLXTimeField::~VCLXTimeField() { } -css::uno::Reference< css::accessibility::XAccessibleContext > VCLXTimeField::CreateAccessibleContext() -{ - VclPtr<Edit> pEdit = GetAs<Edit>(); - return AccessibleFactory::createAccessibleContext(pEdit); -} - void VCLXTimeField::setTime( const util::Time& aTime ) { SolarMutexGuard aGuard; @@ -7789,10 +7771,4 @@ void VCLXMultiLineEdit::ImplGetPropertyIds( std::vector< sal_uInt16 > &rIds ) VCLXWindow::ImplGetPropertyIds( rIds, true ); } -css::uno::Reference<css::accessibility::XAccessibleContext> VCLXMultiLineEdit::CreateAccessibleContext() -{ - VclPtr<MultiLineEdit> pMultiLineEdit = GetAs<MultiLineEdit>(); - return AccessibleFactory::createAccessibleContext(pMultiLineEdit); -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/accessibility/svtaccessiblenumericfield.hxx b/vcl/inc/accessibility/svtaccessiblenumericfield.hxx index 3231f5c83221..6b2f1390e8d0 100644 --- a/vcl/inc/accessibility/svtaccessiblenumericfield.hxx +++ b/vcl/inc/accessibility/svtaccessiblenumericfield.hxx @@ -28,18 +28,13 @@ #include <com/sun/star/accessibility/XAccessibleValue.hpp> class SVTXAccessibleNumericField final - : public cppu::ImplInheritanceHelper<VCLXAccessibleEdit, css::accessibility::XAccessible, - css::accessibility::XAccessibleValue> + : public cppu::ImplInheritanceHelper<VCLXAccessibleEdit, css::accessibility::XAccessibleValue> { public: SVTXAccessibleNumericField(FormattedField* pFormattedField); virtual void ProcessWindowEvent(const VclWindowEvent& rVclWindowEvent) override; - // XAccessible - virtual css::uno::Reference<com::sun::star::accessibility::XAccessibleContext> - SAL_CALL getAccessibleContext() override; - // XAccessibleContext virtual sal_Int16 SAL_CALL getAccessibleRole() override; diff --git a/vcl/inc/accessibility/vclxaccessibleedit.hxx b/vcl/inc/accessibility/vclxaccessibleedit.hxx index 5ced34ebbd9c..38e2e0f22eda 100644 --- a/vcl/inc/accessibility/vclxaccessibleedit.hxx +++ b/vcl/inc/accessibility/vclxaccessibleedit.hxx @@ -27,11 +27,10 @@ #include <cppuhelper/implbase.hxx> #include <vcl/toolkit/edit.hxx> - -class VCLXAccessibleEdit : public cppu::ImplInheritanceHelper< - VCLXAccessibleTextComponent, - css::accessibility::XAccessibleAction, - css::accessibility::XAccessibleEditableText> +class VCLXAccessibleEdit + : public cppu::ImplInheritanceHelper< + VCLXAccessibleTextComponent, css::accessibility::XAccessible, + css::accessibility::XAccessibleAction, css::accessibility::XAccessibleEditableText> { friend class VCLXAccessibleBox; @@ -59,6 +58,10 @@ public: virtual OUString SAL_CALL getImplementationName() override; virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; + // XAccessible + virtual css::uno::Reference<com::sun::star::accessibility::XAccessibleContext> + SAL_CALL getAccessibleContext() override; + // XAccessibleContext virtual sal_Int64 SAL_CALL getAccessibleChildCount( ) override; virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int64 i ) override; diff --git a/vcl/source/accessibility/acc_factory.cxx b/vcl/source/accessibility/acc_factory.cxx index 14d69a85ed25..64687f5bfafe 100644 --- a/vcl/source/accessibility/acc_factory.cxx +++ b/vcl/source/accessibility/acc_factory.cxx @@ -63,11 +63,6 @@ bool hasFloatingChild(vcl::Window *pWindow) } }; -Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext(Edit* pEdit) -{ - return new VCLXAccessibleEdit(pEdit); -} - Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext(vcl::Window* pWindow) { if (!pWindow) diff --git a/vcl/source/accessibility/svtaccessiblenumericfield.cxx b/vcl/source/accessibility/svtaccessiblenumericfield.cxx index f9475778bca5..ea39ff8c2a6d 100644 --- a/vcl/source/accessibility/svtaccessiblenumericfield.cxx +++ b/vcl/source/accessibility/svtaccessiblenumericfield.cxx @@ -42,15 +42,6 @@ void SVTXAccessibleNumericField::ProcessWindowEvent(const VclWindowEvent& rVclWi } } -// XAccessible - -css::uno::Reference<com::sun::star::accessibility::XAccessibleContext> -SVTXAccessibleNumericField::getAccessibleContext() -{ - OExternalLockGuard aGuard(this); - return this; -} - sal_Int16 SVTXAccessibleNumericField::getAccessibleRole() { return AccessibleRole::SPIN_BOX; } css::uno::Any SAL_CALL SVTXAccessibleNumericField::getCurrentValue() diff --git a/vcl/source/accessibility/vclxaccessibleedit.cxx b/vcl/source/accessibility/vclxaccessibleedit.cxx index 976602643313..240374da5e1c 100644 --- a/vcl/source/accessibility/vclxaccessibleedit.cxx +++ b/vcl/source/accessibility/vclxaccessibleedit.cxx @@ -182,9 +182,16 @@ Sequence< OUString > VCLXAccessibleEdit::getSupportedServiceNames() return { u"com.sun.star.awt.AccessibleEdit"_ustr }; } +// XAccessible -// XAccessibleContext +css::uno::Reference<com::sun::star::accessibility::XAccessibleContext> +VCLXAccessibleEdit::getAccessibleContext() +{ + OExternalLockGuard aGuard(this); + return this; +} +// XAccessibleContext sal_Int64 VCLXAccessibleEdit::getAccessibleChildCount() { diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx index 1c4b9e22c781..499b79bb0ce5 100644 --- a/vcl/source/control/edit.cxx +++ b/vcl/source/control/edit.cxx @@ -33,6 +33,7 @@ #include <vcl/uitest/uiobject.hxx> #include <vcl/weld.hxx> +#include <accessibility/vclxaccessibleedit.hxx> #include <window.h> #include <svdata.hxx> #include <strings.hrc> @@ -1275,6 +1276,11 @@ void Edit::ImplPaste(css::uno::Reference<css::datatransfer::clipboard::XClipboar } } +css::uno::Reference<css::accessibility::XAccessible> Edit::CreateAccessible() +{ + return new VCLXAccessibleEdit(this); +} + void Edit::MouseButtonDown( const MouseEvent& rMEvt ) { if ( mpSubEdit ) commit 344737c3cab905400184d4bda22107c75c7e7d76 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Mon May 26 09:34:05 2025 +0200 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Wed May 28 09:20:40 2025 +0200 vcl a11y: Set DateField/TimeField window type in ctor So far, a DateField (or subclass) would be created with WindowType::SPINFIELD due to its SpinField base class (and not passing any explicit type to the base class ctor). However, when an accessible context would later be retrieved, VCLXDateField::CreateAccessibleContext would set WindowType::DATEFIELD on the control before creating an XAccessibleContext via the AccessibleFactory. Changing the window type later that way seems odd, and implies that the window type would be different depending on whether or not accessibility is active. Change that to set the DATEFIELD window type in the ctor already. The same applies for the TimeField and WindowType::TIMEFIELD. Should that have any unwanted side-effect, then it might be that some code path currently only handling the WindowType::SPINFIELD type might need to be adjusted to handle WindowType::DATEFIELD and/or WindowType::TIMEFIELD the same way. Change-Id: Ifb7452de3e011a73aa798d1ea0302bbbc74ed7d2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185837 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/toolkit/source/awt/vclxwindows.cxx b/toolkit/source/awt/vclxwindows.cxx index ffe7dd45e6fd..36d92741a9d8 100644 --- a/toolkit/source/awt/vclxwindows.cxx +++ b/toolkit/source/awt/vclxwindows.cxx @@ -4583,14 +4583,9 @@ VCLXDateField::~VCLXDateField() { } -//change the window type here to match the role css::uno::Reference< css::accessibility::XAccessibleContext > VCLXDateField::CreateAccessibleContext() { VclPtr<Edit> pEdit = GetAs<Edit>(); - if (pEdit) - { - pEdit->SetType( WindowType::DATEFIELD ); - } return AccessibleFactory::createAccessibleContext(pEdit); } @@ -4917,14 +4912,9 @@ VCLXTimeField::~VCLXTimeField() { } -//change the window type here to match the role css::uno::Reference< css::accessibility::XAccessibleContext > VCLXTimeField::CreateAccessibleContext() { VclPtr<Edit> pEdit = GetAs<Edit>(); - if (pEdit) - { - pEdit->SetType( WindowType::TIMEFIELD ); - } return AccessibleFactory::createAccessibleContext(pEdit); } diff --git a/vcl/source/control/field2.cxx b/vcl/source/control/field2.cxx index c581b0381599..a51b9a00e385 100644 --- a/vcl/source/control/field2.cxx +++ b/vcl/source/control/field2.cxx @@ -2007,7 +2007,7 @@ void DateFormatter::ExpandCentury( Date& rDate, sal_uInt16 nTwoDigitYearStart ) } DateField::DateField( vcl::Window* pParent, WinBits nWinStyle ) : - SpinField( pParent, nWinStyle ), + SpinField(pParent, nWinStyle, WindowType::DATEFIELD), DateFormatter(this), maFirst( GetMin() ), maLast( GetMax() ) @@ -2885,7 +2885,7 @@ void TimeFormatter::Reformat() } TimeField::TimeField( vcl::Window* pParent, WinBits nWinStyle ) : - SpinField( pParent, nWinStyle ), + SpinField(pParent, nWinStyle, WindowType::TIMEFIELD), TimeFormatter(this), maFirst( GetMin() ), maLast( GetMax() ) commit d3262b72f69311b282fbdbe3c38de743e76bdda9 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Mon May 26 09:23:29 2025 +0200 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Wed May 28 09:20:34 2025 +0200 a11y tests: Don't rely on XWindow being window's XAccessible See commit ed03c63f00dee22112a8632df45e5e044541960d Author: Michael Weghorn <m.wegh...@posteo.de> Date: Thu May 22 09:45:02 2025 +0100 wina11y: Don't rely on win accessible being VCLXWindow for more background. Change-Id: I19a01f9715536918dd9463f18a72c22878d0cd7c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185836 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/test/source/a11y/accessibletestbase.cxx b/test/source/a11y/accessibletestbase.cxx index 1e2f3f615190..d1c2ecbdadd7 100644 --- a/test/source/a11y/accessibletestbase.cxx +++ b/test/source/a11y/accessibletestbase.cxx @@ -111,8 +111,12 @@ uno::Reference<accessibility::XAccessibleContext> test::AccessibleTestBase::getDocumentAccessibleContext() { uno::Reference<frame::XModel> xModel(mxDocument, uno::UNO_QUERY_THROW); - uno::Reference<accessibility::XAccessible> xAccessible( - xModel->getCurrentController()->getFrame()->getComponentWindow(), uno::UNO_QUERY_THROW); + uno::Reference<css::awt::XWindow> xComponentWin + = xModel->getCurrentController()->getFrame()->getComponentWindow(); + assert(xComponentWin.is()); + uno::Reference<accessibility::XAccessible> xAccessible + = VCLUnoHelper::GetWindow(xComponentWin)->GetAccessible(); + assert(xAccessible.is()); return AccessibilityTools::getAccessibleObjectForPredicate( xAccessible->getAccessibleContext(), @@ -480,7 +484,10 @@ test::AccessibleTestBase::Dialog::Dialog(const uno::Reference<awt::XDialog2>& xD { CPPUNIT_ASSERT(xDialog2.is()); - mxAccessible.set(xDialog2, uno::UNO_QUERY); + uno::Reference<css::awt::XWindow> xWindow(xDialog2, uno::UNO_QUERY_THROW); + vcl::Window* pWindow = VCLUnoHelper::GetWindow(xWindow); + assert(pWindow); + mxAccessible = pWindow->GetAccessible(); if (mxAccessible) setWindow(mxAccessible); else diff --git a/test/source/a11y/eventposter.cxx b/test/source/a11y/eventposter.cxx index 39e178e22756..bc5814369b5d 100644 --- a/test/source/a11y/eventposter.cxx +++ b/test/source/a11y/eventposter.cxx @@ -15,7 +15,7 @@ #include <sfx2/lokhelper.hxx> #include <test/a11y/AccessibilityTools.hxx> -#include <toolkit/awt/vclxwindow.hxx> +#include <vcl/accessibility/vclxaccessiblecomponent.hxx> void test::EventPosterHelper::postKeyEventAsync(int nType, int nCharCode, int nKeyCode) const { @@ -32,15 +32,20 @@ void test::AccessibleEventPosterHelper::setWindow( { while (auto xParent = xAcc->getAccessibleContext()->getAccessibleParent()) xAcc = xParent; - auto vclXWindow = dynamic_cast<VCLXWindow*>(xAcc.get()); - if (!vclXWindow) + assert(xAcc); + css::uno::Reference<css::accessibility::XAccessibleContext> xAccContext + = xAcc->getAccessibleContext(); + assert(xAccContext.is()); + rtl::Reference<VCLXAccessibleComponent> pVCLAccComponent + = dynamic_cast<VCLXAccessibleComponent*>(xAccContext.get()); + if (!pVCLAccComponent) { std::cerr << "WARNING: AccessibleEventPosterHelper::setWindow() called on " "unsupported object " << AccessibilityTools::debugString(xAcc) << ". Event delivery will not work." << std::endl; } - mxWindow = vclXWindow ? vclXWindow->GetWindow() : nullptr; + mxWindow = pVCLAccComponent ? pVCLAccComponent->GetWindow() : nullptr; } /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */