ab7a94b840
When the text of an editable combobox is changed (e.g. using the up/down keys), the Orca screen reader on Linux announces the newly inserted text. This has been the case for other GTK or Qt applications for a while, and with recent Orca commit [1] commit 3a9e6b8d7b16bf2fc7919868cfd1a16e44422710 Author: Michael Weghorn <m.weghorn@posteo.de> Date: Fri May 10 10:16:58 2024 +0200 soffice: Use default logic for editable combobox value change , the same logic is used for LibreOffice as well. For the gtk3 VCL plugin which has a custom combobox implementation using native GTK widgets, this generally works since commit9f078ed7b6
Author: Michael Weghorn <m.weghorn@posteo.de> Date: Tue May 7 10:04:16 2024 +0200 tdf#160971 gtk3 a11y: Set role for custom editable combobox However, the qt6 VCL plugin uses the VCL combobox implementation, and only the actual difference between the text of the previous and current entry was sent in the TEXT_CHANGED event, resulting in Orca only announcing those letters that were added/changed, e.g. just "ans Narrow" when changing the font in the Writer formatting toolbar from "Liberation Serif" to "Liberation Sans Narrow". This doesn't really make clear what entry is selected. Align the a11y event with what GTK and Qt do and set the full old and new entry texts in the event. To do that, add a new virtual `VCLXAccessibleTextComponent:PreferFullTextInTextChangedEvent` that defaults to false to keep the previous behavior as default, and override it for `VCLXAccessibleEdit` to return true in the case that the edit is the subedit of a combobox (the parent has a combobox role). Use this in `VCLXAccessibleTextComponent::SetText` to determine whether to notify just of the changed characters or to send the whole old/new text. With this in place, Orca also announces the whole new entry text (e.g. "Liberation Sans Narrow" for the above example) when using the qt6 VCL plugin. (It currently additionally announces an extra "Selection deleted" when switching entries, as the text selection also changes, but that aspect is to be handled separate from this change here.) [1]3a9e6b8d7b
Change-Id: I240aa0ad5ac9585e007d67a8c69e305cf1f38185 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167479 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
108 lines
5.5 KiB
C++
108 lines
5.5 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
|
|
|
|
#include <standard/vclxaccessibletextcomponent.hxx>
|
|
#include <com/sun/star/accessibility/AccessibleScrollType.hpp>
|
|
#include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
|
|
#include <com/sun/star/accessibility/XAccessibleAction.hpp>
|
|
|
|
#include <cppuhelper/implbase.hxx>
|
|
|
|
|
|
|
|
|
|
class VCLXAccessibleEdit : public cppu::ImplInheritanceHelper<
|
|
VCLXAccessibleTextComponent,
|
|
css::accessibility::XAccessibleAction,
|
|
css::accessibility::XAccessibleEditableText>
|
|
{
|
|
friend class VCLXAccessibleBox;
|
|
|
|
private:
|
|
sal_Int32 m_nCaretPosition;
|
|
|
|
protected:
|
|
virtual ~VCLXAccessibleEdit() override = default;
|
|
|
|
virtual void ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) override;
|
|
virtual void FillAccessibleStateSet( sal_Int64& rStateSet ) override;
|
|
sal_Int16 implGetAccessibleRole();
|
|
|
|
// OCommonAccessibleText
|
|
virtual OUString implGetText() override;
|
|
virtual void implGetSelection( sal_Int32& nStartIndex, sal_Int32& nEndIndex ) override;
|
|
|
|
// VCLXAccessibleTextComponent
|
|
virtual bool PreferFullTextInTextChangedEvent() override;
|
|
|
|
public:
|
|
VCLXAccessibleEdit( VCLXWindow* pVCLXindow );
|
|
|
|
// XServiceInfo
|
|
virtual OUString SAL_CALL getImplementationName() override;
|
|
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
|
|
|
|
// XAccessibleContext
|
|
virtual sal_Int64 SAL_CALL getAccessibleChildCount( ) override;
|
|
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int64 i ) override;
|
|
virtual sal_Int16 SAL_CALL getAccessibleRole( ) override;
|
|
|
|
// XAccessibleAction
|
|
virtual sal_Int32 SAL_CALL getAccessibleActionCount( ) override;
|
|
virtual sal_Bool SAL_CALL doAccessibleAction ( sal_Int32 nIndex ) override;
|
|
virtual OUString SAL_CALL getAccessibleActionDescription ( sal_Int32 nIndex ) override;
|
|
virtual css::uno::Reference< css::accessibility::XAccessibleKeyBinding > SAL_CALL getAccessibleActionKeyBinding( sal_Int32 nIndex ) override;
|
|
|
|
// XAccessibleText
|
|
virtual sal_Int32 SAL_CALL getCaretPosition( ) override;
|
|
virtual sal_Bool SAL_CALL setCaretPosition( sal_Int32 nIndex ) override;
|
|
virtual sal_Unicode SAL_CALL getCharacter( sal_Int32 nIndex ) override;
|
|
virtual css::uno::Sequence< css::beans::PropertyValue > SAL_CALL getCharacterAttributes( sal_Int32 nIndex, const css::uno::Sequence< OUString >& aRequestedAttributes ) override;
|
|
virtual css::awt::Rectangle SAL_CALL getCharacterBounds( sal_Int32 nIndex ) override;
|
|
virtual sal_Int32 SAL_CALL getCharacterCount( ) override;
|
|
virtual sal_Int32 SAL_CALL getIndexAtPoint( const css::awt::Point& aPoint ) override;
|
|
virtual OUString SAL_CALL getSelectedText( ) override;
|
|
virtual sal_Int32 SAL_CALL getSelectionStart( ) override;
|
|
virtual sal_Int32 SAL_CALL getSelectionEnd( ) override;
|
|
virtual sal_Bool SAL_CALL setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
|
|
virtual OUString SAL_CALL getText( ) override;
|
|
virtual OUString SAL_CALL getTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
|
|
virtual css::accessibility::TextSegment SAL_CALL getTextAtIndex( sal_Int32 nIndex, sal_Int16 aTextType ) override;
|
|
virtual css::accessibility::TextSegment SAL_CALL getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) override;
|
|
virtual css::accessibility::TextSegment SAL_CALL getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) override;
|
|
virtual sal_Bool SAL_CALL copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
|
|
virtual sal_Bool SAL_CALL scrollSubstringTo( sal_Int32 nStartIndex, sal_Int32 nEndIndex, css::accessibility::AccessibleScrollType aScrollType) override;
|
|
|
|
// XAccessibleEditableText
|
|
virtual sal_Bool SAL_CALL cutText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
|
|
virtual sal_Bool SAL_CALL pasteText( sal_Int32 nIndex ) override;
|
|
virtual sal_Bool SAL_CALL deleteText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) override;
|
|
virtual sal_Bool SAL_CALL insertText( const OUString& sText, sal_Int32 nIndex ) override;
|
|
virtual sal_Bool SAL_CALL replaceText( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const OUString& sReplacement ) override;
|
|
virtual sal_Bool SAL_CALL setAttributes( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const css::uno::Sequence< css::beans::PropertyValue >& aAttributeSet ) override;
|
|
virtual sal_Bool SAL_CALL setText( const OUString& sText ) override;
|
|
|
|
private:
|
|
bool isEditable();
|
|
};
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|