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
  */

Reply via email to