1 | // Copyright (C) 2016 The Qt Company Ltd. |
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
3 | |
4 | #ifndef QACCESSIBLEWIDGETS_H |
5 | #define QACCESSIBLEWIDGETS_H |
6 | |
7 | // |
8 | // W A R N I N G |
9 | // ------------- |
10 | // |
11 | // This file is not part of the Qt API. It exists purely as an |
12 | // implementation detail. This header file may change from version to |
13 | // version without notice, or even be removed. |
14 | // |
15 | // We mean it. |
16 | // |
17 | |
18 | #include <QtWidgets/private/qtwidgetsglobal_p.h> |
19 | #include <QtWidgets/qaccessiblewidget.h> |
20 | |
21 | #if QT_CONFIG(accessibility) |
22 | |
23 | #include <QtCore/QPointer> |
24 | |
25 | QT_BEGIN_NAMESPACE |
26 | |
27 | class QTextEdit; |
28 | class QStackedWidget; |
29 | class QToolBox; |
30 | class QMdiArea; |
31 | class QMdiSubWindow; |
32 | class QRubberBand; |
33 | class QTextBrowser; |
34 | class QCalendarWidget; |
35 | class QAbstractItemView; |
36 | class QDockWidget; |
37 | class QDockWidgetLayout; |
38 | class QMainWindow; |
39 | class QPlainTextEdit; |
40 | class QTextCursor; |
41 | class QTextDocument; |
42 | |
43 | #ifndef QT_NO_CURSOR |
44 | class QAccessibleTextWidget : public QAccessibleWidget, |
45 | public QAccessibleTextInterface, |
46 | public QAccessibleEditableTextInterface |
47 | { |
48 | public: |
49 | QAccessibleTextWidget(QWidget *o, QAccessible::Role r = QAccessible::EditableText, const QString &name = QString()); |
50 | |
51 | QAccessible::State state() const override; |
52 | |
53 | // QAccessibleTextInterface |
54 | // selection |
55 | void selection(int selectionIndex, int *startOffset, int *endOffset) const override; |
56 | int selectionCount() const override; |
57 | void addSelection(int startOffset, int endOffset) override; |
58 | void removeSelection(int selectionIndex) override; |
59 | void setSelection(int selectionIndex, int startOffset, int endOffset) override; |
60 | |
61 | // cursor |
62 | int cursorPosition() const override; |
63 | void setCursorPosition(int position) override; |
64 | |
65 | // text |
66 | QString text(int startOffset, int endOffset) const override; |
67 | QString textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType, |
68 | int *startOffset, int *endOffset) const override; |
69 | QString textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType, |
70 | int *startOffset, int *endOffset) const override; |
71 | QString textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType, |
72 | int *startOffset, int *endOffset) const override; |
73 | int characterCount() const override; |
74 | |
75 | // character <-> geometry |
76 | QRect characterRect(int offset) const override; |
77 | int offsetAtPoint(const QPoint &point) const override; |
78 | |
79 | QString attributes(int offset, int *startOffset, int *endOffset) const override; |
80 | |
81 | // QAccessibleEditableTextInterface |
82 | void deleteText(int startOffset, int endOffset) override; |
83 | void insertText(int offset, const QString &text) override; |
84 | void replaceText(int startOffset, int endOffset, const QString &text) override; |
85 | |
86 | using QAccessibleWidget::text; |
87 | |
88 | protected: |
89 | QTextCursor textCursorForRange(int startOffset, int endOffset) const; |
90 | virtual QPoint scrollBarPosition() const; |
91 | // return the current text cursor at the caret position including a potential selection |
92 | virtual QTextCursor textCursor() const = 0; |
93 | virtual void setTextCursor(const QTextCursor &) = 0; |
94 | virtual QTextDocument *textDocument() const = 0; |
95 | virtual QWidget *viewport() const = 0; |
96 | }; |
97 | |
98 | #if QT_CONFIG(textedit) |
99 | class QAccessiblePlainTextEdit : public QAccessibleTextWidget |
100 | { |
101 | public: |
102 | explicit QAccessiblePlainTextEdit(QWidget *o); |
103 | |
104 | QString text(QAccessible::Text t) const override; |
105 | void setText(QAccessible::Text t, const QString &text) override; |
106 | QAccessible::State state() const override; |
107 | |
108 | void *interface_cast(QAccessible::InterfaceType t) override; |
109 | |
110 | // QAccessibleTextInterface |
111 | void scrollToSubstring(int startIndex, int endIndex) override; |
112 | |
113 | using QAccessibleTextWidget::text; |
114 | |
115 | protected: |
116 | QPlainTextEdit *plainTextEdit() const; |
117 | |
118 | QPoint scrollBarPosition() const override; |
119 | QTextCursor textCursor() const override; |
120 | void setTextCursor(const QTextCursor &textCursor) override; |
121 | QTextDocument *textDocument() const override; |
122 | QWidget *viewport() const override; |
123 | }; |
124 | |
125 | class QAccessibleTextEdit : public QAccessibleTextWidget |
126 | { |
127 | public: |
128 | explicit QAccessibleTextEdit(QWidget *o); |
129 | |
130 | QString text(QAccessible::Text t) const override; |
131 | void setText(QAccessible::Text t, const QString &text) override; |
132 | QAccessible::State state() const override; |
133 | |
134 | void *interface_cast(QAccessible::InterfaceType t) override; |
135 | |
136 | // QAccessibleTextInterface |
137 | void scrollToSubstring(int startIndex, int endIndex) override; |
138 | |
139 | using QAccessibleTextWidget::text; |
140 | |
141 | protected: |
142 | QTextEdit *textEdit() const; |
143 | |
144 | QPoint scrollBarPosition() const override; |
145 | QTextCursor textCursor() const override; |
146 | void setTextCursor(const QTextCursor &textCursor) override; |
147 | QTextDocument *textDocument() const override; |
148 | QWidget *viewport() const override; |
149 | }; |
150 | #endif // QT_CONFIG(textedit) |
151 | #endif //QT_NO_CURSOR |
152 | |
153 | class QAccessibleStackedWidget : public QAccessibleWidget |
154 | { |
155 | public: |
156 | explicit QAccessibleStackedWidget(QWidget *widget); |
157 | |
158 | QAccessibleInterface *childAt(int x, int y) const override; |
159 | int childCount() const override; |
160 | int indexOfChild(const QAccessibleInterface *child) const override; |
161 | QAccessibleInterface *child(int index) const override; |
162 | |
163 | protected: |
164 | QStackedWidget *stackedWidget() const; |
165 | }; |
166 | |
167 | class QAccessibleToolBox : public QAccessibleWidget |
168 | { |
169 | public: |
170 | explicit QAccessibleToolBox(QWidget *widget); |
171 | |
172 | // FIXME we currently expose the toolbox but it is not keyboard navigatable |
173 | // and the accessible hierarchy is not exactly beautiful. |
174 | // int childCount() const; |
175 | // QAccessibleInterface *child(int index) const; |
176 | // int indexOfChild(const QAccessibleInterface *child) const; |
177 | |
178 | protected: |
179 | QToolBox *toolBox() const; |
180 | }; |
181 | |
182 | #if QT_CONFIG(mdiarea) |
183 | class QAccessibleMdiArea : public QAccessibleWidget |
184 | { |
185 | public: |
186 | explicit QAccessibleMdiArea(QWidget *widget); |
187 | |
188 | int childCount() const override; |
189 | QAccessibleInterface *child(int index) const override; |
190 | int indexOfChild(const QAccessibleInterface *child) const override; |
191 | |
192 | protected: |
193 | QMdiArea *mdiArea() const; |
194 | }; |
195 | |
196 | class QAccessibleMdiSubWindow : public QAccessibleWidget |
197 | { |
198 | public: |
199 | explicit QAccessibleMdiSubWindow(QWidget *widget); |
200 | |
201 | QString text(QAccessible::Text textType) const override; |
202 | void setText(QAccessible::Text textType, const QString &text) override; |
203 | QAccessible::State state() const override; |
204 | int childCount() const override; |
205 | QAccessibleInterface *child(int index) const override; |
206 | int indexOfChild(const QAccessibleInterface *child) const override; |
207 | QRect rect() const override; |
208 | |
209 | protected: |
210 | QMdiSubWindow *mdiSubWindow() const; |
211 | }; |
212 | #endif // QT_CONFIG(mdiarea) |
213 | |
214 | #if QT_CONFIG(dialogbuttonbox) |
215 | class QAccessibleDialogButtonBox : public QAccessibleWidget |
216 | { |
217 | public: |
218 | explicit QAccessibleDialogButtonBox(QWidget *widget); |
219 | }; |
220 | #endif |
221 | |
222 | #if QT_CONFIG(textbrowser) && !defined(QT_NO_CURSOR) |
223 | class QAccessibleTextBrowser : public QAccessibleTextEdit |
224 | { |
225 | public: |
226 | explicit QAccessibleTextBrowser(QWidget *widget); |
227 | |
228 | QAccessible::Role role() const override; |
229 | }; |
230 | #endif // QT_CONFIG(textbrowser) && QT_NO_CURSOR |
231 | |
232 | #if QT_CONFIG(calendarwidget) |
233 | class QAccessibleCalendarWidget : public QAccessibleWidget |
234 | { |
235 | public: |
236 | explicit QAccessibleCalendarWidget(QWidget *widget); |
237 | |
238 | int childCount() const override; |
239 | int indexOfChild(const QAccessibleInterface *child) const override; |
240 | |
241 | QAccessibleInterface *child(int index) const override; |
242 | |
243 | protected: |
244 | QCalendarWidget *calendarWidget() const; |
245 | |
246 | private: |
247 | QAbstractItemView *calendarView() const; |
248 | QWidget *navigationBar() const; |
249 | }; |
250 | #endif // QT_CONFIG(calendarwidget) |
251 | |
252 | #if QT_CONFIG(dockwidget) |
253 | class QAccessibleDockWidget: public QAccessibleWidget |
254 | { |
255 | public: |
256 | explicit QAccessibleDockWidget(QWidget *widget); |
257 | QAccessibleInterface *child(int index) const override; |
258 | int indexOfChild(const QAccessibleInterface *child) const override; |
259 | int childCount() const override; |
260 | QRect rect () const override; |
261 | QString text(QAccessible::Text t) const override; |
262 | |
263 | QDockWidget *dockWidget() const; |
264 | protected: |
265 | QDockWidgetLayout *dockWidgetLayout() const; |
266 | }; |
267 | |
268 | #endif // QT_CONFIG(dockwidget) |
269 | |
270 | #if QT_CONFIG(mainwindow) |
271 | class QAccessibleMainWindow : public QAccessibleWidget |
272 | { |
273 | public: |
274 | explicit QAccessibleMainWindow(QWidget *widget); |
275 | |
276 | QAccessibleInterface *child(int index) const override; |
277 | int childCount() const override; |
278 | int indexOfChild(const QAccessibleInterface *iface) const override; |
279 | QAccessibleInterface *childAt(int x, int y) const override; |
280 | QMainWindow *mainWindow() const; |
281 | |
282 | }; |
283 | #endif // QT_CONFIG(mainwindow) |
284 | |
285 | #endif // QT_CONFIG(accessibility) |
286 | |
287 | QT_END_NAMESPACE |
288 | |
289 | #endif // QACESSIBLEWIDGETS_H |
290 | |