winaccessibility/inc/AccContainerEventListener.hxx | 4 winaccessibility/inc/AccDescendantManagerEventListener.hxx | 4 winaccessibility/inc/AccDialogEventListener.hxx | 3 winaccessibility/inc/AccEventListener.hxx | 2 winaccessibility/inc/AccFrameEventListener.hxx | 2 winaccessibility/inc/AccMenuEventListener.hxx | 3 winaccessibility/inc/AccWindowEventListener.hxx | 3 winaccessibility/source/service/AccContainerEventListener.cxx | 44 ---------- winaccessibility/source/service/AccDescendantManagerEventListener.cxx | 40 --------- winaccessibility/source/service/AccDialogEventListener.cxx | 40 --------- winaccessibility/source/service/AccEventListener.cxx | 34 +++++++ winaccessibility/source/service/AccFrameEventListener.cxx | 19 ---- winaccessibility/source/service/AccMenuEventListener.cxx | 41 --------- winaccessibility/source/service/AccWindowEventListener.cxx | 38 -------- 14 files changed, 37 insertions(+), 240 deletions(-)
New commits: commit f9631765c9dfd805ae486a94eacb69d307c9eef1 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Tue Aug 1 09:35:48 2023 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Tue Aug 1 13:14:46 2023 +0200 wina11y: Drop/Clean up CHILD event handling in subclasses Now that Change-Id I62ab32342ef67c770ced9f0d2be867dc9355bd4a ("tdf#156561 wina11y: Handle CHILD event") has implemented handling for the CHILD event in `AccEventListener`, drop the overrides in child classes that effectively do the same. For the case that a new child gets added, `AccFrameEventListener::HandleChildChangedEvent` also passes the HWND, so leave that and only forward to the base class for the other case. Change-Id: I68d836abedbf3563df84187d56851820c043866f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155127 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/winaccessibility/inc/AccContainerEventListener.hxx b/winaccessibility/inc/AccContainerEventListener.hxx index cf1cdb2157c4..0ce0c217548a 100644 --- a/winaccessibility/inc/AccContainerEventListener.hxx +++ b/winaccessibility/inc/AccContainerEventListener.hxx @@ -45,10 +45,6 @@ public: //AccessibleEventListener virtual void SAL_CALL notifyEvent( const css::accessibility::AccessibleEventObject& aEvent ) override; - //for child changed event - virtual void HandleChildChangedEvent( - css::uno::Any oldValue, css::uno::Any newValue) override; - //for selection changed event virtual void HandleSelectionChangedEvent( const css::uno::Any &oldValue, const css::uno::Any &newValue); diff --git a/winaccessibility/inc/AccDescendantManagerEventListener.hxx b/winaccessibility/inc/AccDescendantManagerEventListener.hxx index 0f0e30ed3af1..4cae3c808dd0 100644 --- a/winaccessibility/inc/AccDescendantManagerEventListener.hxx +++ b/winaccessibility/inc/AccDescendantManagerEventListener.hxx @@ -49,10 +49,6 @@ public: virtual void HandleSelectionChangedEvent( css::uno::Any oldValue, css::uno::Any newValue); - //for child changed event - virtual void HandleChildChangedEvent( - css::uno::Any oldValue, css::uno::Any newValue) override; - virtual void HandleChildChangedNoFocusEvent( css::uno::Any oldValue, css::uno::Any newValue); diff --git a/winaccessibility/inc/AccDialogEventListener.hxx b/winaccessibility/inc/AccDialogEventListener.hxx index 49482474f811..f2d7ff9a0005 100644 --- a/winaccessibility/inc/AccDialogEventListener.hxx +++ b/winaccessibility/inc/AccDialogEventListener.hxx @@ -40,9 +40,6 @@ public: virtual void SAL_CALL notifyEvent(const css::accessibility::AccessibleEventObject& aEvent) override; - //for child changed event - virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue) override; - //state changed virtual void SetComponentState(sal_Int64 state, bool enable) override; }; diff --git a/winaccessibility/inc/AccMenuEventListener.hxx b/winaccessibility/inc/AccMenuEventListener.hxx index 93c9f0f2f867..354d7166029d 100644 --- a/winaccessibility/inc/AccMenuEventListener.hxx +++ b/winaccessibility/inc/AccMenuEventListener.hxx @@ -40,9 +40,6 @@ public: virtual void SAL_CALL notifyEvent(const css::accessibility::AccessibleEventObject& aEvent) override; - //for child changed event - virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue) override; - //for selection changed event virtual void HandleSelectionChangedEventNoArgs(); diff --git a/winaccessibility/inc/AccWindowEventListener.hxx b/winaccessibility/inc/AccWindowEventListener.hxx index 6fb20892813b..dfc3e2756b2e 100644 --- a/winaccessibility/inc/AccWindowEventListener.hxx +++ b/winaccessibility/inc/AccWindowEventListener.hxx @@ -40,9 +40,6 @@ public: virtual void SAL_CALL notifyEvent(const css::accessibility::AccessibleEventObject& aEvent) override; - //for child changed event - virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue) override; - //state changed virtual void SetComponentState(sal_Int64 state, bool enable) override; }; diff --git a/winaccessibility/source/service/AccContainerEventListener.cxx b/winaccessibility/source/service/AccContainerEventListener.cxx index da150f457bd8..1ca75234a944 100644 --- a/winaccessibility/source/service/AccContainerEventListener.cxx +++ b/winaccessibility/source/service/AccContainerEventListener.cxx @@ -52,9 +52,6 @@ void AccContainerEventListener::notifyEvent( const css::accessibility::Accessib switch (aEvent.EventId) { - case AccessibleEventId::CHILD: - HandleChildChangedEvent(aEvent.OldValue, aEvent.NewValue); - break; case AccessibleEventId::SELECTION_CHANGED: HandleSelectionChangedEvent(aEvent.OldValue, aEvent.NewValue); break; @@ -114,47 +111,6 @@ void AccContainerEventListener::HandleStateChangedEvent(Any oldValue, Any newVal } -/** - * handle the CHILD event - * @param oldValue the child to be deleted - * @param newValue the child to be added - */ -void AccContainerEventListener::HandleChildChangedEvent(Any oldValue, Any newValue) -{ - Reference< XAccessible > xChild; - if( newValue >>= xChild) - { - //create a new child - if(xChild.is()) - { - XAccessible* pAcc = xChild.get(); - //add this child - - if (pAgent->InsertAccObj(pAcc, m_xAccessible.get())) - { - //add all oldValue's existing children - pAgent->InsertChildrenAccObj(pAcc); - pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_ADDED, pAcc); - } - } - } - else if (oldValue >>= xChild) - { - //delete an existing child - if(xChild.is()) - { - XAccessible* pAcc = xChild.get(); - pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_REMOVED, pAcc); - //delete all oldValue's existing children - pAgent->DeleteChildrenAccObj( pAcc ); - //delete this child - pAgent->DeleteAccObj( pAcc ); - - } - } - -} - /** * handle the SELECTION_CHANGED event * @param oldValue the old value of the source of event diff --git a/winaccessibility/source/service/AccDescendantManagerEventListener.cxx b/winaccessibility/source/service/AccDescendantManagerEventListener.cxx index c38f19e32cd8..daecf6e295f4 100644 --- a/winaccessibility/source/service/AccDescendantManagerEventListener.cxx +++ b/winaccessibility/source/service/AccDescendantManagerEventListener.cxx @@ -54,9 +54,6 @@ void AccDescendantManagerEventListener::notifyEvent( const css::accessibility:: case AccessibleEventId::SELECTION_CHANGED: HandleSelectionChangedEvent(aEvent.OldValue, aEvent.NewValue); break; - case AccessibleEventId::CHILD: - HandleChildChangedEvent(aEvent.OldValue, aEvent.NewValue); - break; case AccessibleEventId::ACTIVE_DESCENDANT_CHANGED_NOFOCUS: HandleChildChangedNoFocusEvent(aEvent.OldValue, aEvent.NewValue); break; @@ -75,43 +72,6 @@ void AccDescendantManagerEventListener::notifyEvent( const css::accessibility:: } } -/** - * handle the CHILD event - * @param oldValue the child to be deleted - * @param newValue the child to be added - */ -void AccDescendantManagerEventListener::HandleChildChangedEvent(Any oldValue, Any newValue) -{ - - Reference< XAccessible > xChild; - if( newValue >>= xChild) - { - //create a new child - if(xChild.is()) - { - XAccessible* pAcc = xChild.get(); - pAgent->InsertAccObj(pAcc, m_xAccessible.get()); - pAgent->InsertChildrenAccObj(pAcc); - - pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_ADDED, pAcc); - - } - } - - if (oldValue >>= xChild) - { - if(xChild.is()) - { - XAccessible* pAcc = xChild.get(); - - pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_REMOVED, pAcc); - pAgent->DeleteChildrenAccObj( pAcc ); - pAgent->DeleteAccObj( pAcc ); - } - } - -} - /** * handle the SELECTION_CHANGED event */ diff --git a/winaccessibility/source/service/AccDialogEventListener.cxx b/winaccessibility/source/service/AccDialogEventListener.cxx index b5cd86b434cf..86b1815c24da 100644 --- a/winaccessibility/source/service/AccDialogEventListener.cxx +++ b/winaccessibility/source/service/AccDialogEventListener.cxx @@ -49,9 +49,6 @@ void AccDialogEventListener::notifyEvent( const css::accessibility::AccessibleE switch (aEvent.EventId) { - case AccessibleEventId::CHILD: - HandleChildChangedEvent(aEvent.OldValue, aEvent.NewValue); - break; case AccessibleEventId::VISIBLE_DATA_CHANGED: HandleVisibleDataChangedEvent(); break; @@ -64,43 +61,6 @@ void AccDialogEventListener::notifyEvent( const css::accessibility::AccessibleE } } -/** - * handle the CHILD event - * @param oldValue the child to be deleted - * @param newValue the child to be added - */ -void AccDialogEventListener::HandleChildChangedEvent(Any oldValue, Any newValue) -{ - Reference< XAccessible > xChild; - if( newValue >>= xChild) - { - //create a new child - if(xChild.is()) - { - XAccessible* pAcc = xChild.get(); - //add this child - pAgent->InsertAccObj(pAcc, m_xAccessible.get()); - //add all oldValue's existing children - pAgent->InsertChildrenAccObj(pAcc); - pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_ADDED, pAcc); - } - } - else if (oldValue >>= xChild) - { - //delete an existing child - if(xChild.is()) - { - XAccessible* pAcc = xChild.get(); - pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_REMOVED, pAcc); - //delete all oldValue's existing children - pAgent->DeleteChildrenAccObj( pAcc ); - //delete this child - pAgent->DeleteAccObj( pAcc ); - } - } - -} - /** * set the new state and fire the MSAA event * @param state new state id diff --git a/winaccessibility/source/service/AccFrameEventListener.cxx b/winaccessibility/source/service/AccFrameEventListener.cxx index cd4a64b22bca..ac6795abb476 100644 --- a/winaccessibility/source/service/AccFrameEventListener.cxx +++ b/winaccessibility/source/service/AccFrameEventListener.cxx @@ -55,9 +55,6 @@ void AccFrameEventListener::notifyEvent( const css::accessibility::AccessibleEv switch (aEvent.EventId) { - case AccessibleEventId::CHILD: - HandleChildChangedEvent(aEvent.OldValue, aEvent.NewValue); - break; case AccessibleEventId::VISIBLE_DATA_CHANGED: HandleVisibleDataChangedEvent(); break; @@ -80,37 +77,23 @@ void AccFrameEventListener::HandleChildChangedEvent(Any oldValue, Any newValue) Reference< XAccessible > xChild; if( newValue >>= xChild) { - //create a new child if(xChild.is()) { XAccessible* pAcc = xChild.get(); - VCLXWindow* pvclwindow = dynamic_cast<VCLXWindow*>(m_xAccessible.get()); assert(pvclwindow); const SystemEnvData* systemdata = pvclwindow->GetWindow()->GetSystemData(); - //add this child pAgent->InsertAccObj(pAcc, m_xAccessible.get(), systemdata->hWnd); - //add all oldValue's existing children pAgent->InsertChildrenAccObj(pAcc); pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_ADDED, pAcc); } } else if (oldValue >>= xChild) { - //delete an existing child - if(xChild.is()) - { - XAccessible* pAcc = xChild.get(); - pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_REMOVED, pAcc); - //delete all oldValue's existing children - pAgent->DeleteChildrenAccObj( pAcc ); - //delete this child - pAgent->DeleteAccObj( pAcc ); - } + AccEventListener::HandleChildChangedEvent(oldValue, newValue); } - } /** diff --git a/winaccessibility/source/service/AccMenuEventListener.cxx b/winaccessibility/source/service/AccMenuEventListener.cxx index b9c48730d76b..411dd3b82b5f 100644 --- a/winaccessibility/source/service/AccMenuEventListener.cxx +++ b/winaccessibility/source/service/AccMenuEventListener.cxx @@ -49,9 +49,6 @@ void AccMenuEventListener::notifyEvent( const css::accessibility::AccessibleEve switch (aEvent.EventId) { - case AccessibleEventId::CHILD: - HandleChildChangedEvent(aEvent.OldValue, aEvent.NewValue); - break; case AccessibleEventId::SELECTION_CHANGED: //don't need to process anything,just same as word behavior //handleSelectionChangedEvent(); @@ -62,44 +59,6 @@ void AccMenuEventListener::notifyEvent( const css::accessibility::AccessibleEve } } -/** - * handle the CHILD event - * @param oldValue the child to be deleted - * @param newValue the child to be added - */ -void AccMenuEventListener::HandleChildChangedEvent(Any oldValue, Any newValue) -{ - - Reference< XAccessible > xChild; - if( newValue >>= xChild) - { - //create a new child - if(xChild.is()) - { - XAccessible* pAcc = xChild.get(); - //add this child - pAgent->InsertAccObj(pAcc, m_xAccessible.get()); - //add all oldValue's existing children - pAgent->InsertChildrenAccObj(pAcc); - pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_ADDED, pAcc); - } - } - else if (oldValue >>= xChild) - { - //delete an existing child - if(xChild.is()) - { - XAccessible* pAcc = xChild.get(); - pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_REMOVED, pAcc); - //delete all oldValue's existing children - pAgent->DeleteChildrenAccObj( pAcc ); - //delete this child - pAgent->DeleteAccObj( pAcc ); - } - } - -} - /** * handle the SELECTION_CHANGED event */ diff --git a/winaccessibility/source/service/AccWindowEventListener.cxx b/winaccessibility/source/service/AccWindowEventListener.cxx index a6212f4d2496..eda060f86101 100644 --- a/winaccessibility/source/service/AccWindowEventListener.cxx +++ b/winaccessibility/source/service/AccWindowEventListener.cxx @@ -49,9 +49,6 @@ void AccWindowEventListener::notifyEvent( const css::accessibility::AccessibleE switch (aEvent.EventId) { - case AccessibleEventId::CHILD: - HandleChildChangedEvent(aEvent.OldValue, aEvent.NewValue); - break; case AccessibleEventId::VISIBLE_DATA_CHANGED: HandleVisibleDataChangedEvent(); break; @@ -64,41 +61,6 @@ void AccWindowEventListener::notifyEvent( const css::accessibility::AccessibleE } } -/** - * handle the CHILD event - * @param oldValue the child to be deleted - * @param newValue the child to be added - */ -void AccWindowEventListener::HandleChildChangedEvent(Any oldValue, Any newValue) -{ - Reference< XAccessible > xChild; - if( newValue >>= xChild) - { - //create a new child - if(xChild.is()) - { - XAccessible* pAcc = xChild.get(); - //add this child - pAgent->InsertAccObj(pAcc, m_xAccessible.get()); - //add all oldValue's existing children - pAgent->InsertChildrenAccObj(pAcc); - pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_ADDED, pAcc); - } - } - else if (oldValue >>= xChild) - { - //delete an existing child - if(xChild.is()) - { - XAccessible* pAcc = xChild.get(); - pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_REMOVED, pAcc); - pAgent->DeleteChildrenAccObj( pAcc ); - //delete this child - pAgent->DeleteAccObj( pAcc ); - } - } -} - /** * set the new state and fire the MSAA event * @param state new state id commit 1d92445fcac1c51c17d8dbfd1a4017430fe7bc46 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Tue Aug 1 09:26:37 2023 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Tue Aug 1 13:14:34 2023 +0200 tdf#156561 wina11y: Handle CHILD event So far, `AccessibleEventId::CHILD` events were ignored by `AccComponentEventListener` and its base class, `AccEventListener`. As a result, no event listener would be created when e.g. a child that was previously hidden got shown, resulting e.g. in NVDA not announcing that object when it receives focus later. Handle the event and register a listener when notified about a new child and drop the old child when one gets removed, like some of the derived classes already do in pretty much the same way. (Those implementations will be cleaned up/dropped in a separate commit.) This addresses one of the root causes of why tdf#140762 ("No text spoken by screen reader for 'Borders' dropdown button items in Calc's formatting toolbar (NVDA on Windows)") occured without commit dc0706cabfe39ddb6ea23d60ccfb756f2b9e6efb Author: Michael Weghorn <m.wegh...@posteo.de> Date: Wed Mar 15 17:00:27 2023 +0100 tdf#140762 tdf#152671 Make dock win visible before showing popup , i.e. when the window is made visible only after its parent. Still, this change at least by itself does not yet solve tdf#152671 ("ui, accessibility: auto filter drop down menu is not spoken by the screen reader") and also for the case of the toolbar popup, the initially focused item would no more be announced when reverting the above-mentioned commit and its follow-up commit commit 57c2209dd04abfda90e0aba782bc174243633ec9 Author: Caolán McNamara <caol...@redhat.com> Date: Thu Apr 6 15:07:15 2023 +0100 tdf#154470 try moving the Show of the client to after the float positioning Example backtrace of the font color popup in the formatting toolbar where no event listener was created previously: 1 AccEventListener::notifyEvent AccEventListener.cxx 74 0x7ffe4b4ecf14 2 AccComponentEventListener::notifyEvent AccComponentEventListener.cxx 82 0x7ffe4b4ee699 3 comphelper::AccessibleEventNotifier::addEvent accessibleeventnotifier.cxx 256 0x7ffe5e80ebac 4 comphelper::OCommonAccessibleComponent::NotifyAccessibleEvent accessiblecomponenthelper.cxx 127 0x7ffe5e80443e 5 VCLXAccessibleToolBoxItem::NotifyChildEvent vclxaccessibletoolboxitem.cxx 213 0x7ffe4b337e10 6 VCLXAccessibleToolBox::UpdateCustomPopupItemp_Impl vclxaccessibletoolbox.cxx 373 0x7ffe4b33334d 7 VCLXAccessibleToolBox::ProcessWindowEvent vclxaccessibletoolbox.cxx 547 0x7ffe4b33263c 8 VCLXAccessibleComponent::WindowEventListener vclxaccessiblecomponent.cxx 112 0x7ffe51e871c5 9 VCLXAccessibleComponent::LinkStubWindowEventListener vclxaccessiblecomponent.cxx 98 0x7ffe51e861f6 10 Link<VclWindowEvent &,void>::Call link.hxx 111 0x7ffe504204b3 11 vcl::Window::CallEventListeners event.cxx 263 0x7ffe50420860 12 svt::PopupWindowControllerImpl::WindowEventListener popupwindowcontroller.cxx 148 0x7ffe53c65593 13 svt::PopupWindowControllerImpl::LinkStubWindowEventListener popupwindowcontroller.cxx 89 0x7ffe53c64f76 14 Link<VclWindowEvent &,void>::Call link.hxx 111 0x7ffe504204b3 15 vcl::Window::CallEventListeners event.cxx 263 0x7ffe50420860 16 vcl::Window::ImplResetReallyVisible stacking.cxx 723 0x7ffe5033d6f1 17 vcl::Window::Show window.cxx 2234 0x7ffe5053eca7 18 ImplDockingWindowWrapper::ImplPreparePopupMode dockmgr.cxx 769 0x7ffe5041154e 19 ImplDockingWindowWrapper::StartPopupMode dockmgr.cxx 816 0x7ffe50413d4c 20 DockingManager::StartPopupMode dockmgr.cxx 349 0x7ffe50413c11 ... <More> Change-Id: I62ab32342ef67c770ced9f0d2be867dc9355bd4a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155126 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/winaccessibility/inc/AccContainerEventListener.hxx b/winaccessibility/inc/AccContainerEventListener.hxx index 889b0e619e86..cf1cdb2157c4 100644 --- a/winaccessibility/inc/AccContainerEventListener.hxx +++ b/winaccessibility/inc/AccContainerEventListener.hxx @@ -47,7 +47,7 @@ public: //for child changed event virtual void HandleChildChangedEvent( - css::uno::Any oldValue, css::uno::Any newValue); + css::uno::Any oldValue, css::uno::Any newValue) override; //for selection changed event virtual void HandleSelectionChangedEvent( diff --git a/winaccessibility/inc/AccDescendantManagerEventListener.hxx b/winaccessibility/inc/AccDescendantManagerEventListener.hxx index 669143a036f6..0f0e30ed3af1 100644 --- a/winaccessibility/inc/AccDescendantManagerEventListener.hxx +++ b/winaccessibility/inc/AccDescendantManagerEventListener.hxx @@ -51,7 +51,7 @@ public: //for child changed event virtual void HandleChildChangedEvent( - css::uno::Any oldValue, css::uno::Any newValue); + css::uno::Any oldValue, css::uno::Any newValue) override; virtual void HandleChildChangedNoFocusEvent( css::uno::Any oldValue, css::uno::Any newValue); diff --git a/winaccessibility/inc/AccDialogEventListener.hxx b/winaccessibility/inc/AccDialogEventListener.hxx index bbac27b7e81c..49482474f811 100644 --- a/winaccessibility/inc/AccDialogEventListener.hxx +++ b/winaccessibility/inc/AccDialogEventListener.hxx @@ -41,7 +41,7 @@ public: notifyEvent(const css::accessibility::AccessibleEventObject& aEvent) override; //for child changed event - virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue); + virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue) override; //state changed virtual void SetComponentState(sal_Int64 state, bool enable) override; diff --git a/winaccessibility/inc/AccEventListener.hxx b/winaccessibility/inc/AccEventListener.hxx index f134981b20a7..c786b6559ae1 100644 --- a/winaccessibility/inc/AccEventListener.hxx +++ b/winaccessibility/inc/AccEventListener.hxx @@ -53,7 +53,7 @@ public: //for name changed event virtual void HandleNameChangedEvent(css::uno::Any name); - //for description changed event + virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue); virtual void HandleDescriptionChangedEvent(); //for state changed event diff --git a/winaccessibility/inc/AccFrameEventListener.hxx b/winaccessibility/inc/AccFrameEventListener.hxx index 3bf70e385516..111d1e81ced5 100644 --- a/winaccessibility/inc/AccFrameEventListener.hxx +++ b/winaccessibility/inc/AccFrameEventListener.hxx @@ -41,7 +41,7 @@ public: notifyEvent(const css::accessibility::AccessibleEventObject& aEvent) override; //for child changed event - virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue); + virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue) override; //state changed virtual void SetComponentState(sal_Int64 state, bool enable) override; diff --git a/winaccessibility/inc/AccMenuEventListener.hxx b/winaccessibility/inc/AccMenuEventListener.hxx index a029b0065c4b..93c9f0f2f867 100644 --- a/winaccessibility/inc/AccMenuEventListener.hxx +++ b/winaccessibility/inc/AccMenuEventListener.hxx @@ -41,7 +41,7 @@ public: notifyEvent(const css::accessibility::AccessibleEventObject& aEvent) override; //for child changed event - virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue); + virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue) override; //for selection changed event virtual void HandleSelectionChangedEventNoArgs(); diff --git a/winaccessibility/inc/AccWindowEventListener.hxx b/winaccessibility/inc/AccWindowEventListener.hxx index 8143ca79033e..6fb20892813b 100644 --- a/winaccessibility/inc/AccWindowEventListener.hxx +++ b/winaccessibility/inc/AccWindowEventListener.hxx @@ -41,7 +41,7 @@ public: notifyEvent(const css::accessibility::AccessibleEventObject& aEvent) override; //for child changed event - virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue); + virtual void HandleChildChangedEvent(css::uno::Any oldValue, css::uno::Any newValue) override; //state changed virtual void SetComponentState(sal_Int64 state, bool enable) override; diff --git a/winaccessibility/source/service/AccEventListener.cxx b/winaccessibility/source/service/AccEventListener.cxx index a8f8e705fd2c..d723eaaa434c 100644 --- a/winaccessibility/source/service/AccEventListener.cxx +++ b/winaccessibility/source/service/AccEventListener.cxx @@ -59,6 +59,9 @@ void AccEventListener::notifyEvent(const css::accessibility::AccessibleEventObje switch (aEvent.EventId) { + case AccessibleEventId::CHILD: + HandleChildChangedEvent(aEvent.OldValue, aEvent.NewValue); + break; case AccessibleEventId::NAME_CHANGED: HandleNameChangedEvent(aEvent.NewValue); break; @@ -93,6 +96,37 @@ void AccEventListener::HandleNameChangedEvent(Any name) pAgent->NotifyAccEvent(UnoMSAAEvent::OBJECT_NAMECHANGE, m_xAccessible.get()); } +/** + * Handle the CHILD event + * @param oldValue the child to be deleted + * @param newValue the child to be added + */ +void AccEventListener::HandleChildChangedEvent(com::sun::star::uno::Any oldValue, + com::sun::star::uno::Any newValue) +{ + Reference<XAccessible> xChild; + if (newValue >>= xChild) + { + if (xChild.is()) + { + XAccessible* pAcc = xChild.get(); + pAgent->InsertAccObj(pAcc, m_xAccessible.get()); + pAgent->InsertChildrenAccObj(pAcc); + pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_ADDED, pAcc); + } + } + else if (oldValue >>= xChild) + { + if (xChild.is()) + { + XAccessible* pAcc = xChild.get(); + pAgent->NotifyAccEvent(UnoMSAAEvent::CHILD_REMOVED, pAcc); + pAgent->DeleteChildrenAccObj(pAcc); + pAgent->DeleteAccObj(pAcc); + } + } +} + /** * handle the DESCRIPTION_CHANGED event */