summaryrefslogtreecommitdiff
path: root/starmath/inc
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2019-05-26 14:53:33 +0000
committerJan-Marek Glogowski <glogow@fbihome.de>2019-05-29 20:14:38 +0200
commita7e52282e36987f4ca6bed968e87ada6849b10e8 (patch)
tree891e7dd4e986528d55e6866801221273a87a3e17 /starmath/inc
parent3eba9602197da972b66f2b7cc72b61cbdffe5a52 (diff)
tdf#65587 SM implement ElementControl accessibility
This took me ages to implement. I'm still not 100% sure, it works correct. One main problem was the loop where the ATK listener will rebuild the list of children based on the current child count. Then there is the "broken" SPI bridge behaviour. I could actually test this with the gtk3 backend just fine, if I started LO *after* the accerciser. Otherwise the displayed tree will be really broken and the add and remove child events won't be correctly processed, because some Windows in the hierarchy will return a negative parent index. And generally the accerciser has various problems, with most result in Python backtraces an inconsistent app state, but even SIGSEGV happened a few time. Already have some patches for the easy reproducible ones. No idea what will happen on any other setup then Linux with ATK. Change-Id: I3280fd8622966be74e3833621952d95a2671d214 Reviewed-on: https://gerrit.libreoffice.org/73077 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Diffstat (limited to 'starmath/inc')
-rw-r--r--starmath/inc/AccessibleSmElement.hxx107
-rw-r--r--starmath/inc/AccessibleSmElementsControl.hxx116
-rw-r--r--starmath/inc/ElementsDockingWindow.hxx20
3 files changed, 243 insertions, 0 deletions
diff --git a/starmath/inc/AccessibleSmElement.hxx b/starmath/inc/AccessibleSmElement.hxx
new file mode 100644
index 000000000000..9b168bbee4cb
--- /dev/null
+++ b/starmath/inc/AccessibleSmElement.hxx
@@ -0,0 +1,107 @@
+/* -*- 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 .
+ */
+#ifndef INCLUDED_STARMATH_INC_ACCESSIBLESMELEMENT_HXX
+#define INCLUDED_STARMATH_INC_ACCESSIBLESMELEMENT_HXX
+
+#include <com/sun/star/accessibility/XAccessible.hpp>
+#include <com/sun/star/accessibility/XAccessibleAction.hpp>
+#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
+#include <com/sun/star/accessibility/XAccessibleContext.hpp>
+#include <com/sun/star/accessibility/XAccessibleStateSet.hpp>
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <cppuhelper/implbase3.hxx>
+#include <comphelper/accessiblecomponenthelper.hxx>
+#include <sal/types.h>
+#include <vcl/vclptr.hxx>
+
+class SmElementsControl;
+
+typedef ::cppu::ImplHelper3<css::lang::XServiceInfo, css::accessibility::XAccessible,
+ css::accessibility::XAccessibleAction>
+ AccessibleSmElement_BASE;
+
+class AccessibleSmElement final : public comphelper::OAccessibleComponentHelper,
+ public AccessibleSmElement_BASE
+{
+ VclPtr<SmElementsControl> m_pSmElementsControl;
+ const sal_Int32 m_nIndexInParent; ///< index in the parent XAccessible
+ const sal_uInt16 m_nItemId; ///< index in the SmElementsControl
+ bool m_bHasFocus;
+ sal_Int16 m_nRole;
+
+ ~AccessibleSmElement() override;
+ void SAL_CALL disposing() override;
+ css::awt::Rectangle implGetBounds() override;
+
+ void testAction(sal_Int32) const;
+
+public:
+ explicit AccessibleSmElement(SmElementsControl* pSmElementsControl, sal_uInt16 nItemId,
+ sal_Int32 nIndexInParent);
+
+ void SetFocus(bool _bFocus);
+ bool HasFocus() const { return m_bHasFocus; }
+ void ReleaseSmElementsControl() { m_pSmElementsControl = nullptr; }
+ sal_uInt16 itemId() const { return m_nItemId; }
+
+ DECLARE_XINTERFACE()
+ DECLARE_XTYPEPROVIDER()
+
+ // XAccessible
+ css::uno::Reference<css::accessibility::XAccessibleContext>
+ SAL_CALL getAccessibleContext() override;
+
+ // XServiceInfo
+ OUString SAL_CALL getImplementationName() override;
+ sal_Bool SAL_CALL supportsService(const OUString& rServiceName) override;
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ // XAccessibleContext
+ sal_Int32 SAL_CALL getAccessibleChildCount() override;
+ css::uno::Reference<css::accessibility::XAccessible>
+ SAL_CALL getAccessibleChild(sal_Int32 i) override;
+ css::uno::Reference<css::accessibility::XAccessible> SAL_CALL getAccessibleParent() override;
+ sal_Int32 SAL_CALL getAccessibleIndexInParent() override;
+ sal_Int16 SAL_CALL getAccessibleRole() override;
+ OUString SAL_CALL getAccessibleDescription() override;
+ OUString SAL_CALL getAccessibleName() override;
+ css::uno::Reference<css::accessibility::XAccessibleRelationSet>
+ SAL_CALL getAccessibleRelationSet() override;
+ css::uno::Reference<css::accessibility::XAccessibleStateSet>
+ SAL_CALL getAccessibleStateSet() override;
+
+ // XAccessibleComponent
+ css::uno::Reference<css::accessibility::XAccessible>
+ SAL_CALL getAccessibleAtPoint(const css::awt::Point& aPoint) override;
+ void SAL_CALL grabFocus() override;
+ sal_Int32 SAL_CALL getForeground() override;
+ sal_Int32 SAL_CALL getBackground() override;
+
+ // XAccessibleAction
+ sal_Int32 SAL_CALL getAccessibleActionCount() override;
+ sal_Bool SAL_CALL doAccessibleAction(sal_Int32 nIndex) override;
+ OUString SAL_CALL getAccessibleActionDescription(sal_Int32 nIndex) override;
+ css::uno::Reference<css::accessibility::XAccessibleKeyBinding>
+ SAL_CALL getAccessibleActionKeyBinding(sal_Int32 nIndex) override;
+};
+
+#endif // INCLUDED_STARMATH_INC_ACCESSIBLESMELEMENT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/starmath/inc/AccessibleSmElementsControl.hxx b/starmath/inc/AccessibleSmElementsControl.hxx
new file mode 100644
index 000000000000..d38d57dc92c2
--- /dev/null
+++ b/starmath/inc/AccessibleSmElementsControl.hxx
@@ -0,0 +1,116 @@
+/* -*- 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 .
+ */
+#ifndef INCLUDED_STARMATH_INC_ACCESSIBLESMELEMENTSCONTROL_HXX
+#define INCLUDED_STARMATH_INC_ACCESSIBLESMELEMENTSCONTROL_HXX
+
+#include <comphelper/accessiblecomponenthelper.hxx>
+#include <com/sun/star/accessibility/XAccessibleSelection.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <cppuhelper/implbase3.hxx>
+#include <vcl/vclptr.hxx>
+
+#include <vector>
+
+class AccessibleSmElement;
+class SmElementsControl;
+
+typedef ::cppu::ImplHelper3<css::lang::XServiceInfo, css::accessibility::XAccessible,
+ css::accessibility::XAccessibleSelection>
+ AccessibleSmElementsControl_BASE;
+
+class AccessibleSmElementsControl final : public comphelper::OAccessibleComponentHelper,
+ public AccessibleSmElementsControl_BASE
+{
+ std::vector<rtl::Reference<AccessibleSmElement>> m_aAccessibleChildren;
+ VclPtr<SmElementsControl> m_pControl;
+
+ AccessibleSmElement* GetItem_Impl(sal_uInt16 _nPos);
+ void ReleaseFocus_Impl(sal_uInt16 _nPos);
+ sal_Int32 implGetAccessibleChildCount();
+ void ReleaseItems(bool bNotifyRemoval);
+ void UpdateFocus(sal_uInt16);
+ inline void TestControl();
+
+ ~AccessibleSmElementsControl() override;
+ void SAL_CALL disposing() override;
+ css::awt::Rectangle implGetBounds() override;
+
+public:
+ AccessibleSmElementsControl(SmElementsControl& rControl);
+
+ void ReleaseAllItems(bool bNotify);
+ void AddAllItems();
+ inline void AcquireFocus();
+ inline void ReleaseFocus(sal_uInt16);
+
+ DECLARE_XINTERFACE()
+ DECLARE_XTYPEPROVIDER()
+
+ // XAccessible
+ css::uno::Reference<css::accessibility::XAccessibleContext>
+ SAL_CALL getAccessibleContext() override;
+
+ // XServiceInfo
+ OUString SAL_CALL getImplementationName() override;
+ sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ // XAccessibleComponent
+ sal_Bool SAL_CALL containsPoint(const css::awt::Point& aPoint) override;
+ css::uno::Reference<css::accessibility::XAccessible>
+ SAL_CALL getAccessibleAtPoint(const css::awt::Point& aPoint) override;
+ css::awt::Rectangle SAL_CALL getBounds() override;
+ css::awt::Point SAL_CALL getLocation() override;
+ css::awt::Point SAL_CALL getLocationOnScreen() override;
+ css::awt::Size SAL_CALL getSize() override;
+ void SAL_CALL grabFocus() override;
+ sal_Int32 SAL_CALL getForeground() override;
+ sal_Int32 SAL_CALL getBackground() override;
+
+ // XAccessibleContext
+ sal_Int32 SAL_CALL getAccessibleChildCount() override;
+ css::uno::Reference<css::accessibility::XAccessible>
+ SAL_CALL getAccessibleChild(sal_Int32 i) override;
+ css::uno::Reference<css::accessibility::XAccessible> SAL_CALL getAccessibleParent() override;
+ sal_Int16 SAL_CALL getAccessibleRole() override;
+ OUString SAL_CALL getAccessibleDescription() override;
+ OUString SAL_CALL getAccessibleName() override;
+ css::uno::Reference<css::accessibility::XAccessibleRelationSet>
+ SAL_CALL getAccessibleRelationSet() override;
+ css::uno::Reference<css::accessibility::XAccessibleStateSet>
+ SAL_CALL getAccessibleStateSet() override;
+
+ // XAccessibleSelection
+ void SAL_CALL selectAccessibleChild(sal_Int32 nChildIndex) override;
+ sal_Bool SAL_CALL isAccessibleChildSelected(sal_Int32 nChildIndex) override;
+ void SAL_CALL clearAccessibleSelection() override;
+ void SAL_CALL selectAllAccessibleChildren() override;
+ sal_Int32 SAL_CALL getSelectedAccessibleChildCount() override;
+ css::uno::Reference<css::accessibility::XAccessible>
+ SAL_CALL getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex) override;
+ void SAL_CALL deselectAccessibleChild(sal_Int32 nChildIndex) override;
+};
+
+void AccessibleSmElementsControl::AcquireFocus() { UpdateFocus(SAL_MAX_UINT16); }
+
+void AccessibleSmElementsControl::ReleaseFocus(sal_uInt16 nPos) { UpdateFocus(nPos); }
+
+#endif // INCLUDED_STARMATH_INC_ACCESSIBLESMELEMENTSCONTROL_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/starmath/inc/ElementsDockingWindow.hxx b/starmath/inc/ElementsDockingWindow.hxx
index 0fdb3fc72369..aaa992b97f77 100644
--- a/starmath/inc/ElementsDockingWindow.hxx
+++ b/starmath/inc/ElementsDockingWindow.hxx
@@ -27,6 +27,8 @@
#include <memory>
#include <tuple>
+#include "AccessibleSmElementsControl.hxx"
+
class SmDocShell;
class SmNode;
@@ -88,12 +90,14 @@ class SmElementsControl : public Control
virtual void GetFocus() override;
virtual void LoseFocus() override;
virtual void KeyInput(const KeyEvent& rKEvt) override;
+ css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override;
SmDocShell* mpDocShell;
SmFormat maFormat;
OString msCurrentSetId;
sal_uInt16 m_nCurrentElement;
sal_uInt16 m_nCurrentRolloverElement;
+ sal_uInt16 m_nCurrentOffset;
Link<SmElement&,void> maSelectHdlLink;
std::vector< std::unique_ptr<SmElement> > maElementList;
@@ -101,10 +105,12 @@ class SmElementsControl : public Control
bool mbVerticalMode;
VclPtr< ScrollBar > mxScroll;
bool m_bFirstPaintAfterLayout;
+ rtl::Reference<AccessibleSmElementsControl> m_xAccessible;
void addElement(const OUString& aElementVisual, const OUString& aElementSource, const OUString& aHelpText);
void addElements(const SmElementDescr aElementsArray[], sal_uInt16 size);
SmElement* current() const;
+ void setCurrentElement(sal_uInt16);
bool hasRollover() const { return m_nCurrentRolloverElement != SAL_MAX_UINT16; }
void stepFocus(const bool bBackward);
@@ -126,10 +132,24 @@ public:
static const auto& categories() { return m_aCategories; }
static size_t categoriesSize() { return m_aCategoriesSize; }
+ OString elementSetId() const { return msCurrentSetId; }
void setElementSetId(const char* pSetId);
void setVerticalMode(bool bVertical);
+ sal_uInt16 itemCount() const;
+ sal_uInt16 itemHighlighted() const;
+ sal_uInt16 itemFocused() const;
+ sal_uInt16 itemAtPos(const Point& rPos) const;
+ tools::Rectangle itemPosRect(sal_uInt16) const;
+ bool itemIsSeparator(sal_uInt16) const;
+ bool itemIsVisible(sal_uInt16) const;
+ OUString itemName(sal_uInt16) const;
+ bool itemTrigger(sal_uInt16);
+ void setItemHighlighted(sal_uInt16);
+ sal_uInt16 itemOffset() const { return m_nCurrentOffset; }
+ css::uno::Reference<css::accessibility::XAccessible> scrollbarAccessible() const;
+
Size GetOptimalSize() const override;
DECL_LINK( ScrollHdl, ScrollBar*, void );