Revision control
Copy as Markdown
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#if 0
// keep existing syncqt header working after the move of the class
// into qaccessible_base
#pragma qt_class(QAccessible)
#endif
#ifndef QACCESSIBLE_H
#define QACCESSIBLE_H
#include <QtGui/qtguiglobal.h>
#if QT_CONFIG(accessibility)
#include <QtCore/qcoreapplication.h>
#include <QtCore/qglobal.h>
#include <QtCore/qlist.h>
#include <QtCore/qobject.h>
#include <QtCore/qrect.h>
#include <QtCore/qset.h>
#include <QtCore/qvariant.h>
#include <QtGui/qcolor.h>
#include <QtGui/qevent.h>
#include <QtGui/qaccessible_base.h>
QT_BEGIN_NAMESPACE
class QDebug;
class QAccessibleInterface;
class QAccessibleEvent;
class QWindow;
class QTextCursor;
class QAccessible2Interface;
class QAccessibleTextInterface;
class QAccessibleEditableTextInterface;
class QAccessibleValueInterface;
class QAccessibleActionInterface;
class QAccessibleImageInterface;
class QAccessibleTableInterface;
class QAccessibleTableCellInterface;
class QAccessibleHyperlinkInterface;
class QAccessibleSelectionInterface;
class QAccessibleAttributesInterface;
class QAccessibleTableModelChangeEvent;
class QAccessibleViewportInterface;
class Q_GUI_EXPORT QAccessibleInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleInterface)
protected:
QAccessibleInterface() = default;
virtual ~QAccessibleInterface();
public:
// check for valid pointers
virtual bool isValid() const = 0;
virtual QObject *object() const = 0;
virtual QWindow *window() const;
// relations
virtual QList<std::pair<QAccessibleInterface *, QAccessible::Relation>>
relations(QAccessible::Relation match = QAccessible::AllRelations) const;
virtual QAccessibleInterface *focusChild() const;
virtual QAccessibleInterface *childAt(int x, int y) const = 0;
// navigation, hierarchy
virtual QAccessibleInterface *parent() const = 0;
virtual QAccessibleInterface *child(int index) const = 0;
virtual int childCount() const = 0;
virtual int indexOfChild(const QAccessibleInterface *) const = 0;
// properties and state
virtual QString text(QAccessible::Text t) const = 0;
virtual void setText(QAccessible::Text t, const QString &text) = 0;
virtual QRect rect() const = 0;
virtual QAccessible::Role role() const = 0;
virtual QAccessible::State state() const = 0;
virtual QColor foregroundColor() const;
virtual QColor backgroundColor() const;
inline QAccessibleTextInterface *textInterface()
{ return reinterpret_cast<QAccessibleTextInterface *>(interface_cast(QAccessible::TextInterface)); }
inline QAccessibleEditableTextInterface *editableTextInterface()
{ return reinterpret_cast<QAccessibleEditableTextInterface *>(interface_cast(QAccessible::EditableTextInterface)); }
inline QAccessibleValueInterface *valueInterface()
{ return reinterpret_cast<QAccessibleValueInterface *>(interface_cast(QAccessible::ValueInterface)); }
inline QAccessibleActionInterface *actionInterface()
{ return reinterpret_cast<QAccessibleActionInterface *>(interface_cast(QAccessible::ActionInterface)); }
inline QAccessibleImageInterface *imageInterface()
{ return reinterpret_cast<QAccessibleImageInterface *>(interface_cast(QAccessible::ImageInterface)); }
inline QAccessibleTableInterface *tableInterface()
{ return reinterpret_cast<QAccessibleTableInterface *>(interface_cast(QAccessible::TableInterface)); }
inline QAccessibleTableCellInterface *tableCellInterface()
{ return reinterpret_cast<QAccessibleTableCellInterface *>(interface_cast(QAccessible::TableCellInterface)); }
inline QAccessibleHyperlinkInterface *hyperlinkInterface()
{ return reinterpret_cast<QAccessibleHyperlinkInterface *>(interface_cast(QAccessible::HyperlinkInterface)); }
inline QAccessibleSelectionInterface *selectionInterface()
{ return reinterpret_cast<QAccessibleSelectionInterface *>(interface_cast(QAccessible::SelectionInterface)); }
inline QAccessibleAttributesInterface *attributesInterface()
{ return reinterpret_cast<QAccessibleAttributesInterface *>(interface_cast(QAccessible::AttributesInterface)); }
inline QAccessibleViewportInterface *viewportInterface()
{ return reinterpret_cast<QAccessibleViewportInterface *>(interface_cast(QAccessible::ViewportInterface)); }
virtual void virtual_hook(int id, void *data);
virtual void *interface_cast(QAccessible::InterfaceType)
{ return nullptr; }
protected:
friend class QAccessibleCache;
};
class Q_GUI_EXPORT QAccessibleTextInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleTextInterface)
public:
QAccessibleTextInterface() = default;
virtual ~QAccessibleTextInterface();
// selection
virtual void selection(int selectionIndex, int *startOffset, int *endOffset) const = 0;
virtual int selectionCount() const = 0;
virtual void addSelection(int startOffset, int endOffset) = 0;
virtual void removeSelection(int selectionIndex) = 0;
virtual void setSelection(int selectionIndex, int startOffset, int endOffset) = 0;
// cursor
virtual int cursorPosition() const = 0;
virtual void setCursorPosition(int position) = 0;
// text
virtual QString text(int startOffset, int endOffset) const = 0;
virtual QString textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType,
int *startOffset, int *endOffset) const;
virtual QString textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType,
int *startOffset, int *endOffset) const;
virtual QString textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType,
int *startOffset, int *endOffset) const;
virtual int characterCount() const = 0;
// character <-> geometry
virtual QRect characterRect(int offset) const = 0;
virtual int offsetAtPoint(const QPoint &point) const = 0;
virtual void scrollToSubstring(int startIndex, int endIndex) = 0;
virtual QString attributes(int offset, int *startOffset, int *endOffset) const = 0;
};
class Q_GUI_EXPORT QAccessibleEditableTextInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleEditableTextInterface)
public:
QAccessibleEditableTextInterface() = default;
virtual ~QAccessibleEditableTextInterface();
virtual void deleteText(int startOffset, int endOffset) = 0;
virtual void insertText(int offset, const QString &text) = 0;
virtual void replaceText(int startOffset, int endOffset, const QString &text) = 0;
};
class Q_GUI_EXPORT QAccessibleValueInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleValueInterface)
public:
QAccessibleValueInterface() = default;
virtual ~QAccessibleValueInterface();
virtual QVariant currentValue() const = 0;
virtual void setCurrentValue(const QVariant &value) = 0;
virtual QVariant maximumValue() const = 0;
virtual QVariant minimumValue() const = 0;
virtual QVariant minimumStepSize() const = 0;
};
class Q_GUI_EXPORT QAccessibleTableCellInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleTableCellInterface)
public:
QAccessibleTableCellInterface() = default;
virtual ~QAccessibleTableCellInterface();
virtual bool isSelected() const = 0;
virtual QList<QAccessibleInterface*> columnHeaderCells() const = 0;
virtual QList<QAccessibleInterface*> rowHeaderCells() const = 0;
virtual int columnIndex() const = 0;
virtual int rowIndex() const = 0;
virtual int columnExtent() const = 0;
virtual int rowExtent() const = 0;
virtual QAccessibleInterface* table() const = 0;
};
class Q_GUI_EXPORT QAccessibleTableInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleTableInterface)
public:
QAccessibleTableInterface() = default;
virtual ~QAccessibleTableInterface();
virtual QAccessibleInterface *caption() const = 0;
virtual QAccessibleInterface *summary() const = 0;
virtual QAccessibleInterface *cellAt (int row, int column) const = 0;
virtual int selectedCellCount() const = 0;
virtual QList<QAccessibleInterface*> selectedCells() const = 0;
virtual QString columnDescription(int column) const = 0;
virtual QString rowDescription(int row) const = 0;
virtual int selectedColumnCount() const = 0;
virtual int selectedRowCount() const = 0;
virtual int columnCount() const = 0;
virtual int rowCount() const = 0;
virtual QList<int> selectedColumns() const = 0;
virtual QList<int> selectedRows() const = 0;
virtual bool isColumnSelected(int column) const = 0;
virtual bool isRowSelected(int row) const = 0;
virtual bool selectRow(int row) = 0;
virtual bool selectColumn(int column) = 0;
virtual bool unselectRow(int row) = 0;
virtual bool unselectColumn(int column) = 0;
virtual void modelChange(QAccessibleTableModelChangeEvent *event) = 0;
protected:
friend class QAbstractItemView;
friend class QAbstractItemViewPrivate;
};
class Q_GUI_EXPORT QAccessibleActionInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleActionInterface)
Q_DECLARE_TR_FUNCTIONS(QAccessibleActionInterface)
public:
QAccessibleActionInterface() = default;
virtual ~QAccessibleActionInterface();
virtual QStringList actionNames() const = 0;
virtual QString localizedActionName(const QString &name) const;
virtual QString localizedActionDescription(const QString &name) const;
virtual void doAction(const QString &actionName) = 0;
virtual QStringList keyBindingsForAction(const QString &actionName) const = 0;
static const QString &pressAction();
static const QString &increaseAction();
static const QString &decreaseAction();
static const QString &showMenuAction();
static const QString &setFocusAction();
static const QString &showOnScreenAction();
static const QString &toggleAction();
static QString scrollLeftAction();
static QString scrollRightAction();
static QString scrollUpAction();
static QString scrollDownAction();
static QString nextPageAction();
static QString previousPageAction();
};
class Q_GUI_EXPORT QAccessibleImageInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleImageInterface)
public:
QAccessibleImageInterface() = default;
virtual ~QAccessibleImageInterface();
virtual QString imageDescription() const = 0;
virtual QSize imageSize() const = 0;
virtual QPoint imagePosition() const = 0;
};
class Q_GUI_EXPORT QAccessibleHyperlinkInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleHyperlinkInterface)
public:
QAccessibleHyperlinkInterface() = default;
virtual ~QAccessibleHyperlinkInterface();
virtual QString anchor() const = 0;
virtual QString anchorTarget() const = 0;
virtual int startIndex() const = 0;
virtual int endIndex() const = 0;
virtual bool isValid() const = 0;
};
class Q_GUI_EXPORT QAccessibleSelectionInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleSelectionInterface)
public:
QAccessibleSelectionInterface() = default;
virtual ~QAccessibleSelectionInterface();
virtual int selectedItemCount() const = 0;
virtual QList<QAccessibleInterface*> selectedItems() const = 0;
virtual QAccessibleInterface* selectedItem(int selectionIndex) const;
virtual bool isSelected(QAccessibleInterface *childItem) const;
virtual bool select(QAccessibleInterface *childItem) = 0;
virtual bool unselect(QAccessibleInterface *childItem) = 0;
virtual bool selectAll() = 0;
virtual bool clear() = 0;
};
class Q_GUI_EXPORT QAccessibleAttributesInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleAttributesInterface)
public:
QAccessibleAttributesInterface() = default;
virtual ~QAccessibleAttributesInterface();
virtual QList<QAccessible::Attribute> attributeKeys() const = 0;
virtual QVariant attributeValue(QAccessible::Attribute key) const = 0;
};
class Q_GUI_EXPORT QAccessibleViewportInterface
{
Q_DISABLE_COPY_MOVE(QAccessibleViewportInterface)
public:
QAccessibleViewportInterface() = default;
virtual ~QAccessibleViewportInterface();
virtual QSizeF contentSize() const = 0;
virtual QPointF position() const = 0;
virtual QSizeF viewportSize() const = 0;
virtual bool isIndexed() const = 0;
virtual void setPosition(QPointF position) = 0;
};
class Q_GUI_EXPORT QAccessibleEvent
{
Q_DISABLE_COPY(QAccessibleEvent)
public:
inline QAccessibleEvent(QObject *obj, QAccessible::Event typ)
: m_type(typ), m_object(obj), m_child(-1)
{
if (m_type != QAccessible::ObjectDestroyed)
Q_ASSERT(obj);
// All events below have a subclass of QAccessibleEvent.
// Use the subclass, since it's expected that it's possible to cast to that.
Q_ASSERT(m_type != QAccessible::ValueChanged);
Q_ASSERT(m_type != QAccessible::StateChanged);
Q_ASSERT(m_type != QAccessible::TextCaretMoved);
Q_ASSERT(m_type != QAccessible::TextSelectionChanged);
Q_ASSERT(m_type != QAccessible::TextInserted);
Q_ASSERT(m_type != QAccessible::TextRemoved);
Q_ASSERT(m_type != QAccessible::TextUpdated);
Q_ASSERT(m_type != QAccessible::TableModelChanged);
Q_ASSERT(m_type != QAccessible::Announcement);
}
inline QAccessibleEvent(QAccessibleInterface *iface, QAccessible::Event typ)
: m_type(typ)
{
Q_ASSERT(iface);
Q_ASSERT(m_type != QAccessible::ValueChanged);
Q_ASSERT(m_type != QAccessible::StateChanged);
Q_ASSERT(m_type != QAccessible::TextCaretMoved);
Q_ASSERT(m_type != QAccessible::TextSelectionChanged);
Q_ASSERT(m_type != QAccessible::TextInserted);
Q_ASSERT(m_type != QAccessible::TextRemoved);
Q_ASSERT(m_type != QAccessible::TextUpdated);
Q_ASSERT(m_type != QAccessible::TableModelChanged);
Q_ASSERT(m_type != QAccessible::Announcement);
m_uniqueId = QAccessible::uniqueId(iface);
m_object = iface->object();
}
virtual ~QAccessibleEvent();
QAccessible::Event type() const { return m_type; }
QObject *object() const { return m_object; }
QAccessible::Id uniqueId() const;
void setChild(int chld);
int child() const { return m_child; }
virtual QAccessibleInterface *accessibleInterface() const;
protected:
QAccessible::Event m_type;
QObject *m_object;
union {
int m_child;
QAccessible::Id m_uniqueId;
};
friend class QTestAccessibility;
};
class Q_GUI_EXPORT QAccessibleStateChangeEvent :public QAccessibleEvent
{
public:
inline QAccessibleStateChangeEvent(QObject *obj, QAccessible::State state)
: QAccessibleEvent(obj, QAccessible::InvalidEvent), m_changedStates(state)
{
m_type = QAccessible::StateChanged;
}
inline QAccessibleStateChangeEvent(QAccessibleInterface *iface, QAccessible::State state)
: QAccessibleEvent(iface, QAccessible::InvalidEvent), m_changedStates(state)
{
m_type = QAccessible::StateChanged;
}
~QAccessibleStateChangeEvent();
QAccessible::State changedStates() const {
return m_changedStates;
}
protected:
QAccessible::State m_changedStates;
};
// Update the cursor and optionally the selection.
class Q_GUI_EXPORT QAccessibleTextCursorEvent : public QAccessibleEvent
{
public:
inline QAccessibleTextCursorEvent(QObject *obj, int cursorPos)
: QAccessibleEvent(obj, QAccessible::InvalidEvent)
, m_cursorPosition(cursorPos)
{
m_type = QAccessible::TextCaretMoved;
}
inline QAccessibleTextCursorEvent(QAccessibleInterface *iface, int cursorPos)
: QAccessibleEvent(iface, QAccessible::InvalidEvent)
, m_cursorPosition(cursorPos)
{
m_type = QAccessible::TextCaretMoved;
}
~QAccessibleTextCursorEvent();
void setCursorPosition(int position) { m_cursorPosition = position; }
int cursorPosition() const { return m_cursorPosition; }
protected:
int m_cursorPosition;
};
// Updates the cursor position simultaneously. By default the cursor is set to the end of the selection.
class Q_GUI_EXPORT QAccessibleTextSelectionEvent : public QAccessibleTextCursorEvent
{
public:
inline QAccessibleTextSelectionEvent(QObject *obj, int start, int end)
: QAccessibleTextCursorEvent(obj, (start == -1) ? 0 : end)
, m_selectionStart(start), m_selectionEnd(end)
{
m_type = QAccessible::TextSelectionChanged;
}
inline QAccessibleTextSelectionEvent(QAccessibleInterface *iface, int start, int end)
: QAccessibleTextCursorEvent(iface, (start == -1) ? 0 : end)
, m_selectionStart(start), m_selectionEnd(end)
{
m_type = QAccessible::TextSelectionChanged;
}
~QAccessibleTextSelectionEvent();
void setSelection(int start, int end) {
m_selectionStart = start;
m_selectionEnd = end;
}
int selectionStart() const { return m_selectionStart; }
int selectionEnd() const { return m_selectionEnd; }
protected:
int m_selectionStart;
int m_selectionEnd;
};
class Q_GUI_EXPORT QAccessibleTextInsertEvent : public QAccessibleTextCursorEvent
{
public:
inline QAccessibleTextInsertEvent(QObject *obj, int position, const QString &text)
: QAccessibleTextCursorEvent(obj, position + int(text.size()))
, m_position(position), m_text(text)
{
m_type = QAccessible::TextInserted;
}
inline QAccessibleTextInsertEvent(QAccessibleInterface *iface, int position, const QString &text)
: QAccessibleTextCursorEvent(iface, position + int(text.size()))
, m_position(position), m_text(text)
{
m_type = QAccessible::TextInserted;
}
~QAccessibleTextInsertEvent();
QString textInserted() const {
return m_text;
}
int changePosition() const {
return m_position;
}
protected:
int m_position;
QString m_text;
};
class Q_GUI_EXPORT QAccessibleTextRemoveEvent : public QAccessibleTextCursorEvent
{
public:
inline QAccessibleTextRemoveEvent(QObject *obj, int position, const QString &text)
: QAccessibleTextCursorEvent(obj, position)
, m_position(position), m_text(text)
{
m_type = QAccessible::TextRemoved;
}
inline QAccessibleTextRemoveEvent(QAccessibleInterface *iface, int position, const QString &text)
: QAccessibleTextCursorEvent(iface, position)
, m_position(position), m_text(text)
{
m_type = QAccessible::TextRemoved;
}
~QAccessibleTextRemoveEvent();
QString textRemoved() const {
return m_text;
}
int changePosition() const {
return m_position;
}
protected:
int m_position;
QString m_text;
};
class Q_GUI_EXPORT QAccessibleTextUpdateEvent : public QAccessibleTextCursorEvent
{
public:
inline QAccessibleTextUpdateEvent(QObject *obj, int position, const QString &oldText, const QString &text)
: QAccessibleTextCursorEvent(obj, position + int(text.size()))
, m_position(position), m_oldText(oldText), m_text(text)
{
m_type = QAccessible::TextUpdated;
}
inline QAccessibleTextUpdateEvent(QAccessibleInterface *iface, int position, const QString &oldText, const QString &text)
: QAccessibleTextCursorEvent(iface, position + int(text.size()))
, m_position(position), m_oldText(oldText), m_text(text)
{
m_type = QAccessible::TextUpdated;
}
~QAccessibleTextUpdateEvent();
QString textRemoved() const {
return m_oldText;
}
QString textInserted() const {
return m_text;
}
int changePosition() const {
return m_position;
}
protected:
int m_position;
QString m_oldText;
QString m_text;
};
class Q_GUI_EXPORT QAccessibleValueChangeEvent : public QAccessibleEvent
{
public:
inline QAccessibleValueChangeEvent(QObject *obj, const QVariant &val)
: QAccessibleEvent(obj, QAccessible::InvalidEvent)
, m_value(val)
{
m_type = QAccessible::ValueChanged;
}
inline QAccessibleValueChangeEvent(QAccessibleInterface *iface, const QVariant &val)
: QAccessibleEvent(iface, QAccessible::InvalidEvent)
, m_value(val)
{
m_type = QAccessible::ValueChanged;
}
~QAccessibleValueChangeEvent();
void setValue(const QVariant & val) { m_value= val; }
QVariant value() const { return m_value; }
protected:
QVariant m_value;
};
class Q_GUI_EXPORT QAccessibleTableModelChangeEvent : public QAccessibleEvent
{
public:
enum ModelChangeType {
ModelReset,
DataChanged,
RowsInserted,
ColumnsInserted,
RowsRemoved,
ColumnsRemoved
};
inline QAccessibleTableModelChangeEvent(QObject *obj, ModelChangeType changeType)
: QAccessibleEvent(obj, QAccessible::InvalidEvent)
, m_modelChangeType(changeType)
, m_firstRow(-1), m_firstColumn(-1), m_lastRow(-1), m_lastColumn(-1)
{
m_type = QAccessible::TableModelChanged;
}
inline QAccessibleTableModelChangeEvent(QAccessibleInterface *iface, ModelChangeType changeType)
: QAccessibleEvent(iface, QAccessible::InvalidEvent)
, m_modelChangeType(changeType)
, m_firstRow(-1), m_firstColumn(-1), m_lastRow(-1), m_lastColumn(-1)
{
m_type = QAccessible::TableModelChanged;
}
~QAccessibleTableModelChangeEvent();
void setModelChangeType(ModelChangeType changeType) { m_modelChangeType = changeType; }
ModelChangeType modelChangeType() const { return m_modelChangeType; }
void setFirstRow(int row) { m_firstRow = row; }
void setFirstColumn(int col) { m_firstColumn = col; }
void setLastRow(int row) { m_lastRow = row; }
void setLastColumn(int col) { m_lastColumn = col; }
int firstRow() const { return m_firstRow; }
int firstColumn() const { return m_firstColumn; }
int lastRow() const { return m_lastRow; }
int lastColumn() const { return m_lastColumn; }
protected:
ModelChangeType m_modelChangeType;
int m_firstRow;
int m_firstColumn;
int m_lastRow;
int m_lastColumn;
};
class Q_GUI_EXPORT QAccessibleAnnouncementEvent : public QAccessibleEvent
{
public:
explicit QAccessibleAnnouncementEvent(QObject *object, const QString &message)
: QAccessibleEvent(object, QAccessible::InvalidEvent)
, m_message(message)
, m_politeness(QAccessible::AnnouncementPoliteness::Polite)
{
m_type = QAccessible::Announcement;
}
explicit QAccessibleAnnouncementEvent(QAccessibleInterface *iface, const QString &message)
: QAccessibleEvent(iface, QAccessible::InvalidEvent)
, m_message(message)
, m_politeness(QAccessible::AnnouncementPoliteness::Polite)
{
m_type = QAccessible::Announcement;
}
~QAccessibleAnnouncementEvent() override;
QString message() const { return m_message; }
QAccessible::AnnouncementPoliteness politeness() const { return m_politeness; }
void setPoliteness(QAccessible::AnnouncementPoliteness politeness)
{ m_politeness = politeness; }
protected:
QString m_message;
QAccessible::AnnouncementPoliteness m_politeness;
};
#ifndef Q_QDOC
#define QAccessibleInterface_iid "org.qt-project.Qt.QAccessibleInterface"
Q_DECLARE_INTERFACE(QAccessibleInterface, QAccessibleInterface_iid)
#endif
Q_GUI_EXPORT const char *qAccessibleRoleString(QAccessible::Role role);
Q_GUI_EXPORT const char *qAccessibleEventString(QAccessible::Event event);
Q_GUI_EXPORT QString qAccessibleLocalizedActionDescription(const QString &actionName);
#ifndef QT_NO_DEBUG_STREAM
Q_GUI_EXPORT QDebug operator<<(QDebug d, const QAccessibleInterface *iface);
Q_GUI_EXPORT QDebug operator<<(QDebug d, const QAccessibleEvent &ev);
#endif
QT_END_NAMESPACE
#endif // QT_CONFIG(accessibility)
#endif // QACCESSIBLE_H