1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #pragma once
11 
12 #include <vclpluginapi.h>
13 
14 #include <QtCore/QObject>
15 #include <QtCore/QPair>
16 #include <QtCore/QString>
17 #include <QtCore/QStringList>
18 #include <QtCore/QVector>
19 #include <QtGui/QAccessible>
20 #include <QtGui/QAccessibleActionInterface>
21 #include <QtGui/QAccessibleInterface>
22 #include <QtGui/QAccessibleTableInterface>
23 #include <QtGui/QAccessibleTextInterface>
24 #include <QtGui/QAccessibleValueInterface>
25 #include <QtGui/QColor>
26 #include <QtGui/QWindow>
27 
28 #include <com/sun/star/accessibility/XAccessible.hpp>
29 
30 class Qt5Frame;
31 class Qt5Widget;
32 
33 class Qt5AccessibleWidget final : public QObject,
34                                   public QAccessibleInterface,
35                                   public QAccessibleActionInterface,
36                                   public QAccessibleTextInterface,
37                                   public QAccessibleEditableTextInterface,
38                                   public QAccessibleTableInterface,
39                                   public QAccessibleValueInterface
40 {
41     Q_OBJECT
42 
43 public:
44     Qt5AccessibleWidget(const css::uno::Reference<css::accessibility::XAccessible> xAccessible,
45                         QObject* pObject);
46     QWindow* window() const override;
47     int childCount() const override;
48     int indexOfChild(const QAccessibleInterface* child) const override;
49     QVector<QPair<QAccessibleInterface*, QAccessible::Relation>>
50     relations(QAccessible::Relation match = QAccessible::AllRelations) const override;
51     QAccessibleInterface* focusChild() const override;
52 
53     QRect rect() const override;
54 
55     QAccessibleInterface* parent() const override;
56     QAccessibleInterface* child(int index) const override;
57 
58     QString text(QAccessible::Text t) const override;
59     QAccessible::Role role() const override;
60     QAccessible::State state() const override;
61 
62     QColor foregroundColor() const override;
63     QColor backgroundColor() const override;
64 
65     bool isValid() const override;
66     QObject* object() const override;
67     void setText(QAccessible::Text t, const QString& text) override;
68     QAccessibleInterface* childAt(int x, int y) const override;
69 
70     void* interface_cast(QAccessible::InterfaceType t) override;
71 
72     // QAccessibleActionInterface
73     QStringList actionNames() const override;
74     void doAction(const QString& actionName) override;
75     QStringList keyBindingsForAction(const QString& actionName) const override;
76 
77     static QAccessibleValueInterface* valueInterface();
78     static QAccessibleTextInterface* textInterface();
79 
80     // QAccessibleTextInterface
81     void addSelection(int startOffset, int endOffset) override;
82     QString attributes(int offset, int* startOffset, int* endOffset) const override;
83     int characterCount() const override;
84     QRect characterRect(int offset) const override;
85     int cursorPosition() const override;
86     int offsetAtPoint(const QPoint& point) const override;
87     void removeSelection(int selectionIndex) override;
88     void scrollToSubstring(int startIndex, int endIndex) override;
89     void selection(int selectionIndex, int* startOffset, int* endOffset) const override;
90     int selectionCount() const override;
91     void setCursorPosition(int position) override;
92     void setSelection(int selectionIndex, int startOffset, int endOffset) override;
93     QString text(int startOffset, int endOffset) const override;
94     QString textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType,
95                             int* startOffset, int* endOffset) const override;
96     QString textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType, int* startOffset,
97                          int* endOffset) const override;
98     QString textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType,
99                              int* startOffset, int* endOffset) const override;
100 
101     // QAccessibleEditableTextInterface
102     virtual void deleteText(int startOffset, int endOffset) override;
103     virtual void insertText(int offset, const QString& text) override;
104     virtual void replaceText(int startOffset, int endOffset, const QString& text) override;
105 
106     // QAccessibleValueInterface
107     QVariant currentValue() const override;
108     QVariant maximumValue() const override;
109     QVariant minimumStepSize() const override;
110     QVariant minimumValue() const override;
111     void setCurrentValue(const QVariant& value) override;
112 
113     // QAccessibleTableInterface
114     virtual QAccessibleInterface* caption() const override;
115     virtual QAccessibleInterface* cellAt(int row, int column) const override;
116     virtual int columnCount() const override;
117     virtual QString columnDescription(int column) const override;
118     virtual bool isColumnSelected(int column) const override;
119     virtual bool isRowSelected(int row) const override;
120     virtual void modelChange(QAccessibleTableModelChangeEvent* event) override;
121     virtual int rowCount() const override;
122     virtual QString rowDescription(int row) const override;
123     virtual bool selectColumn(int column) override;
124     virtual bool selectRow(int row) override;
125     virtual int selectedCellCount() const override;
126     virtual QList<QAccessibleInterface*> selectedCells() const override;
127     virtual int selectedColumnCount() const override;
128     virtual QList<int> selectedColumns() const override;
129     virtual int selectedRowCount() const override;
130     virtual QList<int> selectedRows() const override;
131     virtual QAccessibleInterface* summary() const override;
132     virtual bool unselectColumn(int column) override;
133     virtual bool unselectRow(int row) override;
134 
135     // Factory
136     static QAccessibleInterface* customFactory(const QString& classname, QObject* object);
137 
138 private:
139     css::uno::Reference<css::accessibility::XAccessible> m_xAccessible;
140     css::uno::Reference<css::accessibility::XAccessibleContext> getAccessibleContextImpl() const;
141     QObject* m_pObject;
142 };
143 
144 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
145