office-gobmx/winaccessibility/inc/AccContainerEventListener.hxx
Michael Weghorn a10a99b0c6 wina11y: Retrieve a11y name on demand
Instead of doing extra bookkeeping to keep
`CMAccessible::m_pszName` as a class member up
to date with the current value of the accessible
name, just retrieve the current a11y name directly
from the underlying `XAccessible` when it is requested
via the IAccessible2 API in `CMAccessible::get_accName`.

This is basically the accessible name equivalent of the
the following commit that did similarly for the
accessible description:

    commit fcf4a26275
    Author: Michael Weghorn <m.weghorn@posteo.de>
    Date:   Wed Jan 5 13:41:53 2022 +0000

        tdf#146306 wina11y: Retrieve accessible desc on demand

        Adapt 'MAccessible::get_accDescription' to directly
        retrieve the accessible description on demand via the
        corresponding XAccessible, rather than keeping
        track of it in a class member.

        This simplifies the handling and makes it
        unnecessary to "manually" update the description
        on 'accessibility::AccessibleEventId::DESCRIPTION_CHANGED'
        events, since the new value will
        be queried next time it is needed anyway.

        This also fixes the problem that a significant
        amount of time was spent generating accessible
        descriptions for all newly inserted a11y objects when
        entering values into Calc cells with the NVDA
        screen reader in use, resulting in several
        seconds of delay.

        Querying up-to-date values from the underlying
        UNO interfaces on demand instead of doing extra
        manual bookkeeping in the winaccessibility code
        may be possible for more a11y attributes in addition
        to the accessible description handled in this commit,
        but each one will have to be looked at separately.

This also allows to drop the
`AccContainerEventListener::HandleNameChangedEvent` and
`AccObjectContainerEventListener::HandleStateChangedEvent`
overrides of the base class implementations unnecessary,
as the only thing they did in addition was updating the
a11y name.

This commit has no effect on events sent on the platform
layer, those are still sent as before to notify about the
name change.

Change-Id: I4d1df1d0b73ce963cdaec91d642ff5bbf2b371bc
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172148
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
2024-08-21 07:47:58 +02:00

92 lines
3.9 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#pragma once
enum class UnoMSAAEvent;
#include <stdio.h>
#include "AccEventListener.hxx"
#include <com/sun/star/accessibility/XAccessibleEventListener.hpp>
#include <com/sun/star/accessibility/XAccessible.hpp>
/**
* AccContainerEventListener is inherited from AccEventListener. It handles the events
* generated by container controls. The accessible roles are: CANVAS, COMBO_BOX, DOCUMENT,
* EMBEDDED_OBJECT, END_NOTE, FILLER, FOOTNOTE, FOOTER, GRAPHIC, HEADER, LAYERED_PANE,
* MENU_BAR, POPUP_MENU, OPTION_PANE, PAGE_TAB, PAGE_TAB_LIST, PANEL, SCROLL_PANE, SPLIT_PANE,
* STATUS_BAR, TABLE_CELL, TEXT_FRAME, TOOL_BAR, VIEW_PORT.
* It defines the procedure of specific event handling related with containers and provides
* the detailed support for some related methods.
*/
class AccContainerEventListener: public AccEventListener
{
public:
AccContainerEventListener(css::accessibility::XAccessible* pAcc, AccObjectWinManager& rManager);
virtual ~AccContainerEventListener() override;
//AccessibleEventListener
virtual void SAL_CALL notifyEvent( const css::accessibility::AccessibleEventObject& aEvent ) override;
//for selection changed event
virtual void HandleSelectionChangedEvent(
const css::uno::Any &oldValue, const css::uno::Any &newValue);
//for all children changed event
virtual void HandleAllChildrenChangedEvent();
//for text changed event
virtual void HandleTextChangedEvent(
css::uno::Any oldValue, css::uno::Any newValue);
virtual void HandleStateChangedEvent(
css::uno::Any oldValue, css::uno::Any newValue) override;
//for value changed event
virtual void HandleValueChangedEvent(
css::uno::Any oldValue, css::uno::Any newValue);
//state changed
virtual void SetComponentState(sal_Int64 state, bool enable) override;
virtual void FireStatePropertyChange(sal_Int64 state, bool set) override;
virtual void FireStateFocusedChange(bool enable) override;
virtual bool IsEditable(css::uno::Reference<css::accessibility::XAccessibleContext> const & xContext);
// update all children's state
void UpdateAllChildrenState( css::accessibility::XAccessible* pXAccessible);
bool NotifyChildEvent(UnoMSAAEvent eWinEvent, const css::uno::Any& Value);
virtual void HandleSelectionChangedAddEvent(
const css::uno::Any &oldValue, const css::uno::Any &newValue);
virtual void HandleSelectionChangedRemoveEvent(
const css::uno::Any &oldValue, const css::uno::Any &newValue);
virtual void HandleSelectionChangedWithinEvent(
const css::uno::Any &oldValue, const css::uno::Any &newValue);
virtual void HandlePageChangedEvent(
const css::uno::Any &oldValue, const css::uno::Any &newValue);
virtual void HandleSectionChangedEvent(
const css::uno::Any &oldValue, const css::uno::Any &newValue);
virtual void HandleColumnChangedEvent(
const css::uno::Any &oldValue, const css::uno::Any &newValue);
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */