[Libreoffice-commits] core.git: vcl/CustomTarget_qt5_moc.mk vcl/inc vcl/Library_vclplug_qt5.mk vcl/qt5

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Sep 27 15:05:27 UTC 2018


 vcl/CustomTarget_qt5_moc.mk         |    2 
 vcl/Library_vclplug_qt5.mk          |    2 
 vcl/inc/qt5/Qt5AccessibleWidget.hxx |   77 +++++
 vcl/inc/qt5/Qt5VclWindow.hxx        |   31 ++
 vcl/inc/qt5/Qt5Widget.hxx           |    3 
 vcl/qt5/Qt5AccessibleWidget.cxx     |  511 ++++++++++++++++++++++++++++++++++++
 vcl/qt5/Qt5MainWindow.cxx           |    3 
 vcl/qt5/Qt5VclWindow.cxx            |   26 +
 8 files changed, 653 insertions(+), 2 deletions(-)

New commits:
commit 4d382636b0b1c555af2b98f2f41b4776fd7b5ffb
Author:     Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
AuthorDate: Fri Sep 21 10:20:09 2018 +0200
Commit:     Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
CommitDate: Thu Sep 27 17:05:02 2018 +0200

    qt5: Add basic a11y support
    
    Widget tree is displayed and basic role mapping is available.
    Still needs quite some work (positions, actions, texts, etc.)
    
    Change-Id: I9d26a762f1d9684f33bbb80a384cf2a0b8a905c0
    Reviewed-on: https://gerrit.libreoffice.org/60853
    Tested-by: Jenkins
    Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>

diff --git a/vcl/CustomTarget_qt5_moc.mk b/vcl/CustomTarget_qt5_moc.mk
index 1ef8b89f9f48..ab8deea2e950 100644
--- a/vcl/CustomTarget_qt5_moc.mk
+++ b/vcl/CustomTarget_qt5_moc.mk
@@ -10,12 +10,14 @@
 $(eval $(call gb_CustomTarget_CustomTarget,vcl/qt5))
 
 $(call gb_CustomTarget_get_target,vcl/qt5) : \
+	$(call gb_CustomTarget_get_workdir,vcl/qt5)/Qt5AccessibleWidget.moc \
 	$(call gb_CustomTarget_get_workdir,vcl/qt5)/Qt5FilePicker.moc \
 	$(call gb_CustomTarget_get_workdir,vcl/qt5)/Qt5Frame.moc \
 	$(call gb_CustomTarget_get_workdir,vcl/qt5)/Qt5Instance.moc \
 	$(call gb_CustomTarget_get_workdir,vcl/qt5)/Qt5MainWindow.moc \
 	$(call gb_CustomTarget_get_workdir,vcl/qt5)/Qt5Menu.moc \
 	$(call gb_CustomTarget_get_workdir,vcl/qt5)/Qt5Timer.moc \
+	$(call gb_CustomTarget_get_workdir,vcl/qt5)/Qt5VclWindow.moc \
 	$(call gb_CustomTarget_get_workdir,vcl/qt5)/Qt5Widget.moc \
 
 $(call gb_CustomTarget_get_workdir,vcl/qt5)/%.moc : \
diff --git a/vcl/Library_vclplug_qt5.mk b/vcl/Library_vclplug_qt5.mk
index d66a82319ed2..3d350afe6a36 100644
--- a/vcl/Library_vclplug_qt5.mk
+++ b/vcl/Library_vclplug_qt5.mk
@@ -80,6 +80,7 @@ $(eval $(call gb_Library_add_libs,vclplug_qt5,\
 endif
 
 $(eval $(call gb_Library_add_exception_objects,vclplug_qt5,\
+    vcl/qt5/Qt5AccessibleWidget \
     vcl/qt5/Qt5Bitmap \
     vcl/qt5/Qt5Data \
     vcl/qt5/Qt5FilePicker \
@@ -101,6 +102,7 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_qt5,\
     vcl/qt5/Qt5Timer \
     vcl/qt5/Qt5Tools \
     vcl/qt5/Qt5VirtualDevice \
+    vcl/qt5/Qt5VclWindow \
     vcl/qt5/Qt5Widget \
 ))
 
diff --git a/vcl/inc/qt5/Qt5AccessibleWidget.hxx b/vcl/inc/qt5/Qt5AccessibleWidget.hxx
new file mode 100644
index 000000000000..df6862567dd0
--- /dev/null
+++ b/vcl/inc/qt5/Qt5AccessibleWidget.hxx
@@ -0,0 +1,77 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+#include <vclpluginapi.h>
+
+#include <QtCore/QObject>
+#include <QtCore/QPair>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QVector>
+#include <QtGui/QAccessible>
+#include <QtGui/QAccessibleActionInterface>
+#include <QtGui/QAccessibleInterface>
+#include <QtGui/QColor>
+#include <QtGui/QWindow>
+
+#include <vcl/window.hxx>
+
+class Qt5Frame;
+class Qt5Widget;
+
+class VCLPLUG_QT5_PUBLIC Qt5AccessibleWidget : public QObject, public QAccessibleInterface
+//public QAccessibleActionInterface
+{
+    Q_OBJECT
+
+public:
+    Qt5AccessibleWidget(Qt5Widget* pFrame, vcl::Window* pWindow);
+    Qt5AccessibleWidget(vcl::Window* pWindow);
+    QWindow* window() const override;
+    int childCount() const override;
+    int indexOfChild(const QAccessibleInterface* child) const override;
+    QVector<QPair<QAccessibleInterface*, QAccessible::Relation>>
+    relations(QAccessible::Relation match = QAccessible::AllRelations) const override;
+    QAccessibleInterface* focusChild() const override;
+
+    QRect rect() const override;
+
+    QAccessibleInterface* parent() const override;
+    QAccessibleInterface* child(int index) const override;
+
+    QString text(QAccessible::Text t) const override;
+    QAccessible::Role role() const override;
+    QAccessible::State state() const override;
+
+    QColor foregroundColor() const override;
+    QColor backgroundColor() const override;
+
+    bool isValid() const override;
+    QObject* object() const override;
+    void setText(QAccessible::Text t, const QString& text) override;
+    QAccessibleInterface* childAt(int x, int y) const override;
+
+    void* interface_cast(QAccessible::InterfaceType t) override;
+
+    // QAccessibleActionInterface
+    /*  QStringList actionNames() const override;
+    void doAction(const QString& actionName) override;
+    QStringList keyBindingsForAction(const QString& actionName) const override; */
+
+    // Factory
+    static QAccessibleInterface* customFactory(const QString& classname, QObject* object);
+
+private:
+    Qt5Widget* m_pFrame;
+    VclPtr<vcl::Window> m_pWindow;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/qt5/Qt5VclWindow.hxx b/vcl/inc/qt5/Qt5VclWindow.hxx
new file mode 100644
index 000000000000..f7883aa67c4d
--- /dev/null
+++ b/vcl/inc/qt5/Qt5VclWindow.hxx
@@ -0,0 +1,31 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+#include <vclpluginapi.h>
+
+#include <QtCore/QObject>
+
+#include <vcl/window.hxx>
+
+class Qt5Frame;
+class Qt5Widget;
+
+// Wrapper class to hold a vcl::Window while being able to pass it as a QObject
+class VCLPLUG_QT5_PUBLIC Qt5VclWindow : public QObject
+{
+    Q_OBJECT
+
+public:
+    Qt5VclWindow(vcl::Window* pWindow);
+    VclPtr<vcl::Window> m_pWindow;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/qt5/Qt5Widget.hxx b/vcl/inc/qt5/Qt5Widget.hxx
index ba558f82be38..101ae6d68f67 100644
--- a/vcl/inc/qt5/Qt5Widget.hxx
+++ b/vcl/inc/qt5/Qt5Widget.hxx
@@ -36,8 +36,6 @@ class Qt5Widget : public QWidget
 {
     Q_OBJECT
 
-    Qt5Frame* m_pFrame;
-
     bool handleKeyEvent(QKeyEvent*, bool);
     void handleMouseButtonEvent(QMouseEvent*, bool);
 
@@ -57,6 +55,7 @@ class Qt5Widget : public QWidget
 
 public:
     Qt5Widget(Qt5Frame& rFrame, Qt::WindowFlags f = Qt::WindowFlags());
+    Qt5Frame* m_pFrame;
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/Qt5AccessibleWidget.cxx b/vcl/qt5/Qt5AccessibleWidget.cxx
new file mode 100644
index 000000000000..bdc16488c9ca
--- /dev/null
+++ b/vcl/qt5/Qt5AccessibleWidget.cxx
@@ -0,0 +1,511 @@
+/* -*- 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 .
+ */
+
+#include <Qt5AccessibleWidget.hxx>
+#include <Qt5AccessibleWidget.moc>
+
+#include <QtGui/QAccessibleInterface>
+
+#include <Qt5Frame.hxx>
+#include <Qt5Tools.hxx>
+#include <Qt5VclWindow.hxx>
+#include <Qt5Widget.hxx>
+
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+
+#include <sal/log.hxx>
+#include <vcl/popupmenuwindow.hxx>
+
+using namespace css::accessibility;
+
+Qt5AccessibleWidget::Qt5AccessibleWidget(Qt5Widget* pFrame, vcl::Window* pWindow)
+    : m_pFrame(pFrame)
+    , m_pWindow(pWindow)
+{
+}
+
+Qt5AccessibleWidget::Qt5AccessibleWidget(vcl::Window* pWindow)
+    : m_pWindow(pWindow)
+{
+}
+
+QWindow* Qt5AccessibleWidget::window() const { return nullptr; }
+
+int Qt5AccessibleWidget::childCount() const
+{
+    if (!m_pWindow.get())
+        return 0;
+
+    return m_pWindow->GetAccessibleChildWindowCount();
+}
+
+int Qt5AccessibleWidget::indexOfChild(const QAccessibleInterface* /* child */) const { return 0; }
+QVector<QPair<QAccessibleInterface*, QAccessible::Relation>>
+    Qt5AccessibleWidget::relations(QAccessible::Relation /* match */) const
+{
+    return QVector<QPair<QAccessibleInterface*, QAccessible::Relation>>();
+}
+
+QAccessibleInterface* Qt5AccessibleWidget::focusChild() const
+{
+    if (m_pWindow->HasChildPathFocus())
+        return QAccessible::queryAccessibleInterface(
+            new Qt5VclWindow(Application::GetFocusWindow()));
+    return QAccessible::queryAccessibleInterface(object());
+}
+
+QRect Qt5AccessibleWidget::rect() const
+{
+    if (!m_pWindow.get())
+        return QRect();
+
+    SolarMutexGuard aSolarGuard;
+
+    // TODO: This seems to return a relative position (to the parent window).
+    // Needs to be absolute instead.
+    Point aPoint(m_pWindow->GetPosPixel());
+    Size aSize(m_pWindow->GetSizePixel());
+
+    return QRect(aPoint.X(), aPoint.Y(), aSize.Width(), aSize.Height());
+}
+
+QAccessibleInterface* Qt5AccessibleWidget::parent() const
+{
+    if (!m_pWindow)
+        return QAccessible::queryAccessibleInterface(nullptr);
+
+    return QAccessible::queryAccessibleInterface(
+        new Qt5VclWindow(m_pWindow->GetAccessibleParentWindow()));
+}
+QAccessibleInterface* Qt5AccessibleWidget::child(int index) const
+{
+    if (!m_pWindow)
+        return QAccessible::queryAccessibleInterface(nullptr);
+
+    return QAccessible::queryAccessibleInterface(
+        new Qt5VclWindow(m_pWindow->GetAccessibleChildWindow(index)));
+}
+
+QString Qt5AccessibleWidget::text(QAccessible::Text text) const
+{
+    if (!m_pWindow.get())
+        return QString();
+
+    SolarMutexGuard aSolarGuard;
+
+    switch (text)
+    {
+        case QAccessible::Name:
+            return toQString(m_pWindow->GetAccessibleName());
+        case QAccessible::Description:
+        case QAccessible::DebugDescription:
+            return toQString(m_pWindow->GetAccessibleDescription());
+        case QAccessible::Value:
+        case QAccessible::Help:
+        case QAccessible::Accelerator:
+        case QAccessible::UserText:
+        default:
+            return QString("Unknown");
+    }
+}
+QAccessible::Role Qt5AccessibleWidget::role() const
+{
+    if (!m_pWindow.get())
+        return QAccessible::NoRole;
+
+    switch (m_pWindow->GetAccessibleRole())
+    {
+        case AccessibleRole::UNKNOWN:
+            return QAccessible::NoRole;
+
+        case AccessibleRole::ALERT:
+            return QAccessible::AlertMessage;
+
+        case AccessibleRole::COLUMN_HEADER:
+            return QAccessible::ColumnHeader;
+
+        case AccessibleRole::CANVAS:
+            return QAccessible::Canvas;
+
+        case AccessibleRole::CHECK_BOX:
+            return QAccessible::CheckBox;
+
+        case AccessibleRole::CHECK_MENU_ITEM:
+            return QAccessible::MenuItem;
+
+        case AccessibleRole::COLOR_CHOOSER:
+            return QAccessible::ColorChooser;
+
+        case AccessibleRole::COMBO_BOX:
+            return QAccessible::ComboBox;
+
+        case AccessibleRole::DATE_EDITOR:
+            return QAccessible::EditableText;
+
+        case AccessibleRole::DESKTOP_ICON:
+            return QAccessible::Graphic;
+
+        case AccessibleRole::DESKTOP_PANE:
+        case AccessibleRole::DIRECTORY_PANE:
+            return QAccessible::Pane;
+
+        case AccessibleRole::DIALOG:
+            return QAccessible::Dialog;
+
+        case AccessibleRole::DOCUMENT:
+            return QAccessible::Document;
+
+        case AccessibleRole::EMBEDDED_OBJECT:
+            return QAccessible::UserRole;
+
+        case AccessibleRole::END_NOTE:
+            return QAccessible::Note;
+
+        case AccessibleRole::FILLER:
+            return QAccessible::Whitespace;
+
+        case AccessibleRole::FONT_CHOOSER:
+            return QAccessible::UserRole;
+
+        case AccessibleRole::FOOTER:
+            return QAccessible::Footer;
+
+        case AccessibleRole::FOOTNOTE:
+            return QAccessible::Note;
+
+        case AccessibleRole::FRAME: // top-level window with title bar
+            return QAccessible::Window;
+
+        case AccessibleRole::GLASS_PANE:
+            return QAccessible::UserRole;
+
+        case AccessibleRole::GRAPHIC:
+            return QAccessible::Graphic;
+
+        case AccessibleRole::GROUP_BOX:
+            return QAccessible::Grouping;
+
+        case AccessibleRole::HEADER:
+            return QAccessible::UserRole;
+
+        case AccessibleRole::HEADING:
+            return QAccessible::Heading;
+
+        case AccessibleRole::HYPER_LINK:
+            return QAccessible::Link;
+
+        case AccessibleRole::ICON:
+            return QAccessible::Graphic;
+
+        case AccessibleRole::INTERNAL_FRAME:
+            return QAccessible::UserRole;
+
+        case AccessibleRole::LABEL:
+            return QAccessible::StaticText;
+
+        case AccessibleRole::LAYERED_PANE:
+            return QAccessible::Pane;
+
+        case AccessibleRole::LIST:
+            return QAccessible::List;
+
+        case AccessibleRole::LIST_ITEM:
+            return QAccessible::ListItem;
+
+        case AccessibleRole::MENU:
+        case AccessibleRole::MENU_BAR:
+            return QAccessible::MenuBar;
+
+        case AccessibleRole::MENU_ITEM:
+            return QAccessible::MenuItem;
+
+        case AccessibleRole::OPTION_PANE:
+            return QAccessible::Pane;
+
+        case AccessibleRole::PAGE_TAB:
+            return QAccessible::PageTab;
+
+        case AccessibleRole::PAGE_TAB_LIST:
+            return QAccessible::PageTabList;
+
+        case AccessibleRole::PANEL:
+            return QAccessible::Pane;
+
+        case AccessibleRole::PARAGRAPH:
+            return QAccessible::Paragraph;
+
+        case AccessibleRole::PASSWORD_TEXT:
+            return QAccessible::EditableText;
+
+        case AccessibleRole::POPUP_MENU:
+            return QAccessible::PopupMenu;
+
+        case AccessibleRole::PUSH_BUTTON:
+            return QAccessible::Button;
+
+        case AccessibleRole::PROGRESS_BAR:
+            return QAccessible::ProgressBar;
+
+        case AccessibleRole::RADIO_BUTTON:
+            return QAccessible::RadioButton;
+
+        case AccessibleRole::RADIO_MENU_ITEM:
+            return QAccessible::MenuItem;
+
+        case AccessibleRole::ROW_HEADER:
+            return QAccessible::RowHeader;
+
+        case AccessibleRole::ROOT_PANE:
+            return QAccessible::Pane;
+
+        case AccessibleRole::SCROLL_BAR:
+            return QAccessible::ScrollBar;
+
+        case AccessibleRole::SCROLL_PANE:
+            return QAccessible::Pane;
+
+        case AccessibleRole::SHAPE:
+            return QAccessible::Graphic;
+
+        case AccessibleRole::SEPARATOR:
+            return QAccessible::Separator;
+
+        case AccessibleRole::SLIDER:
+            return QAccessible::Slider;
+
+        case AccessibleRole::SPIN_BOX:
+            return QAccessible::SpinBox;
+
+        case AccessibleRole::SPLIT_PANE:
+            return QAccessible::Pane;
+
+        case AccessibleRole::STATUS_BAR:
+            return QAccessible::StatusBar;
+
+        case AccessibleRole::TABLE:
+            return QAccessible::Table;
+
+        case AccessibleRole::TABLE_CELL:
+            return QAccessible::Cell;
+
+        case AccessibleRole::TEXT:
+            return QAccessible::EditableText;
+
+        case AccessibleRole::TEXT_FRAME:
+            return QAccessible::UserRole;
+
+        case AccessibleRole::TOGGLE_BUTTON:
+            return QAccessible::Button;
+
+        case AccessibleRole::TOOL_BAR:
+            return QAccessible::ToolBar;
+
+        case AccessibleRole::TOOL_TIP:
+            return QAccessible::ToolTip;
+
+        case AccessibleRole::TREE:
+            return QAccessible::Tree;
+
+        case AccessibleRole::VIEW_PORT:
+            return QAccessible::UserRole;
+
+        case AccessibleRole::BUTTON_DROPDOWN:
+            return QAccessible::Button;
+
+        case AccessibleRole::BUTTON_MENU:
+            return QAccessible::Button;
+
+        case AccessibleRole::CAPTION:
+            return QAccessible::StaticText;
+
+        case AccessibleRole::CHART:
+            return QAccessible::Chart;
+
+        case AccessibleRole::EDIT_BAR:
+            return QAccessible::Equation;
+
+        case AccessibleRole::FORM:
+            return QAccessible::Form;
+
+        case AccessibleRole::IMAGE_MAP:
+            return QAccessible::Graphic;
+
+        case AccessibleRole::NOTE:
+            return QAccessible::Note;
+
+        case AccessibleRole::RULER:
+            return QAccessible::UserRole;
+
+        case AccessibleRole::SECTION:
+            return QAccessible::Section;
+
+        case AccessibleRole::TREE_ITEM:
+            return QAccessible::TreeItem;
+
+        case AccessibleRole::TREE_TABLE:
+            return QAccessible::Tree;
+
+        case AccessibleRole::COMMENT:
+            return QAccessible::Note;
+
+        case AccessibleRole::COMMENT_END:
+            return QAccessible::UserRole;
+
+        case AccessibleRole::DOCUMENT_PRESENTATION:
+            return QAccessible::Document;
+
+        case AccessibleRole::DOCUMENT_SPREADSHEET:
+            return QAccessible::Document;
+
+        case AccessibleRole::DOCUMENT_TEXT:
+            return QAccessible::Document;
+
+        case AccessibleRole::STATIC:
+            return QAccessible::StaticText;
+
+        /* Ignore window objects for sub-menus, combo- and list boxes,
+         *  which are exposed as children of their parents.
+         */
+        case AccessibleRole::WINDOW: // top-level window without title bar
+        {
+            SolarMutexGuard aSolarGuard;
+            WindowType type = WindowType::WINDOW;
+            bool parentIsMenuFloatingWindow = false;
+
+            vcl::Window* pParent = m_pWindow->GetParent();
+            if (pParent)
+            {
+                type = pParent->GetType();
+                parentIsMenuFloatingWindow = pParent->IsMenuFloatingWindow();
+            }
+
+            if ((WindowType::LISTBOX != type) && (WindowType::COMBOBOX != type)
+                && (WindowType::MENUBARWINDOW != type) && !parentIsMenuFloatingWindow)
+            {
+                return QAccessible::Window;
+            }
+        }
+            SAL_FALLTHROUGH;
+
+        default:
+        {
+            SolarMutexGuard aSolarGuard;
+            vcl::Window* pChild = m_pWindow->GetWindow(GetWindowType::FirstChild);
+            if (pChild)
+            {
+                if (WindowType::HELPTEXTWINDOW == pChild->GetType())
+                {
+                    return QAccessible::HelpBalloon;
+                }
+                else if (m_pWindow->GetType() == WindowType::BORDERWINDOW
+                         && pChild->GetType() == WindowType::FLOATINGWINDOW)
+                {
+                    PopupMenuFloatingWindow* p = dynamic_cast<PopupMenuFloatingWindow*>(pChild);
+                    if (p && p->IsPopupMenu() && p->GetMenuStackLevel() == 0)
+                    {
+                        return QAccessible::PopupMenu;
+                    }
+                }
+            }
+            break;
+        }
+    }
+    return QAccessible::NoRole;
+}
+QAccessible::State Qt5AccessibleWidget::state() const
+{
+    QAccessible::State state;
+    return state;
+}
+
+QColor Qt5AccessibleWidget::foregroundColor() const { return QColor(); }
+QColor Qt5AccessibleWidget::backgroundColor() const { return QColor(); }
+
+void* Qt5AccessibleWidget::interface_cast(QAccessible::InterfaceType /* t */)
+{
+    /* if (t == QAccessible::ActionInterface)
+        return static_cast<QAccessibleActionInterface*>(this); */
+    return nullptr;
+}
+
+// QAccessibleActionInterface
+/* QStringList Qt5AccessibleWidget::actionNames() const
+{
+    qDebug("Qt5AccessibleWidget::actionNames");
+    QStringList actionNames;
+    return actionNames;
+}
+void Qt5AccessibleWidget::doAction(const QString& actionName)
+{
+    qDebug("Qt5AccessibleWidget::doAction");
+}
+QStringList Qt5AccessibleWidget::keyBindingsForAction(const QString& actionName) const
+{
+    qDebug("Qt5AccessibleWidget::keyBindingsForAction");
+    return QStringList();
+} */
+
+bool Qt5AccessibleWidget::isValid() const { return true; }
+
+QObject* Qt5AccessibleWidget::object() const { return nullptr; }
+
+void Qt5AccessibleWidget::setText(QAccessible::Text t, const QString& text)
+{
+    if (!m_pWindow)
+        return;
+
+    switch (t)
+    {
+        case QAccessible::Name:
+            m_pWindow->SetAccessibleName(toOUString(text));
+            break;
+        case QAccessible::Description:
+        case QAccessible::DebugDescription:
+            m_pWindow->SetAccessibleDescription(toOUString(text));
+            break;
+        case QAccessible::Value:
+        case QAccessible::Help:
+        case QAccessible::Accelerator:
+        case QAccessible::UserText:
+            break;
+    }
+}
+
+QAccessibleInterface* Qt5AccessibleWidget::childAt(int /* x */, int /* y */) const
+{
+    return nullptr;
+}
+
+QAccessibleInterface* Qt5AccessibleWidget::customFactory(const QString& classname, QObject* object)
+{
+    if (classname == QLatin1String("Qt5Widget") && object && object->isWidgetType())
+    {
+        return new Qt5AccessibleWidget(static_cast<Qt5Widget*>(object),
+                                       (static_cast<Qt5Widget*>(object))->m_pFrame->GetWindow());
+    }
+    if (classname == QLatin1String("Qt5VclWindow") && object)
+    {
+        if (dynamic_cast<Qt5VclWindow*>(object) != nullptr)
+            return new Qt5AccessibleWidget((static_cast<Qt5VclWindow*>(object))->m_pWindow);
+    }
+
+    return nullptr;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/Qt5MainWindow.cxx b/vcl/qt5/Qt5MainWindow.cxx
index e49e49aaeaf1..fd4e09771855 100644
--- a/vcl/qt5/Qt5MainWindow.cxx
+++ b/vcl/qt5/Qt5MainWindow.cxx
@@ -10,13 +10,16 @@
 
 #include <Qt5MainWindow.hxx>
 #include <Qt5MainWindow.moc>
+#include <Qt5AccessibleWidget.hxx>
 
+#include <QtGui/QAccessible>
 #include <QtGui/QCloseEvent>
 
 Qt5MainWindow::Qt5MainWindow(Qt5Frame& rFrame, QWidget* parent, Qt::WindowFlags f)
     : QMainWindow(parent, f)
     , m_pFrame(&rFrame)
 {
+    QAccessible::installFactory(Qt5AccessibleWidget::customFactory);
 }
 
 void Qt5MainWindow::closeEvent(QCloseEvent* pEvent)
diff --git a/vcl/qt5/Qt5VclWindow.cxx b/vcl/qt5/Qt5VclWindow.cxx
new file mode 100644
index 000000000000..0b89aba9d834
--- /dev/null
+++ b/vcl/qt5/Qt5VclWindow.cxx
@@ -0,0 +1,26 @@
+/* -*- 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/.
+ */
+
+#include <Qt5VclWindow.hxx>
+#include <Qt5VclWindow.moc>
+
+#include <Qt5Frame.hxx>
+#include <Qt5Tools.hxx>
+#include <Qt5Widget.hxx>
+
+#include <sal/log.hxx>
+
+using namespace css::accessibility;
+
+Qt5VclWindow::Qt5VclWindow(vcl::Window* pWindow)
+    : m_pWindow(pWindow)
+{
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list