Remove virtual child integers.

This makes the accessibility apis much
simpler and less error prone.

Disable the itemviews implementation that is in complex widgets.
The itemviews will use the new code from itemviews.h/cpp everywhere now.

QToolBox was broken before, now at least it simply exposes all its children.
The children are the buttons (tabs of the toolbox) and their contents.

Change-Id: I45e218f49f02aebbd678ddfe29f94c2a112a2125
Reviewed-by: Jan-Arve Sæther <jan-arve.saether@nokia.com>
bb10
Frederik Gladhorn 2011-10-22 22:38:14 +02:00 committed by Qt by Nokia
parent e739ca0071
commit beb72b2fbf
29 changed files with 566 additions and 1415 deletions

View File

@ -871,8 +871,7 @@ const QAccessibleInterface *other, int otherChild) const
\sa relations(), indexOfChild(), navigate()
*/
QAccessible::Relation QAccessibleInterface::relationTo(int,
const QAccessibleInterface *, int) const
QAccessible::Relation QAccessibleInterface::relationTo(const QAccessibleInterface *) const
{
return Unrelated;
}
@ -1206,10 +1205,9 @@ QWindow *QAccessibleInterface::window() const
Returns an invalid QVariant if the object doesn't support the action.
*/
QVariant QAccessibleInterface::invokeMethod(Method method, int child, const QVariantList &params)
QVariant QAccessibleInterface::invokeMethod(Method method, const QVariantList &params)
{
Q_UNUSED(method)
Q_UNUSED(child)
Q_UNUSED(params)
return QVariant();
}

View File

@ -369,8 +369,7 @@ public:
virtual QWindow *window() const;
// relations
virtual Relation relationTo(int child, const QAccessibleInterface *other,
int otherChild) const;
virtual Relation relationTo(const QAccessibleInterface *other) const;
virtual QVector<QPair<QAccessibleInterface*, Relation> > relations() const;
virtual int childAt(int x, int y) const = 0;
@ -383,17 +382,16 @@ public:
virtual int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const = 0;
// properties and state
virtual QString text(Text t, int child = 0) const = 0;
virtual void setText(Text t, int child, const QString &text) = 0;
virtual QRect rect(int child = 0) const = 0;
virtual Role role(int child = 0) const = 0;
virtual State state(int child = 0) const = 0;
virtual QString text(Text t) const = 0;
virtual void setText(Text t, const QString &text) = 0;
virtual QRect rect() const = 0;
virtual Role role() const = 0;
virtual State state() const = 0;
virtual QColor foregroundColor() const;
virtual QColor backgroundColor() const;
virtual QVariant invokeMethod(Method method, int child = 0,
const QVariantList &params = QVariantList());
virtual QVariant invokeMethod(Method method, const QVariantList &params = QVariantList());
inline QSet<Method> supportedMethods()
{ return qvariant_cast<QSet<Method> >(invokeMethod(ListSupportedMethods)); }
@ -431,18 +429,16 @@ private:
class QAccessibleEvent : public QEvent
{
public:
inline QAccessibleEvent(Type type, int child);
inline int child() const { return c; }
inline QAccessibleEvent(Type type);
inline QString value() const { return val; }
inline void setValue(const QString &aText) { val = aText; }
private:
int c;
QString val;
};
inline QAccessibleEvent::QAccessibleEvent(Type atype, int achild)
: QEvent(atype), c(achild) {}
inline QAccessibleEvent::QAccessibleEvent(Type atype)
: QEvent(atype) {}
#define QAccessibleInterface_iid "com.trolltech.Qt.QAccessibleInterface"
Q_DECLARE_INTERFACE(QAccessibleInterface, QAccessibleInterface_iid)

View File

@ -401,7 +401,7 @@ QAccessibleSimpleEditableTextInterface::QAccessibleSimpleEditableTextInterface(
#ifndef QT_NO_CLIPBOARD
static QString textForRange(QAccessibleInterface *iface, int startOffset, int endOffset)
{
return iface->text(QAccessible::Value, 0).mid(startOffset, endOffset - startOffset);
return iface->text(QAccessible::Value).mid(startOffset, endOffset - startOffset);
}
#endif
@ -417,16 +417,16 @@ void QAccessibleSimpleEditableTextInterface::copyText(int startOffset, int endOf
void QAccessibleSimpleEditableTextInterface::deleteText(int startOffset, int endOffset)
{
QString txt = iface->text(QAccessible::Value, 0);
QString txt = iface->text(QAccessible::Value);
txt.remove(startOffset, endOffset - startOffset);
iface->setText(QAccessible::Value, 0, txt);
iface->setText(QAccessible::Value, txt);
}
void QAccessibleSimpleEditableTextInterface::insertText(int offset, const QString &text)
{
QString txt = iface->text(QAccessible::Value, 0);
QString txt = iface->text(QAccessible::Value);
txt.insert(offset, text);
iface->setText(QAccessible::Value, 0, txt);
iface->setText(QAccessible::Value, txt);
}
void QAccessibleSimpleEditableTextInterface::cutText(int startOffset, int endOffset)
@ -446,17 +446,17 @@ void QAccessibleSimpleEditableTextInterface::pasteText(int offset)
#ifdef QT_NO_CLIPBOARD
Q_UNUSED(offset);
#else
QString txt = iface->text(QAccessible::Value, 0);
QString txt = iface->text(QAccessible::Value);
txt.insert(offset, QGuiApplication::clipboard()->text());
iface->setText(QAccessible::Value, 0, txt);
iface->setText(QAccessible::Value, txt);
#endif
}
void QAccessibleSimpleEditableTextInterface::replaceText(int startOffset, int endOffset, const QString &text)
{
QString txt = iface->text(QAccessible::Value, 0);
QString txt = iface->text(QAccessible::Value);
txt.replace(startOffset, endOffset - startOffset, text);
iface->setText(QAccessible::Value, 0, txt);
iface->setText(QAccessible::Value, txt);
}
QT_END_NAMESPACE

View File

@ -144,13 +144,13 @@ bool QAccessibleObject::isValid() const
}
/*! \reimp */
QRect QAccessibleObject::rect(int) const
QRect QAccessibleObject::rect() const
{
return QRect();
}
/*! \reimp */
void QAccessibleObject::setText(Text, int, const QString &)
void QAccessibleObject::setText(Text, const QString &)
{
}
@ -227,20 +227,14 @@ int QAccessibleApplication::childAt(int x, int y) const
}
/*! \reimp */
QAccessible::Relation QAccessibleApplication::relationTo(int child, const
QAccessibleInterface *other, int otherChild) const
QAccessible::Relation QAccessibleApplication::relationTo(const QAccessibleInterface *other) const
{
QObject *o = other ? other->object() : 0;
if (!o)
return Unrelated;
if(o == object()) {
if (child && !otherChild)
return Child;
if (!child && otherChild)
return Ancestor;
if (!child && !otherChild)
return Self;
return Self;
}
return Unrelated;
@ -290,7 +284,7 @@ int QAccessibleApplication::navigate(RelationFlag relation, int,
}
/*! \reimp */
QString QAccessibleApplication::text(Text t, int) const
QString QAccessibleApplication::text(Text t) const
{
switch (t) {
case Name:
@ -304,13 +298,13 @@ QString QAccessibleApplication::text(Text t, int) const
}
/*! \reimp */
QAccessible::Role QAccessibleApplication::role(int) const
QAccessible::Role QAccessibleApplication::role() const
{
return Application;
}
/*! \reimp */
QAccessible::State QAccessibleApplication::state(int) const
QAccessible::State QAccessibleApplication::state() const
{
return QGuiApplication::activeWindow() ? Focused : Normal;
}

View File

@ -65,8 +65,8 @@ public:
QObject *object() const;
// properties
QRect rect(int child = 0) const;
void setText(Text t, int child, const QString &text);
QRect rect() const;
void setText(Text t, const QString &text);
protected:
virtual ~QAccessibleObject();
@ -86,7 +86,7 @@ public:
// relations
int childCount() const;
int indexOfChild(const QAccessibleInterface*) const;
Relation relationTo(int, const QAccessibleInterface *, int) const;
Relation relationTo(const QAccessibleInterface *other) const;
// navigation
QAccessibleInterface *parent() const;
@ -95,9 +95,9 @@ public:
int navigate(RelationFlag, int, QAccessibleInterface **) const;
// properties and state
QString text(Text t, int child = 0) const;
Role role(int child = 0) const;
State state(int child = 0) const;
QString text(Text t) const;
Role role() const;
State state() const;
};
#endif // QT_NO_ACCESSIBILITY

View File

@ -68,6 +68,7 @@ QT_BEGIN_NAMESPACE
QString Q_GUI_EXPORT qt_accStripAmp(const QString &text);
#if 0
#ifndef QT_NO_ITEMVIEWS
/*
The MSDN article "Exposing Data Tables through Microsoft Active Accessibility" explains
@ -425,7 +426,7 @@ int QAccessibleItemRow::childCount() const
int QAccessibleItemRow::indexOfChild(const QAccessibleInterface *iface) const
{
if (!iface || iface->role(0) != Row)
if (!iface || iface->role() != Row)
return -1;
//### meaningless code?
@ -1437,6 +1438,7 @@ QAccessible::State QAccessibleHeader::state(int child) const
return state;
}
#endif // QT_NO_ITEMVIEWS
#endif // 0
#ifndef QT_NO_TABBAR
/*!
@ -1456,14 +1458,14 @@ public:
{}
QObject *object() const { return 0; }
Role role(int child) const { Q_ASSERT(child == 0); return QAccessible::PageTab; }
State state(int) const {
Role role() const { return QAccessible::PageTab; }
State state() const {
QAccessibleInterface *parentInterface = parent();
State state = parentInterface->state();
delete parentInterface;
return state;
}
QRect rect(int) const {
QRect rect() const {
if (!isValid())
return QRect();
@ -1479,8 +1481,8 @@ public:
int childCount() const { return 0; }
int indexOfChild(const QAccessibleInterface *) const { return -1; }
QString text(Text, int) const { return qt_accStripAmp(m_parent->tabText(m_index)); }
void setText(Text, int, const QString &) {}
QString text(Text) const { return qt_accStripAmp(m_parent->tabText(m_index)); }
void setText(Text, const QString &) {}
QAccessibleInterface *parent() const {
return QAccessible::queryAccessibleInterface(m_parent);
@ -1494,17 +1496,12 @@ public:
}
return -1;
}
Relation relationTo(int, const QAccessibleInterface *, int) const
Relation relationTo(const QAccessibleInterface *) const
{
return QAccessible::Unrelated;
}
// action interface
int actionCount() {
return 1;
}
QStringList actionNames() const
{
return QStringList(pressAction());
@ -1587,9 +1584,8 @@ int QAccessibleTabBar::childCount() const
return tabBar()->count() + 2;
}
QString QAccessibleTabBar::text(Text t, int child) const
QString QAccessibleTabBar::text(Text t) const
{
Q_ASSERT(child == 0);
if (t == QAccessible::Name) {
return qt_accStripAmp(tabBar()->tabText(tabBar()->currentIndex()));
}
@ -1694,14 +1690,14 @@ int QAccessibleComboBox::indexOfChild(const QAccessibleInterface *child) const
}
/*! \reimp */
QString QAccessibleComboBox::text(Text t, int) const
QString QAccessibleComboBox::text(Text t) const
{
QString str;
switch (t) {
case Name:
#ifndef Q_OS_UNIX // on Linux we use relations for this, name is text (fall through to Value)
str = QAccessibleWidget::text(t, 0);
str = QAccessibleWidget::text(t);
break;
#endif
case Value:
@ -1719,7 +1715,7 @@ QString QAccessibleComboBox::text(Text t, int) const
break;
}
if (str.isEmpty())
str = QAccessibleWidget::text(t, 0);
str = QAccessibleWidget::text(t);
return str;
}

View File

@ -99,6 +99,7 @@ public:
#endif // QT_NO_SCROLLAREA
#if 0
#ifndef QT_NO_ITEMVIEWS
class QAccessibleHeader : public QAccessibleWidget
{
@ -225,6 +226,7 @@ private:
bool atVP;
};
#endif
#endif
#ifndef QT_NO_TABBAR
@ -235,7 +237,7 @@ public:
explicit QAccessibleTabBar(QWidget *w);
int childCount() const;
QString text(Text t, int child) const;
QString text(Text t) const;
bool setSelected(int child, bool on, bool extend);
QVector<int> selection() const;
@ -261,7 +263,7 @@ public:
int indexOfChild(const QAccessibleInterface *child) const;
QAccessibleInterface* child(int index) const;
QString text(Text t, int child) const;
QString text(Text t) const;
// QAccessibleActionInterface
QStringList actionNames() const;

View File

@ -222,7 +222,7 @@ QAccessibleTable2Cell *QAccessibleTable2::cell(const QModelIndex &index) const
QAccessibleTable2CellInterface *QAccessibleTable2::cellAt(int row, int column) const
{
Q_ASSERT(role(0) != QAccessible::Tree);
Q_ASSERT(role() != QAccessible::Tree);
QModelIndex index = view->model()->index(row, column);
//Q_ASSERT(index.isValid());
if (!index.isValid()) {
@ -357,15 +357,13 @@ QAccessible2::TableModelChange QAccessibleTable2::modelChange() const
return change;
}
QAccessible::Role QAccessibleTable2::role(int child) const
QAccessible::Role QAccessibleTable2::role() const
{
Q_ASSERT(child == 0);
return m_role;
}
QAccessible::State QAccessibleTable2::state(int child) const
QAccessible::State QAccessibleTable2::state() const
{
Q_ASSERT(child == 0);
return QAccessible::Normal;
}
@ -393,37 +391,35 @@ int QAccessibleTable2::childCount() const
int QAccessibleTable2::indexOfChild(const QAccessibleInterface *iface) const
{
Q_ASSERT(iface->role(0) != QAccessible::TreeItem); // should be handled by tree class
if (iface->role(0) == QAccessible::Cell || iface->role(0) == QAccessible::ListItem) {
Q_ASSERT(iface->role() != QAccessible::TreeItem); // should be handled by tree class
if (iface->role() == QAccessible::Cell || iface->role() == QAccessible::ListItem) {
const QAccessibleTable2Cell* cell = static_cast<const QAccessibleTable2Cell*>(iface);
return logicalIndex(cell->m_index);
} else if (iface->role(0) == QAccessible::ColumnHeader){
} else if (iface->role() == QAccessible::ColumnHeader){
const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface);
return cell->index + (verticalHeader() ? 1 : 0) + 1;
} else if (iface->role(0) == QAccessible::RowHeader){
} else if (iface->role() == QAccessible::RowHeader){
const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface);
return (cell->index+1) * (view->model()->rowCount()+1) + 1;
} else if (iface->role(0) == QAccessible::Pane) {
} else if (iface->role() == QAccessible::Pane) {
return 1; // corner button
} else {
qWarning() << "WARNING QAccessibleTable2::indexOfChild Fix my children..."
<< iface->role(0) << iface->text(QAccessible::Name, 0);
<< iface->role() << iface->text(QAccessible::Name);
}
// FIXME: we are in denial of our children. this should stop.
return -1;
}
QString QAccessibleTable2::text(Text t, int child) const
QString QAccessibleTable2::text(Text t) const
{
Q_ASSERT(child == 0);
if (t == QAccessible::Description)
return view->accessibleDescription();
return view->accessibleName();
}
QRect QAccessibleTable2::rect(int child) const
QRect QAccessibleTable2::rect() const
{
Q_ASSERT(!child);
if (!view->isVisible())
return QRect();
QPoint pos = view->mapToGlobal(QPoint(0, 0));
@ -469,27 +465,11 @@ int QAccessibleTable2::navigate(RelationFlag relation, int index, QAccessibleInt
return -1;
}
QAccessible::Relation QAccessibleTable2::relationTo(int, const QAccessibleInterface *, int) const
QAccessible::Relation QAccessibleTable2::relationTo(const QAccessibleInterface *) const
{
return QAccessible::Unrelated;
}
#ifndef QT_NO_ACTION
int QAccessibleTable2::userActionCount(int) const
{
return 0;
}
QString QAccessibleTable2::actionText(int, Text, int) const
{
return QString();
}
bool QAccessibleTable2::doAction(int, int, const QVariantList &)
{
return false;
}
#endif
// TREE VIEW
QModelIndex QAccessibleTree::indexFromLogical(int row, int column) const
@ -541,7 +521,7 @@ int QAccessibleTree::rowCount() const
int QAccessibleTree::indexOfChild(const QAccessibleInterface *iface) const
{
if (iface->role(0) == QAccessible::TreeItem) {
if (iface->role() == QAccessible::TreeItem) {
const QAccessibleTable2Cell* cell = static_cast<const QAccessibleTable2Cell*>(iface);
const QTreeView *treeView = qobject_cast<const QTreeView*>(view);
Q_ASSERT(treeView);
@ -552,13 +532,13 @@ int QAccessibleTree::indexOfChild(const QAccessibleInterface *iface) const
//qDebug() << "QAccessibleTree::indexOfChild r " << row << " c " << column << "index " << index;
Q_ASSERT(index > treeView->model()->columnCount());
return index;
} else if (iface->role(0) == QAccessible::ColumnHeader){
} else if (iface->role() == QAccessible::ColumnHeader){
const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface);
//qDebug() << "QAccessibleTree::indexOfChild header " << cell->index << "is: " << cell->index + 1;
return cell->index + 1;
} else {
qWarning() << "WARNING QAccessibleTable2::indexOfChild invalid child"
<< iface->role(0) << iface->text(QAccessible::Name, 0);
<< iface->role() << iface->text(QAccessible::Name);
}
// FIXME: add scrollbars and don't just ignore them
return -1;
@ -596,7 +576,7 @@ int QAccessibleTree::navigate(RelationFlag relation, int index, QAccessibleInter
return QAccessibleTable2::navigate(relation, index, iface);
}
QAccessible::Relation QAccessibleTree::relationTo(int, const QAccessibleInterface *, int) const
QAccessible::Relation QAccessibleTree::relationTo(const QAccessibleInterface *) const
{
return QAccessible::Unrelated;
}
@ -695,7 +675,7 @@ int QAccessibleTable2Cell::columnIndex() const
int QAccessibleTable2Cell::rowIndex() const
{
if (role(0) == QAccessible::TreeItem) {
if (role() == QAccessible::TreeItem) {
const QTreeView *treeView = qobject_cast<const QTreeView*>(view);
Q_ASSERT(treeView);
int row = treeView->d_func()->viewIndex(m_index);
@ -723,20 +703,18 @@ QAccessibleTable2Interface* QAccessibleTable2Cell::table() const
return QAccessible::queryAccessibleInterface(view)->table2Interface();
}
QAccessible::Role QAccessibleTable2Cell::role(int child) const
QAccessible::Role QAccessibleTable2Cell::role() const
{
Q_ASSERT(child == 0);
return m_role;
}
QAccessible::State QAccessibleTable2Cell::state(int child) const
QAccessible::State QAccessibleTable2Cell::state() const
{
Q_ASSERT(child == 0);
State st = Normal;
QRect globalRect = view->rect();
globalRect.translate(view->mapToGlobal(QPoint(0,0)));
if (!globalRect.intersects(rect(0)))
if (!globalRect.intersects(rect()))
st |= Invisible;
if (view->selectionModel()->isSelected(m_index))
@ -768,10 +746,8 @@ bool QAccessibleTable2Cell::isExpandable() const
return view->model()->hasChildren(m_index);
}
QRect QAccessibleTable2Cell::rect(int child) const
QRect QAccessibleTable2Cell::rect() const
{
Q_ASSERT(child == 0);
QRect r;
r = view->visualRect(m_index);
@ -781,9 +757,8 @@ QRect QAccessibleTable2Cell::rect(int child) const
return r;
}
QString QAccessibleTable2Cell::text(Text t, int child) const
QString QAccessibleTable2Cell::text(Text t) const
{
Q_ASSERT(child == 0);
QAbstractItemModel *model = view->model();
QString value;
switch (t) {
@ -802,9 +777,8 @@ QString QAccessibleTable2Cell::text(Text t, int child) const
return value;
}
void QAccessibleTable2Cell::setText(Text /*t*/, int child, const QString &text)
void QAccessibleTable2Cell::setText(Text /*t*/, const QString &text)
{
Q_ASSERT(child == 0);
if (!(m_index.flags() & Qt::ItemIsEditable))
return;
view->model()->setData(m_index, text);
@ -888,12 +862,10 @@ int QAccessibleTable2Cell::navigate(RelationFlag relation, int index, QAccessibl
return -1;
}
QAccessible::Relation QAccessibleTable2Cell::relationTo(int child, const QAccessibleInterface *other, int otherChild) const
QAccessible::Relation QAccessibleTable2Cell::relationTo(const QAccessibleInterface *other) const
{
Q_ASSERT(child == 0);
Q_ASSERT(otherChild == 0);
// we only check for parent-child relationships in trees
if (m_role == QAccessible::TreeItem && other->role(0) == QAccessible::TreeItem) {
if (m_role == QAccessible::TreeItem && other->role() == QAccessible::TreeItem) {
QModelIndex otherIndex = static_cast<const QAccessibleTable2Cell*>(other)->m_index;
// is the other our parent?
if (otherIndex.parent() == m_index)
@ -905,46 +877,26 @@ QAccessible::Relation QAccessibleTable2Cell::relationTo(int child, const QAccess
return QAccessible::Unrelated;
}
#ifndef QT_NO_ACTION
int QAccessibleTable2Cell::userActionCount(int) const
{
return 0;
}
QString QAccessibleTable2Cell::actionText(int, Text, int) const
{
return QString();
}
bool QAccessibleTable2Cell::doAction(int, int, const QVariantList &)
{
return false;
}
QAccessibleTable2HeaderCell::QAccessibleTable2HeaderCell(QAbstractItemView *view_, int index_, Qt::Orientation orientation_)
: view(view_), index(index_), orientation(orientation_)
{
Q_ASSERT(index_ >= 0);
}
QAccessible::Role QAccessibleTable2HeaderCell::role(int child) const
QAccessible::Role QAccessibleTable2HeaderCell::role() const
{
Q_ASSERT(child == 0);
if (orientation == Qt::Horizontal)
return QAccessible::ColumnHeader;
return QAccessible::RowHeader;
}
QAccessible::State QAccessibleTable2HeaderCell::state(int child) const
QAccessible::State QAccessibleTable2HeaderCell::state() const
{
Q_ASSERT(child == 0);
return QAccessible::Normal;
}
QRect QAccessibleTable2HeaderCell::rect(int child) const
QRect QAccessibleTable2HeaderCell::rect() const
{
Q_ASSERT(child == 0);
QHeaderView *header = 0;
if (false) {
#ifndef QT_NO_TABLEVIEW
@ -968,9 +920,8 @@ QRect QAccessibleTable2HeaderCell::rect(int child) const
: QRect(zero.x(), zero.y() + sectionPos, header->width(), sectionSize);
}
QString QAccessibleTable2HeaderCell::text(Text t, int child) const
QString QAccessibleTable2HeaderCell::text(Text t) const
{
Q_ASSERT(child == 0);
QAbstractItemModel *model = view->model();
QString value;
switch (t) {
@ -989,7 +940,7 @@ QString QAccessibleTable2HeaderCell::text(Text t, int child) const
return value;
}
void QAccessibleTable2HeaderCell::setText(Text, int, const QString &)
void QAccessibleTable2HeaderCell::setText(Text, const QString &)
{
return;
}
@ -1031,27 +982,6 @@ QAccessible::Relation QAccessibleTable2HeaderCell::relationTo(int, const QAccess
return QAccessible::Unrelated;
}
#ifndef QT_NO_ACTION
int QAccessibleTable2HeaderCell::userActionCount(int) const
{
return 0;
}
QString QAccessibleTable2HeaderCell::actionText(int, Text, int) const
{
return QString();
}
bool QAccessibleTable2HeaderCell::doAction(int, int, const QVariantList &)
{
return false;
}
#endif
#endif
#endif // QT_NO_ITEMVIEWS
QT_END_NAMESPACE

View File

@ -67,10 +67,10 @@ public:
virtual ~QAccessibleTable2();
QObject *object() const { return view; }
Role role(int child) const;
State state(int child) const;
QString text(Text t, int child) const;
QRect rect(int child) const;
Role role() const;
State state() const;
QString text(Text t) const;
QRect rect() const;
int childAt(int x, int y) const;
int childCount() const;
@ -79,14 +79,9 @@ public:
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const;
Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const;
Relation relationTo(const QAccessibleInterface *other) const;
#ifndef QT_NO_ACTION
int userActionCount(int child) const;
QString actionText(int action, Text t, int child) const;
bool doAction(int action, int child, const QVariantList &params);
#endif
QVariant invokeMethodEx(Method, int, const QVariantList &) { return QVariant(); }
QVariant invokeMethod(Method, const QVariantList &) { return QVariant(); }
// table2 interface
virtual QAccessibleTable2CellInterface *cellAt(int row, int column) const;
@ -165,7 +160,7 @@ public:
int rowCount() const;
int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const;
Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const;
Relation relationTo(const QAccessibleInterface *other) const;
// table2 interface
QAccessibleTable2CellInterface *cellAt(int row, int column) const;
@ -183,31 +178,25 @@ public:
QAccessibleTable2Cell(QAbstractItemView *view, const QModelIndex &m_index, QAccessible::Role role);
QObject *object() const { return 0; }
Role role(int child) const;
State state(int child) const;
QRect rect(int child) const;
Role role() const;
State state() const;
QRect rect() const;
bool isValid() const;
int childAt(int, int) const { return 0; }
int childCount() const { return 0; }
int indexOfChild(const QAccessibleInterface *) const { return -1; }
QString text(Text t, int child) const;
void setText(Text t, int child, const QString &text);
QString text(Text t) const;
void setText(Text t, const QString &text);
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int) const;
int navigate(RelationFlag relation, int m_index, QAccessibleInterface **iface) const;
Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const;
Relation relationTo(const QAccessibleInterface *other) const;
bool isExpandable() const;
#ifndef QT_NO_ACTION
int userActionCount(int child) const;
QString actionText(int action, Text t, int child) const;
bool doAction(int action, int child, const QVariantList &params);
#endif
// cell interface
virtual int columnExtent() const;
virtual QList<QAccessibleInterface*> columnHeaderCells() const;
@ -238,29 +227,23 @@ public:
QAccessibleTable2HeaderCell(QAbstractItemView *view, int index, Qt::Orientation orientation);
QObject *object() const { return 0; }
Role role(int child) const;
State state(int child) const;
QRect rect(int child) const;
Role role() const;
State state() const;
QRect rect() const;
bool isValid() const;
int childAt(int, int) const { return 0; }
int childCount() const { return 0; }
int indexOfChild(const QAccessibleInterface *) const { return -1; }
QString text(Text t, int child) const;
void setText(Text t, int child, const QString &text);
QString text(Text t) const;
void setText(Text t, const QString &text);
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const;
Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const;
#ifndef QT_NO_ACTION
int userActionCount(int child) const;
QString actionText(int action, Text t, int child) const;
bool doAction(int action, int child, const QVariantList &params);
#endif
private:
QAbstractItemView *view;
int index;
@ -281,17 +264,17 @@ public:
{}
QObject *object() const { return 0; }
Role role(int child) const { Q_ASSERT(child == 0); return QAccessible::Pane; }
State state(int child) const { Q_ASSERT(child == 0); return QAccessible::Normal; }
QRect rect(int child) const { Q_ASSERT(child == 0); return QRect(); }
Role role() const { return QAccessible::Pane; }
State state() const { return QAccessible::Normal; }
QRect rect() const { return QRect(); }
bool isValid() const { return true; }
int childAt(int, int) const { return 0; }
int childCount() const { return 0; }
int indexOfChild(const QAccessibleInterface *) const { return -1; }
QString text(Text, int) const { return QString(); }
void setText(Text, int, const QString &) {}
QString text(Text) const { return QString(); }
void setText(Text, const QString &) {}
QAccessibleInterface *parent() const {
return QAccessible::queryAccessibleInterface(view);
@ -312,11 +295,6 @@ public:
return QAccessible::Unrelated;
}
#ifndef QT_NO_ACTION
int userActionCount(int) const { return 0; }
QString actionText(int, Text, int) const { return QString(); }
bool doAction(int, int, const QVariantList &) { return false; }
#endif
private:
QAbstractItemView *view;
};

View File

@ -255,7 +255,6 @@ QAccessibleInterface *AccessibleFactory::create(const QString &classname, QObjec
iface = new QAccessibleMenu(widget);
#endif
#ifndef QT_NO_ITEMVIEWS
#ifdef Q_OS_UNIX
} else if (classname == QLatin1String("QAbstractItemView")) {
if (qobject_cast<const QTreeView*>(widget)) {
iface = new QAccessibleTree(widget);
@ -270,16 +269,6 @@ QAccessibleInterface *AccessibleFactory::create(const QString &classname, QObjec
} else {
iface = new QAccessibleTable2(widget->parentWidget());
}
#else
} else if (classname == QLatin1String("QHeaderView")) {
iface = new QAccessibleHeader(widget);
} else if (classname == QLatin1String("QAbstractItemView")) {
iface = new QAccessibleItemView(widget);
} else if (classname == QLatin1String("QWidget")
&& widget->objectName() == QLatin1String("qt_scrollarea_viewport")
&& qobject_cast<QAbstractItemView*>(widget->parentWidget())) {
iface = new QAccessibleItemView(widget);
#endif // Q_OS_UNIX
#endif // QT_NO_ITEMVIEWS
#ifndef QT_NO_TABBAR
} else if (classname == QLatin1String("QTabBar")) {

View File

@ -71,12 +71,6 @@ int QAccessibleMenu::childCount() const
return menu()->actions().count();
}
QRect QAccessibleMenu::rect(int child) const
{
Q_ASSERT(child == 0);
return QAccessibleWidget::rect(child);
}
int QAccessibleMenu::childAt(int x, int y) const
{
QAction *act = menu()->actionAt(menu()->mapFromGlobal(QPoint(x,y)));
@ -85,11 +79,10 @@ int QAccessibleMenu::childAt(int x, int y) const
return menu()->actions().indexOf(act) + 1;
}
QString QAccessibleMenu::text(Text t, int child) const
QString QAccessibleMenu::text(Text t) const
{
Q_ASSERT(child == 0);
QString tx = QAccessibleWidget::text(t, child);
if (tx.size())
QString tx = QAccessibleWidget::text(t);
if (!tx.isEmpty())
return tx;
if (t == Name)
@ -97,19 +90,11 @@ QString QAccessibleMenu::text(Text t, int child) const
return tx;
}
QAccessible::Role QAccessibleMenu::role(int child) const
QAccessible::Role QAccessibleMenu::role() const
{
Q_ASSERT(child == 0);
return PopupMenu;
}
QAccessible::State QAccessibleMenu::state(int child) const
{
Q_ASSERT(child == 0);
State s = QAccessibleWidget::state(child);
return s;
}
QAccessibleInterface *QAccessibleMenu::child(int index) const
{
if (index < childCount())
@ -144,7 +129,7 @@ int QAccessibleMenu::navigate(RelationFlag relation, int entry, QAccessibleInter
int QAccessibleMenu::indexOfChild( const QAccessibleInterface *child ) const
{
int index = -1;
Role r = child->role(0);
Role r = child->role();
if ((r == MenuItem || r == Separator) && menu()) {
index = menu()->actions().indexOf(qobject_cast<QAction*>(child->object()));
if (index != -1)
@ -155,7 +140,7 @@ int QAccessibleMenu::indexOfChild( const QAccessibleInterface *child ) const
#ifndef QT_NO_MENUBAR
QAccessibleMenuBar::QAccessibleMenuBar(QWidget *w)
: QAccessibleWidget(w)
: QAccessibleWidget(w, MenuBar)
{
Q_ASSERT(menuBar());
}
@ -170,12 +155,6 @@ int QAccessibleMenuBar::childCount() const
return menuBar()->actions().count();
}
QRect QAccessibleMenuBar::rect(int child) const
{
Q_ASSERT(child == 0);
return QAccessibleWidget::rect(child);
}
QAccessibleInterface *QAccessibleMenuBar::child(int index) const
{
if (index < childCount())
@ -195,7 +174,7 @@ int QAccessibleMenuBar::navigate(RelationFlag relation, int entry, QAccessibleIn
int QAccessibleMenuBar::indexOfChild(const QAccessibleInterface *child) const
{
int index = -1;
Role r = child->role(0);
Role r = child->role();
if ((r == MenuItem || r == Separator) && menuBar()) {
index = menuBar()->actions().indexOf(qobject_cast<QAction*>(child->object()));
if (index != -1)
@ -204,25 +183,6 @@ int QAccessibleMenuBar::indexOfChild(const QAccessibleInterface *child) const
return index;
}
QString QAccessibleMenuBar::text(Text t, int child) const
{
Q_ASSERT(child == 0);
return QAccessibleWidget::text(t, child);
}
QAccessible::Role QAccessibleMenuBar::role(int child) const
{
Q_ASSERT(child == 0);
return MenuBar;
}
QAccessible::State QAccessibleMenuBar::state(int child) const
{
Q_ASSERT(child == 0);
State s = QAccessibleWidget::state(child);
return s;
}
#endif // QT_NO_MENUBAR
QAccessibleMenuItem::QAccessibleMenuItem(QWidget *owner, QAction *action) : m_action(action), m_owner(owner)
@ -235,8 +195,12 @@ QAccessibleMenuItem::~QAccessibleMenuItem()
int QAccessibleMenuItem::childAt(int x, int y ) const
{
for (int i = childCount(); i >= 0; --i) {
if (rect(i).contains(x,y))
QAccessibleInterface *childInterface = child(i);
if (childInterface->rect().contains(x,y)) {
delete childInterface;
return i;
}
delete childInterface;
}
return -1;
}
@ -249,7 +213,7 @@ int QAccessibleMenuItem::childCount() const
int QAccessibleMenuItem::indexOfChild(const QAccessibleInterface * child) const
{
Q_ASSERT(child == 0);
if (child->role(0) == PopupMenu && child->object() == m_action->menu())
if (child->role() == PopupMenu && child->object() == m_action->menu())
return 1;
return -1;
@ -318,9 +282,8 @@ QObject *QAccessibleMenuItem::object() const
return m_action;
}
QRect QAccessibleMenuItem::rect(int child) const
QRect QAccessibleMenuItem::rect() const
{
Q_ASSERT(child == 0);
QRect rect;
QWidget *own = owner();
#ifndef QT_NO_MENUBAR
@ -338,31 +301,27 @@ QRect QAccessibleMenuItem::rect(int child) const
return rect;
}
QAccessible::Relation QAccessibleMenuItem::relationTo ( int child, const QAccessibleInterface * other, int otherChild ) const
QAccessible::Relation QAccessibleMenuItem::relationTo(const QAccessibleInterface *other) const
{
Q_ASSERT(child == 0);
if (other->object() == owner()) {
return Child;
}
Q_UNUSED(child)
Q_UNUSED(other)
Q_UNUSED(otherChild)
// ###
return Unrelated;
}
QAccessible::Role QAccessibleMenuItem::role(int) const
QAccessible::Role QAccessibleMenuItem::role() const
{
return m_action->isSeparator() ? Separator : MenuItem;
}
void QAccessibleMenuItem::setText ( Text /*t*/, int /*child*/, const QString & /*text */)
void QAccessibleMenuItem::setText ( Text /*t*/, const QString & /*text */)
{
}
QAccessible::State QAccessibleMenuItem::state(int child) const
QAccessible::State QAccessibleMenuItem::state() const
{
Q_ASSERT(child == 0);
QAccessible::State s = Normal;
QWidget *own = owner();
@ -389,9 +348,8 @@ QAccessible::State QAccessibleMenuItem::state(int child) const
return s;
}
QString QAccessibleMenuItem::text ( Text t, int child ) const
QString QAccessibleMenuItem::text(Text t) const
{
Q_ASSERT(child == 0);
QString str;
switch (t) {
case Name:
@ -416,22 +374,6 @@ QString QAccessibleMenuItem::text ( Text t, int child ) const
return str;
}
QString QAccessibleMenuItem::actionText(int action, Text text, int child) const
{
Q_ASSERT(child == 0);
if (!m_action || m_action->isSeparator())
return QString();
if (text == Name && ((action == Press) || (action == DefaultAction))) {
if (m_action->menu()) {
return QMenu::tr("Open");
}
return QMenu::tr("Execute");
}
return QString();
}
QStringList QAccessibleMenuItem::actionNames() const
{
QStringList actions;

View File

@ -61,10 +61,8 @@ public:
int childCount() const;
int childAt(int x, int y) const;
QRect rect(int child) const;
QString text(Text t, int child) const;
Role role(int child) const;
State state(int child) const;
QString text(Text t) const;
Role role() const;
QAccessibleInterface *child(int index) const;
QAccessibleInterface *parent() const;
int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
@ -83,12 +81,8 @@ public:
QAccessibleInterface *child(int index) const;
int childCount() const;
QRect rect(int child) const;
QString text(Text t, int child) const;
Role role(int child) const;
State state(int child) const;
int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
int indexOfChild( const QAccessibleInterface *child ) const;
int indexOfChild(const QAccessibleInterface *child) const;
protected:
QMenuBar *menuBar() const;
@ -103,22 +97,21 @@ public:
explicit QAccessibleMenuItem(QWidget *owner, QAction *w);
virtual ~QAccessibleMenuItem();
virtual QString actionText ( int action, Text t, int child ) const;
virtual int childAt ( int x, int y ) const;
virtual int childCount () const;
virtual int indexOfChild ( const QAccessibleInterface * child ) const;
virtual bool isValid () const;
virtual int childAt(int x, int y) const;
virtual int childCount() const;
virtual int indexOfChild(const QAccessibleInterface * child) const;
virtual bool isValid() const;
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
virtual int navigate ( RelationFlag relation, int entry, QAccessibleInterface ** target ) const;
virtual QObject * object () const;
virtual QRect rect ( int child ) const;
virtual Relation relationTo ( int child, const QAccessibleInterface * other, int otherChild ) const;
virtual Role role ( int child ) const;
virtual void setText ( Text t, int child, const QString & text );
virtual State state ( int child ) const;
virtual QString text ( Text t, int child ) const;
virtual int navigate(RelationFlag relation, int entry, QAccessibleInterface ** target) const;
virtual QObject * object() const;
virtual QRect rect() const;
virtual Relation relationTo(const QAccessibleInterface *other) const;
virtual Role role() const;
virtual void setText(Text t, const QString & text );
virtual State state() const;
virtual QString text(Text t) const;
// QAccessibleActionInterface
QStringList actionNames() const;

View File

@ -262,18 +262,18 @@ QTextEdit *QAccessibleTextEdit::textEdit() const
return static_cast<QTextEdit *>(widget());
}
QString QAccessibleTextEdit::text(Text t, int) const
QString QAccessibleTextEdit::text(Text t) const
{
if (t == Value)
return textEdit()->toPlainText();
return QAccessibleWidget::text(t, 0);
return QAccessibleWidget::text(t);
}
void QAccessibleTextEdit::setText(Text t, int, const QString &text)
void QAccessibleTextEdit::setText(Text t, const QString &text)
{
if (t != Value) {
QAccessibleWidget::setText(t, 0, text);
QAccessibleWidget::setText(t, text);
return;
}
if (textEdit()->isReadOnly())
@ -282,7 +282,7 @@ void QAccessibleTextEdit::setText(Text t, int, const QString &text)
textEdit()->setText(text);
}
QVariant QAccessibleTextEdit::invokeMethod(QAccessible::Method method, int,
QVariant QAccessibleTextEdit::invokeMethod(QAccessible::Method method,
const QVariantList &params)
{
switch (method) {
@ -290,7 +290,7 @@ QVariant QAccessibleTextEdit::invokeMethod(QAccessible::Method method, int,
QSet<QAccessible::Method> set;
set << ListSupportedMethods << SetCursorPosition << GetCursorPosition;
return QVariant::fromValue(set | qvariant_cast<QSet<QAccessible::Method> >(
QAccessibleWidget::invokeMethod(method, 0, params)));
QAccessibleWidget::invokeMethod(method, params)));
}
case SetCursorPosition:
setCursorPosition(params.value(0).toInt());
@ -298,7 +298,7 @@ QVariant QAccessibleTextEdit::invokeMethod(QAccessible::Method method, int,
case GetCursorPosition:
return textEdit()->textCursor().position();
default:
return QAccessibleWidget::invokeMethod(method, 0, params);
return QAccessibleWidget::invokeMethod(method, params);
}
}
@ -775,72 +775,6 @@ QAccessibleToolBox::QAccessibleToolBox(QWidget *widget)
Q_ASSERT(qobject_cast<QToolBox *>(widget));
}
QString QAccessibleToolBox::text(Text textType, int child) const
{
if (textType != Value || child <= 0 || child > toolBox()->count())
return QAccessibleWidget::text(textType, child);
return toolBox()->itemText(child - 1);
}
void QAccessibleToolBox::setText(Text textType, int child, const QString &text)
{
if (textType != Value || child <= 0 || child > toolBox()->count()) {
QAccessibleWidget::setText(textType, child, text);
return;
}
toolBox()->setItemText(child - 1, text);
}
QAccessible::State QAccessibleToolBox::state(int child) const
{
QWidget *childWidget = toolBox()->widget(child - 1);
if (!childWidget)
return QAccessibleWidget::state(child);
QAccessible::State childState = QAccessible::Normal;
if (toolBox()->currentWidget() == childWidget)
childState |= QAccessible::Expanded;
else
childState |= QAccessible::Collapsed;
return childState;
}
QVariant QAccessibleToolBox::invokeMethod(QAccessible::Method, int, const QVariantList &)
{
return QVariant();
}
int QAccessibleToolBox::childCount() const
{
return toolBox()->count();
}
int QAccessibleToolBox::indexOfChild(const QAccessibleInterface *child) const
{
if (!child)
return -1;
QWidget *childWidget = qobject_cast<QWidget *>(child->object());
if (!childWidget)
return -1;
int index = toolBox()->indexOf(childWidget);
if (index != -1)
++index;
return index;
}
int QAccessibleToolBox::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
{
*target = 0;
if (entry <= 0 || entry > toolBox()->count())
return QAccessibleWidget::navigate(relation, entry, target);
int index = -1;
if (relation == QAccessible::Up)
index = entry - 2;
else if (relation == QAccessible::Down)
index = entry;
*target = QAccessible::queryAccessibleInterface(toolBox()->widget(index));
return *target ? 0: -1;
}
QToolBox * QAccessibleToolBox::toolBox() const
{
return static_cast<QToolBox *>(object());
@ -855,25 +789,6 @@ QAccessibleMdiArea::QAccessibleMdiArea(QWidget *widget)
Q_ASSERT(qobject_cast<QMdiArea *>(widget));
}
QAccessible::State QAccessibleMdiArea::state(int child) const
{
if (child < 0)
return QAccessibleWidget::state(child);
if (child == 0)
return QAccessible::Normal;
QList<QMdiSubWindow *> subWindows = mdiArea()->subWindowList();
if (subWindows.isEmpty() || child > subWindows.count())
return QAccessibleWidget::state(child);
if (subWindows.at(child - 1) == mdiArea()->activeSubWindow())
return QAccessible::Focused;
return QAccessible::Normal;
}
QVariant QAccessibleMdiArea::invokeMethod(QAccessible::Method, int, const QVariantList &)
{
return QVariant();
}
int QAccessibleMdiArea::childCount() const
{
return mdiArea()->subWindowList().count();
@ -927,28 +842,26 @@ QAccessibleMdiSubWindow::QAccessibleMdiSubWindow(QWidget *widget)
Q_ASSERT(qobject_cast<QMdiSubWindow *>(widget));
}
QString QAccessibleMdiSubWindow::text(Text textType, int child) const
QString QAccessibleMdiSubWindow::text(Text textType) const
{
if (textType == QAccessible::Name && (child == 0 || child == 1)) {
if (textType == QAccessible::Name) {
QString title = mdiSubWindow()->windowTitle();
title.replace(QLatin1String("[*]"), QLatin1String(""));
return title;
}
return QAccessibleWidget::text(textType, child);
return QAccessibleWidget::text(textType);
}
void QAccessibleMdiSubWindow::setText(Text textType, int child, const QString &text)
void QAccessibleMdiSubWindow::setText(Text textType, const QString &text)
{
if (textType == QAccessible::Name && (child == 0 || child == 1))
if (textType == QAccessible::Name)
mdiSubWindow()->setWindowTitle(text);
else
QAccessibleWidget::setText(textType, child, text);
QAccessibleWidget::setText(textType, text);
}
QAccessible::State QAccessibleMdiSubWindow::state(int child) const
QAccessible::State QAccessibleMdiSubWindow::state() const
{
if (child != 0 || !mdiSubWindow()->parent())
return QAccessibleWidget::state(child);
QAccessible::State state = QAccessible::Normal | QAccessible::Focusable;
if (!mdiSubWindow()->isMaximized())
state |= (QAccessible::Movable | QAccessible::Sizeable);
@ -964,11 +877,6 @@ QAccessible::State QAccessibleMdiSubWindow::state(int child) const
return state;
}
QVariant QAccessibleMdiSubWindow::invokeMethod(QAccessible::Method, int, const QVariantList &)
{
return QVariant();
}
int QAccessibleMdiSubWindow::childCount() const
{
if (mdiSubWindow()->widget())
@ -1026,23 +934,14 @@ int QAccessibleMdiSubWindow::navigate(RelationFlag relation, int entry, QAccessi
return *target ? 0: -1;
}
QRect QAccessibleMdiSubWindow::rect(int child) const
QRect QAccessibleMdiSubWindow::rect() const
{
if (mdiSubWindow()->isHidden())
return QRect();
if (!mdiSubWindow()->parent())
return QAccessibleWidget::rect(child);
return QAccessibleWidget::rect();
const QPoint pos = mdiSubWindow()->mapToGlobal(QPoint(0, 0));
if (child == 0)
return QRect(pos, mdiSubWindow()->size());
if (child == 1 && mdiSubWindow()->widget()) {
if (mdiSubWindow()->widget()->isHidden())
return QRect();
const QRect contentsRect = mdiSubWindow()->contentsRect();
return QRect(pos.x() + contentsRect.x(), pos.y() + contentsRect.y(),
contentsRect.width(), contentsRect.height());
}
return QRect();
return QRect(pos, mdiSubWindow()->size());
}
int QAccessibleMdiSubWindow::childAt(int x, int y) const
@ -1051,10 +950,12 @@ int QAccessibleMdiSubWindow::childAt(int x, int y) const
return -1;
if (!mdiSubWindow()->parent())
return QAccessibleWidget::childAt(x, y);
const QRect globalGeometry = rect(0);
const QRect globalGeometry = rect();
if (!globalGeometry.isValid())
return -1;
const QRect globalChildGeometry = rect(1);
QAccessibleInterface *childIface = child(0);
const QRect globalChildGeometry = childIface->rect();
delete childIface;
if (globalChildGeometry.isValid() && globalChildGeometry.contains(QPoint(x, y)))
return 1;
if (globalGeometry.contains(QPoint(x, y)))
@ -1076,25 +977,6 @@ QAccessibleWorkspace::QAccessibleWorkspace(QWidget *widget)
Q_ASSERT(qobject_cast<QWorkspace *>(widget));
}
QAccessible::State QAccessibleWorkspace::state(int child) const
{
if (child < 0)
return QAccessibleWidget::state(child);
if (child == 0)
return QAccessible::Normal;
QWidgetList subWindows = workspace()->windowList();
if (subWindows.isEmpty() || child > subWindows.count())
return QAccessibleWidget::state(child);
if (subWindows.at(child - 1) == workspace()->activeWindow())
return QAccessible::Focused;
return QAccessible::Normal;
}
QVariant QAccessibleWorkspace::invokeMethod(QAccessible::Method, int, const QVariantList &)
{
return QVariant();
}
int QAccessibleWorkspace::childCount() const
{
return workspace()->windowList().count();
@ -1163,10 +1045,8 @@ QAccessibleTextBrowser::QAccessibleTextBrowser(QWidget *widget)
Q_ASSERT(qobject_cast<QTextBrowser *>(widget));
}
QAccessible::Role QAccessibleTextBrowser::role(int child) const
QAccessible::Role QAccessibleTextBrowser::role() const
{
if (child != 0)
return QAccessibleTextEdit::role(child);
return QAccessible::StaticText;
}
#endif // QT_NO_TEXTBROWSER
@ -1275,15 +1155,6 @@ QAccessibleInterface *QAccessibleDockWidget::child(int index) const
return 0;
}
int QAccessibleDockWidget::childAt(int x, int y) const
{
for (int i = childCount(); i >= 0; --i) {
if (rect(i).contains(x,y))
return i;
}
return -1;
}
int QAccessibleDockWidget::childCount() const
{
return dockWidget()->widget() ? 2 : 1;
@ -1292,7 +1163,7 @@ int QAccessibleDockWidget::childCount() const
int QAccessibleDockWidget::indexOfChild(const QAccessibleInterface *child) const
{
if (child) {
if (child->role(0) == TitleBar) {
if (child->role() == TitleBar) {
return 1;
} else {
return 2; //###
@ -1301,60 +1172,25 @@ int QAccessibleDockWidget::indexOfChild(const QAccessibleInterface *child) const
return -1;
}
QAccessible::Role QAccessibleDockWidget::role(int child) const
QAccessible::Role QAccessibleDockWidget::role() const
{
switch (child) {
case 0:
return Window;
case 1:
return TitleBar;
case 2:
//###
break;
default:
break;
}
return NoRole;
return Window;
}
QAccessible::State QAccessibleDockWidget::state(int child) const
{
//### mark tabified widgets as invisible
return QAccessibleWidget::state(child);
}
QRect QAccessibleDockWidget::rect(int child) const
QRect QAccessibleDockWidget::rect() const
{
QRect rect;
bool mapToGlobal = true;
if (child == 0) {
if (dockWidget()->isFloating()) {
rect = dockWidget()->frameGeometry();
mapToGlobal = false;
} else {
rect = dockWidget()->rect();
}
}else if (child == 1) {
QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout*>(dockWidget()->layout());
rect = layout->titleArea();
}else if (child == 2) {
if (dockWidget()->widget())
rect = dockWidget()->widget()->geometry();
}
if (rect.isNull())
return rect;
if (mapToGlobal)
if (dockWidget()->isFloating()) {
rect = dockWidget()->frameGeometry();
} else {
rect = dockWidget()->rect();
rect.moveTopLeft(dockWidget()->mapToGlobal(rect.topLeft()));
}
return rect;
}
QVariant QAccessibleDockWidget::invokeMethod(QAccessible::Method, int, const QVariantList &)
{
return QVariant();
}
QDockWidget *QAccessibleDockWidget::dockWidget() const
{
return static_cast<QDockWidget *>(object());
@ -1426,7 +1262,7 @@ int QAccessibleTitleBar::navigate(RelationFlag relation, int entry, QAccessibleI
return -1;
}
QAccessible::Relation QAccessibleTitleBar::relationTo(int /*child*/, const QAccessibleInterface * /*other*/, int /*otherChild*/) const
QAccessible::Relation QAccessibleTitleBar::relationTo(const QAccessibleInterface * /*otherChild*/) const
{
return Unrelated; //###
}
@ -1448,72 +1284,49 @@ int QAccessibleTitleBar::childCount() const
return count;
}
QString QAccessibleTitleBar::text(Text t, int child) const
QString QAccessibleTitleBar::text(Text t) const
{
if (!child) {
if (t == Name || t == Value) {
return qt_accStripAmp(dockWidget()->windowTitle());
}
if (t == Name || t == Value) {
return qt_accStripAmp(dockWidget()->windowTitle());
}
return QString();
}
QAccessible::State QAccessibleTitleBar::state(int child) const
QAccessible::State QAccessibleTitleBar::state() const
{
QAccessible::State state = Normal;
if (child) {
QDockWidgetLayout *layout = dockWidgetLayout();
QAbstractButton *b = static_cast<QAbstractButton *>(layout->widgetForRole((QDockWidgetLayout::Role)child));
if (b) {
if (b->isDown())
state |= Pressed;
}
} else {
QDockWidget *w = dockWidget();
if (w->testAttribute(Qt::WA_WState_Visible) == false)
state |= Invisible;
if (w->focusPolicy() != Qt::NoFocus && w->isActiveWindow())
state |= Focusable;
if (w->hasFocus())
state |= Focused;
if (!w->isEnabled())
state |= Unavailable;
}
QDockWidget *w = dockWidget();
if (w->testAttribute(Qt::WA_WState_Visible) == false)
state |= Invisible;
if (w->focusPolicy() != Qt::NoFocus && w->isActiveWindow())
state |= Focusable;
if (w->hasFocus())
state |= Focused;
if (!w->isEnabled())
state |= Unavailable;
return state;
}
QRect QAccessibleTitleBar::rect(int child) const
QRect QAccessibleTitleBar::rect() const
{
bool mapToGlobal = true;
QRect rect;
if (child == 0) {
if (dockWidget()->isFloating()) {
rect = dockWidget()->frameGeometry();
if (dockWidget()->widget()) {
QPoint globalPos = dockWidget()->mapToGlobal(dockWidget()->widget()->rect().topLeft());
globalPos.ry()--;
rect.setBottom(globalPos.y());
mapToGlobal = false;
}
} else {
QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout*>(dockWidget()->layout());
rect = layout->titleArea();
}
}else if (child >= 1 && child <= childCount()) {
QDockWidgetLayout *layout = dockWidgetLayout();
int index = 1;
for (int role = QDockWidgetLayout::CloseButton; role <= QDockWidgetLayout::FloatButton; ++role) {
QWidget *w = layout->widgetForRole((QDockWidgetLayout::Role)role);
if (!w || !w->isVisible())
continue;
if (index == child) {
rect = w->geometry();
break;
}
++index;
if (dockWidget()->isFloating()) {
rect = dockWidget()->frameGeometry();
if (dockWidget()->widget()) {
QPoint globalPos = dockWidget()->mapToGlobal(dockWidget()->widget()->rect().topLeft());
globalPos.ry()--;
rect.setBottom(globalPos.y());
mapToGlobal = false;
}
} else {
QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout*>(dockWidget()->layout());
rect = layout->titleArea();
}
if (rect.isNull())
return rect;
@ -1525,8 +1338,12 @@ QRect QAccessibleTitleBar::rect(int child) const
int QAccessibleTitleBar::childAt(int x, int y) const
{
for (int i = childCount(); i >= 0; --i) {
if (rect(i).contains(x,y))
QAccessibleInterface *childIface = child(i - 1);
if (childIface->rect().contains(x,y)) {
delete childIface;
return i;
}
delete childIface;
}
return -1;
}
@ -1546,73 +1363,57 @@ QDockWidget *QAccessibleTitleBar::dockWidget() const
return m_dockWidget;
}
QString QAccessibleTitleBar::actionText(int action, Text t, int child) const
//QString QAccessibleTitleBar::actionText(int action, Text t, int child) const
//{
// QString str;
// if (child >= 1 && child <= childCount()) {
// if (t == Name) {
// switch (action) {
// case Press:
// case DefaultAction:
// if (child == QDockWidgetLayout::CloseButton) {
// str = QDockWidget::tr("Close");
// } else if (child == QDockWidgetLayout::FloatButton) {
// str = dockWidget()->isFloating() ? QDockWidget::tr("Dock")
// : QDockWidget::tr("Float");
// }
// break;
// default:
// break;
// }
// }
// }
// return str;
//}
//bool QAccessibleTitleBar::doAction(int action, int child, const QVariantList& /*params*/)
//{
// if (!child || !dockWidget()->isEnabled())
// return false;
// switch (action) {
// case DefaultAction:
// case Press: {
// QDockWidgetLayout *layout = dockWidgetLayout();
// QAbstractButton *btn = static_cast<QAbstractButton *>(layout->widgetForRole((QDockWidgetLayout::Role)child));
// if (btn)
// btn->animateClick();
// return true;
// break;}
// default:
// break;
// }
// return false;
//}
QAccessible::Role QAccessibleTitleBar::role() const
{
QString str;
if (child >= 1 && child <= childCount()) {
if (t == Name) {
switch (action) {
case Press:
case DefaultAction:
if (child == QDockWidgetLayout::CloseButton) {
str = QDockWidget::tr("Close");
} else if (child == QDockWidgetLayout::FloatButton) {
str = dockWidget()->isFloating() ? QDockWidget::tr("Dock")
: QDockWidget::tr("Float");
}
break;
default:
break;
}
}
}
return str;
return TitleBar;
}
bool QAccessibleTitleBar::doAction(int action, int child, const QVariantList& /*params*/)
void QAccessibleTitleBar::setText(Text /*t*/, const QString &/*text*/)
{
if (!child || !dockWidget()->isEnabled())
return false;
switch (action) {
case DefaultAction:
case Press: {
QDockWidgetLayout *layout = dockWidgetLayout();
QAbstractButton *btn = static_cast<QAbstractButton *>(layout->widgetForRole((QDockWidgetLayout::Role)child));
if (btn)
btn->animateClick();
return true;
break;}
default:
break;
}
return false;
}
int QAccessibleTitleBar::userActionCount (int /*child*/) const
{
return 0;
}
QAccessible::Role QAccessibleTitleBar::role(int child) const
{
switch (child) {
case 0:
return TitleBar;
break;
default:
if (child >= 1 && child <= childCount())
return PushButton;
break;
}
return NoRole;
}
void QAccessibleTitleBar::setText(Text /*t*/, int /*child*/, const QString &/*text*/)
{
}
bool QAccessibleTitleBar::isValid() const

View File

@ -73,10 +73,10 @@ class QAccessibleTextEdit : public QAccessibleWidget, public QAccessibleTextInte
public:
explicit QAccessibleTextEdit(QWidget *o);
QString text(Text t, int child) const;
void setText(Text t, int control, const QString &text);
QString text(Text t) const;
void setText(Text t, const QString &text);
QVariant invokeMethod(QAccessible::Method method, int child, const QVariantList &params);
QVariant invokeMethod(QAccessible::Method method, const QVariantList &params);
// QAccessibleTextInterface
void addSelection(int startOffset, int endOffset);
@ -139,13 +139,11 @@ class QAccessibleToolBox : public QAccessibleWidget
public:
explicit QAccessibleToolBox(QWidget *widget);
QString text(Text textType, int child) const;
void setText(Text textType, int child, const QString &text);
State state(int child) const;
QVariant invokeMethod(QAccessible::Method method, int child, const QVariantList &params);
int childCount() const;
int indexOfChild(const QAccessibleInterface *child) const;
int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
// FIXME we currently expose the toolbox but it is not keyboard navigatable
// and the accessible hierarchy is not exactly beautiful.
// int childCount() const;
// QAccessibleInterface *child(int index) const;
// int indexOfChild(const QAccessibleInterface *child) const;
protected:
QToolBox *toolBox() const;
@ -157,8 +155,6 @@ class QAccessibleMdiArea : public QAccessibleWidget
public:
explicit QAccessibleMdiArea(QWidget *widget);
State state(int child) const;
QVariant invokeMethod(QAccessible::Method method, int child, const QVariantList &params);
int childCount() const;
int indexOfChild(const QAccessibleInterface *child) const;
int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
@ -172,14 +168,13 @@ class QAccessibleMdiSubWindow : public QAccessibleWidget
public:
explicit QAccessibleMdiSubWindow(QWidget *widget);
QString text(Text textType, int child) const;
void setText(Text textType, int child, const QString &text);
State state(int child) const;
QVariant invokeMethod(QAccessible::Method method, int child, const QVariantList &params);
QString text(Text textType) const;
void setText(Text textType, const QString &text);
State state() const;
int childCount() const;
int indexOfChild(const QAccessibleInterface *child) const;
int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
QRect rect(int child) const;
QRect rect() const;
int childAt(int x, int y) const;
protected:
@ -193,8 +188,6 @@ class QAccessibleWorkspace : public QAccessibleWidget
public:
explicit QAccessibleWorkspace(QWidget *widget);
State state(int child) const;
QVariant invokeMethod(QAccessible::Method method, int child, const QVariantList &params);
int childCount() const;
int indexOfChild(const QAccessibleInterface *child) const;
int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
@ -218,7 +211,7 @@ class QAccessibleTextBrowser : public QAccessibleTextEdit
public:
explicit QAccessibleTextBrowser(QWidget *widget);
Role role(int child) const;
Role role() const;
};
#endif // QT_NO_TEXTBROWSER
@ -253,12 +246,9 @@ public:
QAccessibleInterface *child(int index) const;
int indexOfChild(const QAccessibleInterface *child) const;
int childCount() const;
QRect rect (int child ) const;
Role role(int child) const;
State state(int child) const;
int childAt(int x, int y) const;
QRect rect () const;
Role role() const;
QVariant invokeMethod(QAccessible::Method method, int child, const QVariantList &params);
QDockWidget *dockWidget() const;
};
@ -266,25 +256,22 @@ class QAccessibleTitleBar : public QAccessibleInterface
{
public:
explicit QAccessibleTitleBar(QDockWidget *widget);
QString actionText(int action, Text t, int child) const;
bool doAction(int action, int child, const QVariantList& params = QVariantList());
int userActionCount ( int child) const;
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
int navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const;
int indexOfChild(const QAccessibleInterface *child) const;
int childCount() const;
Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const;
void setText(Text t, int child, const QString &text);
QString text(Text t, int child) const;
Role role(int child) const;
QRect rect (int child) const;
State state(int child) const;
Relation relationTo(const QAccessibleInterface *other) const;
void setText(Text t, const QString &text);
QString text(Text t) const;
Role role() const;
QRect rect () const;
State state() const;
int childAt(int x, int y) const;
QObject *object() const;
bool isValid() const;
QPointer<QDockWidget> m_dockWidget;
QDockWidget *dockWidget() const;

View File

@ -80,12 +80,11 @@ QAbstractSpinBox *QAccessibleAbstractSpinBox::abstractSpinBox() const
return qobject_cast<QAbstractSpinBox*>(object());
}
QString QAccessibleAbstractSpinBox::text(Text t, int child) const
QString QAccessibleAbstractSpinBox::text(Text t) const
{
Q_UNUSED(child)
if (t == QAccessible::Value)
return abstractSpinBox()->text();
return QAccessibleWidget::text(t, 0);
return QAccessibleWidget::text(t);
}
QVariant QAccessibleAbstractSpinBox::currentValue()
@ -116,21 +115,6 @@ QVariant QAccessibleAbstractSpinBox::minimumValue()
return abstractSpinBox()->property("minimum");
}
QVariant QAccessibleAbstractSpinBox::invokeMethod(Method method, int child, const QVariantList &params)
{
switch (method) {
case ListSupportedMethods: {
QSet<QAccessible::Method> set;
set << ListSupportedMethods;
return QVariant::fromValue(set | qvariant_cast<QSet<QAccessible::Method> >(
QAccessibleWidget::invokeMethod(method, child, params)));
}
default:
return QAccessibleWidget::invokeMethod(method, child, params);
}
}
/*!
\class QAccessibleSpinBox
\brief The QAccessibleSpinBox class implements the QAccessibleInterface for spinbox widgets.
@ -176,17 +160,11 @@ QDoubleSpinBox *QAccessibleDoubleSpinBox::doubleSpinBox() const
return static_cast<QDoubleSpinBox*>(object());
}
QVariant QAccessibleDoubleSpinBox::invokeMethod(QAccessible::Method, int, const QVariantList &)
QString QAccessibleDoubleSpinBox::text(Text textType) const
{
return QVariant();
}
QString QAccessibleDoubleSpinBox::text(Text textType, int child) const
{
Q_UNUSED(child)
if (textType == Value)
return doubleSpinBox()->textFromValue(doubleSpinBox()->value());
return QAccessibleWidget::text(textType, 0);
return QAccessibleWidget::text(textType);
}
#endif // QT_NO_SPINBOX
@ -217,11 +195,11 @@ QScrollBar *QAccessibleScrollBar::scrollBar() const
return qobject_cast<QScrollBar*>(object());
}
QString QAccessibleScrollBar::text(Text t, int child) const
QString QAccessibleScrollBar::text(Text t) const
{
if (t == Value)
return QString::number(scrollBar()->value());
return QAccessibleAbstractSlider::text(t, child);
return QAccessibleAbstractSlider::text(t);
}
#endif // QT_NO_SCROLLBAR
@ -252,12 +230,12 @@ QSlider *QAccessibleSlider::slider() const
return qobject_cast<QSlider*>(object());
}
QString QAccessibleSlider::text(Text t, int child) const
QString QAccessibleSlider::text(Text t) const
{
if (t == Value)
return QString::number(slider()->value());
return QAccessibleAbstractSlider::text(t, child);
return QAccessibleAbstractSlider::text(t);
}
QAccessibleAbstractSlider::QAccessibleAbstractSlider(QWidget *w, Role r)
@ -266,20 +244,6 @@ QAccessibleAbstractSlider::QAccessibleAbstractSlider(QWidget *w, Role r)
Q_ASSERT(qobject_cast<QAbstractSlider *>(w));
}
QVariant QAccessibleAbstractSlider::invokeMethod(Method method, int child, const QVariantList &params)
{
switch (method) {
case ListSupportedMethods: {
QSet<QAccessible::Method> set;
set << ListSupportedMethods;
return QVariant::fromValue(set | qvariant_cast<QSet<QAccessible::Method> >(
QAccessibleWidget::invokeMethod(method, child, params)));
}
default:
return QAccessibleWidget::invokeMethod(method, child, params);
}
}
QVariant QAccessibleAbstractSlider::currentValue()
{
return abstractSlider()->value();
@ -316,17 +280,12 @@ QAccessibleDial::QAccessibleDial(QWidget *widget)
addControllingSignal(QLatin1String("valueChanged(int)"));
}
QString QAccessibleDial::text(Text textType, int) const
QString QAccessibleDial::text(Text textType) const
{
if (textType == Value)
return QString::number(dial()->value());
return QAccessibleAbstractSlider::text(textType, 0);
}
QVariant QAccessibleDial::invokeMethod(Method, int, const QVariantList &)
{
return QVariant();
return QAccessibleAbstractSlider::text(textType);
}
QDial *QAccessibleDial::dial() const

View File

@ -64,11 +64,7 @@ class QAccessibleAbstractSpinBox: public QAccessibleWidget, public QAccessibleVa
public:
explicit QAccessibleAbstractSpinBox(QWidget *w);
QString text(Text t, int child) const;
bool doAction(int action, int child, const QVariantList &params);
QVariant invokeMethod(Method method, int child, const QVariantList &params);
QString text(Text t) const;
// QAccessibleValueInterface
QVariant currentValue();
@ -96,8 +92,7 @@ class QAccessibleDoubleSpinBox : public QAccessibleAbstractSpinBox
public:
explicit QAccessibleDoubleSpinBox(QWidget *widget);
QVariant invokeMethod(QAccessible::Method method, int child, const QVariantList &params);
QString text(Text t, int child) const;
QString text(Text t) const;
protected:
QDoubleSpinBox *doubleSpinBox() const;
@ -110,8 +105,6 @@ class QAccessibleAbstractSlider: public QAccessibleWidget, public QAccessibleVal
public:
explicit QAccessibleAbstractSlider(QWidget *w, Role r = Slider);
QVariant invokeMethod(Method method, int child, const QVariantList &params);
// QAccessibleValueInterface
QVariant currentValue();
void setCurrentValue(const QVariant &value);
@ -127,7 +120,7 @@ class QAccessibleScrollBar : public QAccessibleAbstractSlider
{
public:
explicit QAccessibleScrollBar(QWidget *w);
QString text(Text t, int child) const;
QString text(Text t) const;
protected:
QScrollBar *scrollBar() const;
@ -139,7 +132,7 @@ class QAccessibleSlider : public QAccessibleAbstractSlider
{
public:
explicit QAccessibleSlider(QWidget *w);
QString text(Text t, int child) const;
QString text(Text t) const;
protected:
QSlider *slider() const;
@ -152,8 +145,7 @@ class QAccessibleDial : public QAccessibleAbstractSlider
public:
explicit QAccessibleDial(QWidget *w);
QString text(Text textType, int child) const;
QVariant invokeMethod(Method method, int child, const QVariantList &params);
QString text(Text textType) const;
protected:
QDial *dial() const;

View File

@ -105,9 +105,8 @@ QAbstractButton *QAccessibleButton::button() const
}
/*! \reimp */
QString QAccessibleButton::text(Text t, int child) const
QString QAccessibleButton::text(Text t) const
{
Q_ASSERT(child == 0);
QString str;
switch (t) {
case Accelerator:
@ -130,13 +129,12 @@ QString QAccessibleButton::text(Text t, int child) const
break;
}
if (str.isEmpty())
str = QAccessibleWidget::text(t, child);
str = QAccessibleWidget::text(t);
return qt_accStripAmp(str);
}
QAccessible::State QAccessibleButton::state(int child) const
QAccessible::State QAccessibleButton::state() const
{
Q_ASSERT(child == 0);
State state = QAccessibleWidget::state();
QAbstractButton *b = button();
@ -261,7 +259,7 @@ bool QAccessibleToolButton::isSplitButton() const
#endif
}
QAccessible::State QAccessibleToolButton::state(int) const
QAccessible::State QAccessibleToolButton::state() const
{
QAccessible::State st = QAccessibleButton::state();
if (toolButton()->autoRaise())
@ -295,7 +293,7 @@ QAccessibleInterface *QAccessibleToolButton::child(int index) const
Returns the button's text label, depending on the text \a t, and
the \a child.
*/
QString QAccessibleToolButton::text(Text t, int) const
QString QAccessibleToolButton::text(Text t) const
{
QString str;
switch (t) {
@ -312,16 +310,6 @@ QString QAccessibleToolButton::text(Text t, int) const
return qt_accStripAmp(str);
}
/*!
\internal
Returns the number of actions. 1 to trigger the button, 2 to show the menu.
*/
int QAccessibleToolButton::actionCount(int) const
{
return 1;
}
/*
The three different tool button types can have the following actions:
| DelayedPopup | ShowMenuAction + (PressedAction || CheckedAction) |
@ -379,9 +367,8 @@ QAccessibleDisplay::QAccessibleDisplay(QWidget *w, Role role)
{
}
QAccessible::Role QAccessibleDisplay::role(int child) const
QAccessible::Role QAccessibleDisplay::role() const
{
Q_ASSERT(child == 0);
QLabel *l = qobject_cast<QLabel*>(object());
if (l) {
if (l->pixmap())
@ -399,12 +386,11 @@ QAccessible::Role QAccessibleDisplay::role(int child) const
return ProgressBar;
#endif
}
return QAccessibleWidget::role(child);
return QAccessibleWidget::role();
}
QString QAccessibleDisplay::text(Text t, int child) const
QString QAccessibleDisplay::text(Text t) const
{
Q_ASSERT(child == 0);
QString str;
switch (t) {
case Name:
@ -437,17 +423,13 @@ QString QAccessibleDisplay::text(Text t, int child) const
break;
}
if (str.isEmpty())
str = QAccessibleWidget::text(t, child);;
str = QAccessibleWidget::text(t);
return qt_accStripAmp(str);
}
QAccessible::Relation QAccessibleDisplay::relationTo(int child, const QAccessibleInterface *other,
int otherChild) const
QAccessible::Relation QAccessibleDisplay::relationTo(const QAccessibleInterface *other) const
{
Q_ASSERT(child == 0);
Relation relation = QAccessibleWidget::relationTo(child, other, otherChild);
if (child || otherChild)
return relation;
Relation relation = QAccessibleWidget::relationTo(other);
QObject *o = other->object();
QLabel *label = qobject_cast<QLabel*>(object());
@ -560,9 +542,8 @@ QLineEdit *QAccessibleLineEdit::lineEdit() const
return qobject_cast<QLineEdit*>(object());
}
QString QAccessibleLineEdit::text(Text t, int child) const
QString QAccessibleLineEdit::text(Text t) const
{
Q_ASSERT(child == 0);
QString str;
switch (t) {
case Value:
@ -573,14 +554,14 @@ QString QAccessibleLineEdit::text(Text t, int child) const
break;
}
if (str.isEmpty())
str = QAccessibleWidget::text(t, child);;
str = QAccessibleWidget::text(t);;
return qt_accStripAmp(str);
}
void QAccessibleLineEdit::setText(Text t, int control, const QString &text)
void QAccessibleLineEdit::setText(Text t, const QString &text)
{
if (t != Value || control) {
QAccessibleWidget::setText(t, control, text);
if (t != Value) {
QAccessibleWidget::setText(t, text);
return;
}
@ -593,10 +574,9 @@ void QAccessibleLineEdit::setText(Text t, int control, const QString &text)
lineEdit()->setText(newText);
}
QAccessible::State QAccessibleLineEdit::state(int child) const
QAccessible::State QAccessibleLineEdit::state() const
{
Q_ASSERT(child == 0);
State state = QAccessibleWidget::state(child);
State state = QAccessibleWidget::state();
QLineEdit *l = lineEdit();
if (l->isReadOnly())
@ -614,17 +594,15 @@ QAccessible::State QAccessibleLineEdit::state(int child) const
return state;
}
QVariant QAccessibleLineEdit::invokeMethod(QAccessible::Method method, int child,
QVariant QAccessibleLineEdit::invokeMethod(QAccessible::Method method,
const QVariantList &params)
{
Q_ASSERT(child == 0);
switch (method) {
case ListSupportedMethods: {
QSet<QAccessible::Method> set;
set << ListSupportedMethods << SetCursorPosition << GetCursorPosition;
return QVariant::fromValue(set | qvariant_cast<QSet<QAccessible::Method> >(
QAccessibleWidget::invokeMethod(method, child, params)));
QAccessibleWidget::invokeMethod(method, params)));
}
case SetCursorPosition:
setCursorPosition(params.value(0).toInt());
@ -632,7 +610,7 @@ QVariant QAccessibleLineEdit::invokeMethod(QAccessible::Method method, int child
case GetCursorPosition:
return cursorPosition();
default:
return QAccessibleWidget::invokeMethod(method, child, params);
return QAccessibleWidget::invokeMethod(method, params);
}
}

View File

@ -62,8 +62,8 @@ class QAccessibleButton : public QAccessibleWidget
public:
QAccessibleButton(QWidget *w, Role r);
QString text(Text t, int child = 0) const;
State state(int child = 0) const;
QString text(Text t) const;
State state() const;
QStringList actionNames() const;
void doAction(const QString &actionName);
@ -79,16 +79,12 @@ class QAccessibleToolButton : public QAccessibleButton
public:
QAccessibleToolButton(QWidget *w, Role role);
State state(int) const;
State state() const;
int childCount() const;
QAccessibleInterface *child(int index) const;
QString text(Text t, int child) const;
int actionCount(int child) const;
QString actionText(int action, Text text, int child) const;
bool doAction(int action, int child, const QVariantList &params);
QString text(Text t) const;
// QAccessibleActionInterface
QStringList actionNames() const;
@ -107,10 +103,10 @@ class QAccessibleDisplay : public QAccessibleWidget, public QAccessibleImageInte
public:
explicit QAccessibleDisplay(QWidget *w, Role role = StaticText);
QString text(Text t, int child) const;
Role role(int child) const;
QString text(Text t) const;
Role role() const;
Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const;
Relation relationTo(const QAccessibleInterface *other) const;
int navigate(RelationFlag, int entry, QAccessibleInterface **target) const;
// QAccessibleImageInterface
@ -127,10 +123,10 @@ class QAccessibleLineEdit : public QAccessibleWidget, public QAccessibleTextInte
public:
explicit QAccessibleLineEdit(QWidget *o, const QString &name = QString());
QString text(Text t, int child) const;
void setText(Text t, int control, const QString &text);
State state(int child) const;
QVariant invokeMethod(QAccessible::Method method, int child, const QVariantList &params);
QString text(Text t) const;
void setText(Text t, const QString &text);
State state() const;
QVariant invokeMethod(QAccessible::Method method, const QVariantList &params);
// QAccessibleTextInterface
void addSelection(int startOffset, int endOffset);

View File

@ -50,6 +50,7 @@
#include <QtCore/qmap.h>
#include <QtCore/qsettings.h>
#include <QtCore/qsharedpointer.h>
#include <QtCore/qpair.h>
#include <QtWidgets/qapplication.h>
#include <QtWidgets/qmessagebox.h>
@ -277,6 +278,8 @@ void showDebug(const char* funcName, const QAccessibleInterface *iface)
# define showDebug(f, iface)
#endif
typedef QSharedPointer<QAccessibleInterface> QAIPointer;
// This stuff is used for widgets/items with no window handle:
typedef QMap<int, QPair<QObject*,int> > NotifyMap;
Q_GLOBAL_STATIC(NotifyMap, qAccessibleRecentSentEvents)
@ -448,6 +451,11 @@ public:
private:
ULONG ref;
QAccessibleInterface *accessible;
QAIPointer childPointer(VARIANT varID)
{
return QAIPointer(accessible->child(varID.lVal - 1));
}
};
static inline BSTR QStringToBSTR(const QString &str)
@ -790,18 +798,20 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::accLocation(long *pxLeft, long *py
if (!accessible->isValid())
return E_FAIL;
QRect rect = accessible->rect(varID.lVal);
if (rect.isValid()) {
*pxLeft = rect.x();
*pyTop = rect.y();
*pcxWidth = rect.width();
*pcyHeight = rect.height();
QRect rect;
if (varID.lVal) {
QAIPointer child = QAIPointer(accessible->child(varID.lVal - 1));
if (child->isValid())
rect = child->rect();
} else {
*pxLeft = 0;
*pyTop = 0;
*pcxWidth = 0;
*pcyHeight = 0;
rect = accessible->rect();
}
*pxLeft = rect.x();
*pyTop = rect.y();
*pcxWidth = rect.width();
*pcyHeight = rect.height();
return S_OK;
}
@ -998,7 +1008,16 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accDescription(VARIANT varID,
if (!accessible->isValid())
return E_FAIL;
QString descr = accessible->text(Description, varID.lVal);
QString descr;
if (varID.lVal) {
QAIPointer child = childPointer(varID);
if (!child)
return E_FAIL;
descr = child->text(Description);
} else {
descr = accessible->text(Description);
}
if (descr.size()) {
*pszDescription = QStringToBSTR(descr);
return S_OK;
@ -1014,7 +1033,15 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accHelp(VARIANT varID, BSTR *p
if (!accessible->isValid())
return E_FAIL;
QString help = accessible->text(Help, varID.lVal);
QString help;
if (varID.lVal) {
QAIPointer child = childPointer(varID);
if (!child)
return E_FAIL;
help = child->text(Help);
} else {
help = accessible->text(Help);
}
if (help.size()) {
*pszHelp = QStringToBSTR(help);
return S_OK;
@ -1038,7 +1065,7 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accKeyboardShortcut(VARIANT va
*pszKeyboardShortcut = 0;
if (QAccessibleActionInterface *actionIface = accessible->actionInterface()) {
const QString def = actionIface->actionNames().value(0);
const QString def = actionIface->actionNames().value(0); // I CRASH YOU
if (!def.isEmpty()) {
const QString keyBoardShortCut = actionIface->keyBindingsForAction(def).value(0);
if (!keyBoardShortCut.isEmpty())
@ -1055,9 +1082,17 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accName(VARIANT varID, BSTR* p
if (!accessible->isValid())
return E_FAIL;
QString n = accessible->text(Name, varID.lVal);
if (n.size()) {
*pszName = QStringToBSTR(n);
QString name;
if (varID.lVal) {
QAIPointer child = childPointer(varID);
if (!child)
return E_FAIL;
name = child->text(Name);
} else {
name = accessible->text(Name);
}
if (name.size()) {
*pszName = QStringToBSTR(name);
return S_OK;
}
@ -1078,7 +1113,16 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accRole(VARIANT varID, VARIANT
if (!accessible->isValid())
return E_FAIL;
Role role = accessible->role(varID.lVal);
Role role;
if (varID.lVal) {
QAIPointer child = childPointer(varID);
if (!child)
return E_FAIL;
role = child->role();
} else {
role = accessible->role();
}
if (role != NoRole) {
if (role == LayeredPane)
role = QAccessible::Pane;
@ -1097,8 +1141,18 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accState(VARIANT varID, VARIAN
if (!accessible->isValid())
return E_FAIL;
State state;
if (varID.lVal) {
QAIPointer child = childPointer(varID);
if (!child.data())
return E_FAIL;
state = child->state();
} else {
state = accessible->state();
}
(*pvarState).vt = VT_I4;
(*pvarState).lVal = accessible->state(varID.lVal);
(*pvarState).lVal = state;
return S_OK;
}
@ -1106,10 +1160,15 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accState(VARIANT varID, VARIAN
HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accValue(VARIANT varID, BSTR* pszValue)
{
showDebug(__FUNCTION__, accessible);
if (!accessible->isValid())
if (!accessible->isValid() || varID.lVal)
return E_FAIL;
QString value = accessible->text(Value, varID.lVal);
QString value;
if (accessible->valueInterface()) {
value = QString::number(accessible->valueInterface()->currentValue().toDouble());
} else {
value = accessible->text(Value);
}
if (!value.isNull()) {
*pszValue = QStringToBSTR(value);
return S_OK;
@ -1197,19 +1256,15 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accSelection(VARIANT *pvarChil
int cc = accessible->childCount();
QVector<int> sel(cc);
int selIndex = 0;
for (int i = 1; i <= cc; ++i) {
QAccessibleInterface *child = 0;
int i2 = accessible->navigate(Child, i, &child);
for (int i = 0; i < cc; ++i) {
bool isSelected = false;
QAccessibleInterface *child = accessible->child(i);
if (child) {
isSelected = child->state(0) & Selected;
isSelected = child->state() & Selected;
delete child;
child = 0;
} else {
isSelected = accessible->state(i2) & Selected;
}
if (isSelected)
sel[selIndex++] = i;
sel[selIndex++] = i+1;
}
sel.resize(selIndex);
if (sel.isEmpty()) {

View File

@ -244,13 +244,8 @@ int QAccessibleWidget::childAt(int x, int y) const
}
/*! \reimp */
QRect QAccessibleWidget::rect(int child) const
QRect QAccessibleWidget::rect() const
{
if (child) {
qWarning("QAccessibleWidget::rect: This implementation does not support subelements! "
"(ID %d unknown for %s)", child, widget()->metaObject()->className());
}
QWidget *w = widget();
if (!w->isVisible())
return QRect();
@ -353,8 +348,7 @@ static inline bool isAncestor(const QObject *obj, const QObject *child)
/*! \reimp */
QAccessible::Relation QAccessibleWidget::relationTo(int child,
const QAccessibleInterface *other, int otherChild) const
QAccessible::Relation QAccessibleWidget::relationTo(const QAccessibleInterface *other) const
{
Relation relation = Unrelated;
if (d->asking == this) // recursive call
@ -378,7 +372,7 @@ QAccessible::Relation QAccessibleWidget::relationTo(int child,
// test for passive relationships.
// d->asking protects from endless recursion.
d->asking = this;
int inverse = other->relationTo(otherChild, this, child);
int inverse = other->relationTo(this);
d->asking = 0;
if (inverse & Controller)
@ -387,12 +381,7 @@ QAccessible::Relation QAccessibleWidget::relationTo(int child,
relation |= Labelled;
if(o == object()) {
if (child && !otherChild)
return relation | Child;
if (!child && otherChild)
return relation | Ancestor;
if (!child && !otherChild)
return relation | Self;
return relation | Self;
}
QObject *parent = object()->parent();
@ -403,12 +392,12 @@ QAccessible::Relation QAccessibleWidget::relationTo(int child,
relation |= Sibling;
QAccessibleInterface *sibIface = QAccessible::queryAccessibleInterface(o);
Q_ASSERT(sibIface);
QRect wg = rect(0);
QRect sg = sibIface->rect(0);
QRect wg = rect();
QRect sg = sibIface->rect();
if (wg.intersects(sg)) {
QAccessibleInterface *pIface = 0;
pIface = sibIface->parent();
if (pIface && !((sibIface->state(0) | state(0)) & Invisible)) {
if (pIface && !((sibIface->state() | state()) & Invisible)) {
int wi = pIface->indexOfChild(this);
int si = pIface->indexOfChild(sibIface);
@ -508,7 +497,7 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry,
if (!pIface)
return -1;
QRect startg = rect(0);
QRect startg = rect();
QPoint startc = startg.center();
QAccessibleInterface *candidate = 0;
int mindist = 100000;
@ -517,13 +506,13 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry,
QAccessibleInterface *sibling = 0;
sibling = pIface->child(i);
Q_ASSERT(sibling);
if ((relationTo(0, sibling, 0) & Self) || (sibling->state(0) & QAccessible::Invisible)) {
if ((relationTo(sibling) & Self) || (sibling->state() & QAccessible::Invisible)) {
//ignore ourself and invisible siblings
delete sibling;
continue;
}
QRect sibg = sibling->rect(0);
QRect sibg = sibling->rect();
QPoint sibc = sibg.center();
QPoint sibp;
QPoint startp;
@ -590,7 +579,7 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry,
if (!pIface)
return -1;
QRect r = rect(0);
QRect r = rect();
int sibCount = pIface->childCount();
QAccessibleInterface *sibling = 0;
for (int i = pIface->indexOfChild(this) + 1; i <= sibCount && entry; ++i) {
@ -600,7 +589,7 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry,
sibling = 0;
continue;
}
if (sibling->rect(0).intersects(r))
if (sibling->rect().intersects(r))
--entry;
if (!entry)
break;
@ -619,18 +608,18 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry,
if (!pIface)
return -1;
QRect r = rect(0);
QRect r = rect();
int index = pIface->indexOfChild(this);
QAccessibleInterface *sibling = 0;
for (int i = 1; i < index && entry; ++i) {
sibling = pIface->child(i - 1);
Q_ASSERT(sibling);
if (!sibling || (sibling->state(0) & Invisible)) {
if (!sibling || (sibling->state() & Invisible)) {
delete sibling;
sibling = 0;
continue;
}
if (sibling->rect(0).intersects(r))
if (sibling->rect().intersects(r))
--entry;
if (!entry)
break;
@ -682,7 +671,7 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry,
for (int i = 0; i < sibCount && entry; ++i) {
candidate = pIface->child(i);
Q_ASSERT(candidate);
if (candidate->relationTo(0, this, 0) & Label)
if (candidate->relationTo(this) & Label)
--entry;
if (!entry)
break;
@ -691,7 +680,7 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry,
candidate = 0;
}
if (!candidate) {
if (pIface->relationTo(0, this, 0) & Label)
if (pIface->relationTo(this) & Label)
--entry;
if (!entry)
candidate = pIface;
@ -718,7 +707,7 @@ int QAccessibleWidget::navigate(RelationFlag relation, int entry,
QAccessibleInterface *candidate = QAccessible::queryAccessibleInterface(sender);
if (!candidate)
continue;
if (candidate->relationTo(0, this, 0)&Controller)
if (candidate->relationTo(this) & Controller)
senders << sender;
delete candidate;
}
@ -767,7 +756,7 @@ int QAccessibleWidget::indexOfChild(const QAccessibleInterface *child) const
extern QString qt_setWindowTitle_helperHelper(const QString &, const QWidget*);
/*! \reimp */
QString QAccessibleWidget::text(Text t, int child) const
QString QAccessibleWidget::text(Text t) const
{
QString str;
@ -777,7 +766,7 @@ QString QAccessibleWidget::text(Text t, int child) const
str = d->name;
} else if (!widget()->accessibleName().isEmpty()) {
str = widget()->accessibleName();
} else if (!child && widget()->isWindow()) {
} else if (widget()->isWindow()) {
if (widget()->isMinimized())
str = qt_setWindowTitle_helperHelper(widget()->windowIconText(), widget());
else
@ -847,31 +836,14 @@ QStringList QAccessibleWidget::keyBindingsForAction(const QString & /* actionNam
}
/*! \reimp */
QAccessible::Role QAccessibleWidget::role(int child) const
QAccessible::Role QAccessibleWidget::role() const
{
if (!child)
return d->role;
QWidgetList childList = childWidgets(widget());
if (childList.count() > 0 && child <= childList.count()) {
QWidget *targetWidget = childList.at(child - 1);
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(targetWidget);
if (iface) {
QAccessible::Role role = iface->role(0);
delete iface;
return role;
}
}
return NoRole;
return d->role;
}
/*! \reimp */
QAccessible::State QAccessibleWidget::state(int child) const
QAccessible::State QAccessibleWidget::state() const
{
if (child)
return Normal;
QAccessible::State state = Normal;
QWidget *w = widget();
@ -903,22 +875,6 @@ QColor QAccessibleWidget::backgroundColor() const
return widget()->palette().color(widget()->backgroundRole());
}
QVariant QAccessibleWidget::invokeMethod(Method method, int child, const QVariantList & /*params*/)
{
if (child)
return QVariant();
switch (method) {
case ListSupportedMethods: {
QSet<QAccessible::Method> set;
set << ListSupportedMethods << ForegroundColor << BackgroundColor;
return QVariant::fromValue(set);
}
default:
return QVariant();
}
}
QT_END_NAMESPACE
#endif //QT_NO_ACCESSIBILITY

View File

@ -63,29 +63,27 @@ public:
QWindow *window() const;
int childCount() const;
int indexOfChild(const QAccessibleInterface *child) const;
Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const;
Relation relationTo(const QAccessibleInterface *other) const;
int childAt(int x, int y) const;
QRect rect(int child = 0) const;
QRect rect() const;
QAccessibleInterface *parent() const;
QAccessibleInterface *child(int index) const;
int navigate(RelationFlag rel, int entry, QAccessibleInterface **target) const;
QString text(Text t, int child = 0) const;
Role role(int child = 0) const;
State state(int child = 0) const;
QString text(Text t) const;
Role role() const;
State state() const;
QColor foregroundColor() const;
QColor backgroundColor() const;
QVariant invokeMethod(Method method, int child, const QVariantList &params);
// QAccessibleActionInterface
QStringList actionNames() const;
void doAction(const QString &actionName);
QStringList keyBindingsForAction(const QString &actionName) const;
protected:
~QAccessibleWidget();
QWidget *widget() const;

View File

@ -3169,11 +3169,7 @@ void QListView::currentChanged(const QModelIndex &current, const QModelIndex &pr
if (QAccessible::isActive()) {
if (current.isValid()) {
int entry = visualIndex(current) + 1;
#ifdef Q_OS_UNIX
QAccessible::updateAccessibility(this, entry, QAccessible::Focus);
#else
QAccessible::updateAccessibility(viewport(), entry, QAccessible::Focus);
#endif
}
}
#endif
@ -3192,20 +3188,12 @@ void QListView::selectionChanged(const QItemSelection &selected,
QModelIndex sel = selected.indexes().value(0);
if (sel.isValid()) {
int entry = visualIndex(sel) + 1;
#ifdef Q_OS_UNIX
QAccessible::updateAccessibility(this, entry, QAccessible::Selection);
#else
QAccessible::updateAccessibility(viewport(), entry, QAccessible::Selection);
#endif
}
QModelIndex desel = deselected.indexes().value(0);
if (desel.isValid()) {
int entry = visualIndex(desel) + 1;
#ifdef Q_OS_UNIX
QAccessible::updateAccessibility(this, entry, QAccessible::SelectionRemove);
#else
QAccessible::updateAccessibility(viewport(), entry, QAccessible::SelectionRemove);
#endif
}
}
#endif

View File

@ -3749,29 +3749,15 @@ void QTreeView::selectionChanged(const QItemSelection &selected,
// ### does not work properly for selection ranges.
QModelIndex sel = selected.indexes().value(0);
if (sel.isValid()) {
#ifdef Q_OS_UNIX
int entry = (visualIndex(sel) + (header()?1:0))*sel.model()->columnCount()+sel.column() + 1;
Q_ASSERT(entry > 0);
QAccessible::updateAccessibility(this, entry, QAccessible::Selection);
#else
int entry = visualIndex(sel) + 1;
if (header())
++entry;
QAccessible::updateAccessibility(viewport(), entry, QAccessible::Selection);
#endif
}
QModelIndex desel = deselected.indexes().value(0);
if (desel.isValid()) {
#ifdef Q_OS_UNIX
int entry = (visualIndex(desel) + (header()?1:0))*desel.model()->columnCount()+desel.column() + 1;
Q_ASSERT(entry > 0);
QAccessible::updateAccessibility(this, entry, QAccessible::SelectionRemove);
#else
int entry = visualIndex(desel) + 1;
if (header())
++entry;
QAccessible::updateAccessibility(viewport(), entry, QAccessible::SelectionRemove);
#endif
}
}
#endif

View File

@ -218,7 +218,7 @@ protected:
void currentChanged(const QModelIndex &current, const QModelIndex &previous);
private:
friend class QAccessibleItemView;
//friend class QAccessibleItemView;
friend class QAccessibleTable2;
friend class QAccessibleTree;
friend class QAccessibleTable2Cell;

View File

@ -8192,8 +8192,6 @@ bool QWidget::event(QEvent *event)
case QEvent::AccessibilityDescription:
case QEvent::AccessibilityHelp: {
QAccessibleEvent *ev = static_cast<QAccessibleEvent *>(event);
if (ev->child())
return false;
switch (ev->type()) {
#ifndef QT_NO_TOOLTIP
case QEvent::AccessibilityDescription:

View File

@ -58,13 +58,12 @@
class PrintTest : public TestBase
{
public:
bool operator()(InterfaceChildPair candidate)
bool operator()(QAccessibleInterface *candidate)
{
qDebug() << "";
qDebug() << "Name" << candidate.iface->text(QAccessible::Name, candidate.possibleChild);
qDebug() << "Pos" << candidate.iface->rect(candidate.possibleChild);
if (candidate.possibleChild == 0)
qDebug() << "Number of children" << candidate.iface->childCount();
qDebug() << "Name" << candidate->text(QAccessible::Name);
qDebug() << "Pos" << candidate->rect();
qDebug() << "Number of children" << candidate->childCount();
return false;
}
};
@ -76,9 +75,9 @@ public:
QString text;
QAccessible::Text textType;
bool operator()(InterfaceChildPair candidate)
bool operator()(QAccessibleInterface *candidate)
{
return (candidate.iface->text(textType, candidate.possibleChild) == text);
return (candidate->text(textType) == text);
}
};
@ -86,66 +85,63 @@ void WidgetNavigator::printAll(QWidget *widget)
{
QAccessibleInterface * const iface = QAccessible::queryAccessibleInterface(widget);
deleteInDestructor(iface);
printAll(InterfaceChildPair(iface, 0));
printAll(iface);
}
void WidgetNavigator::printAll(InterfaceChildPair interface)
void WidgetNavigator::printAll(QAccessibleInterface *interface)
{
PrintTest printTest;
recursiveSearch(&printTest, interface.iface, interface.possibleChild);
recursiveSearch(&printTest, interface);
}
InterfaceChildPair WidgetNavigator::find(QAccessible::Text textType, const QString &text, QWidget *start)
QAccessibleInterface *WidgetNavigator::find(QAccessible::Text textType, const QString &text, QWidget *start)
{
QAccessibleInterface * const iface = QAccessible::queryAccessibleInterface(start);
QAccessibleInterface *const iface = QAccessible::queryAccessibleInterface(start);
deleteInDestructor(iface);
return find(textType, text, iface);
}
InterfaceChildPair WidgetNavigator::find(QAccessible::Text textType, const QString &text, QAccessibleInterface *start)
QAccessibleInterface *WidgetNavigator::find(QAccessible::Text textType, const QString &text, QAccessibleInterface *start)
{
NameTest nameTest(text, textType);
return recursiveSearch(&nameTest, start, 0);
return recursiveSearch(&nameTest, start);
}
/*
Recursiveley navigates the accessible hiearchy looking for an interface that
passsed the Test (meaning it returns true).
*/
InterfaceChildPair WidgetNavigator::recursiveSearch(TestBase *test, QAccessibleInterface *iface, int possibleChild)
QAccessibleInterface *WidgetNavigator::recursiveSearch(TestBase *test, QAccessibleInterface *iface)
{
QStack<InterfaceChildPair> todoInterfaces;
todoInterfaces.push(InterfaceChildPair(iface, possibleChild));
QStack<QAccessibleInterface *> todoInterfaces;
todoInterfaces.push(iface);
while (todoInterfaces.isEmpty() == false) {
InterfaceChildPair testInterface = todoInterfaces.pop();
QAccessibleInterface *testInterface = todoInterfaces.pop();
if ((*test)(testInterface))
return testInterface;
if (testInterface.possibleChild != 0)
continue;
const int numChildren = testInterface.iface->childCount();
const int numChildren = testInterface->childCount();
for (int i = 0; i < numChildren; ++i) {
QAccessibleInterface *childInterface = testInterface.iface->child(i);
QAccessibleInterface *childInterface = testInterface->child(i);
if (childInterface) {
todoInterfaces.push(InterfaceChildPair(childInterface, 0));
todoInterfaces.push(childInterface);
deleteInDestructor(childInterface);
}
}
}
return InterfaceChildPair();
return 0;
}
void WidgetNavigator::deleteInDestructor(QAccessibleInterface * interface)
void WidgetNavigator::deleteInDestructor(QAccessibleInterface *interface)
{
interfaces.insert(interface);
}
QWidget *WidgetNavigator::getWidget(InterfaceChildPair interface)
QWidget *WidgetNavigator::getWidget(QAccessibleInterface *interface)
{
return qobject_cast<QWidget *>(interface.iface->object());
return qobject_cast<QWidget *>(interface->object());
}
WidgetNavigator::~WidgetNavigator()
@ -275,7 +271,7 @@ void DelayedAction::run()
Schedules a mouse click at an interface using a singleShot timer.
Only one click can be scheduled at a time.
*/
ClickLaterAction::ClickLaterAction(InterfaceChildPair interface, Qt::MouseButtons buttons)
ClickLaterAction::ClickLaterAction(QAccessibleInterface *interface, Qt::MouseButtons buttons)
{
this->useInterface = true;
this->interface = interface;
@ -296,7 +292,7 @@ ClickLaterAction::ClickLaterAction(QWidget *widget, Qt::MouseButtons buttons)
void ClickLaterAction::run()
{
if (useInterface) {
const QPoint globalCenter = interface.iface->rect(interface.possibleChild).center();
const QPoint globalCenter = interface->rect().center();
NativeEvents::mouseClick(globalCenter, buttons);
} else { // use widget
const QSize halfSize = widget->size() / 2;
@ -306,7 +302,7 @@ void ClickLaterAction::run()
DelayedAction::run();
}
void GuiTester::clickLater(InterfaceChildPair interface, Qt::MouseButtons buttons, int delay)
void GuiTester::clickLater(QAccessibleInterface *interface, Qt::MouseButtons buttons, int delay)
{
clearSequence();
addToSequence(new ClickLaterAction(interface, buttons), delay);

View File

@ -54,23 +54,9 @@ QT_USE_NAMESPACE
- Simulating platform mouse and keybord events.
*/
/*
InterfaceChildPair specifies an accessibilty interface item.
*/
class InterfaceChildPair {
public:
InterfaceChildPair() : iface(0), possibleChild(0) {}
InterfaceChildPair(QAccessibleInterface *iface, int possibleChild)
:iface(iface), possibleChild(possibleChild)
{ }
QAccessibleInterface *iface;
int possibleChild;
};
class TestBase {
public:
virtual bool operator()(InterfaceChildPair candidate) = 0;
virtual bool operator()(QAccessibleInterface *candidate) = 0;
virtual ~TestBase() {}
};
@ -83,15 +69,15 @@ public:
~WidgetNavigator();
void printAll(QWidget *widget);
void printAll(InterfaceChildPair interface);
void printAll(QAccessibleInterface *interface);
InterfaceChildPair find(QAccessible::Text textType, const QString &text, QWidget *start);
InterfaceChildPair find(QAccessible::Text textType, const QString &text, QAccessibleInterface *start);
QAccessibleInterface *find(QAccessible::Text textType, const QString &text, QWidget *start);
QAccessibleInterface *find(QAccessible::Text textType, const QString &text, QAccessibleInterface *start);
InterfaceChildPair recursiveSearch(TestBase *test, QAccessibleInterface *iface, int possibleChild);
QAccessibleInterface *recursiveSearch(TestBase *test, QAccessibleInterface *iface);
void deleteInDestructor(QAccessibleInterface * interface);
static QWidget *getWidget(InterfaceChildPair interface);
static QWidget *getWidget(QAccessibleInterface *interface);
private:
QSet<QAccessibleInterface *> interfaces;
};
@ -141,13 +127,13 @@ class ClickLaterAction : public DelayedAction
{
Q_OBJECT
public:
ClickLaterAction(InterfaceChildPair interface, Qt::MouseButtons buttons = Qt::LeftButton);
ClickLaterAction(QAccessibleInterface *interface, Qt::MouseButtons buttons = Qt::LeftButton);
ClickLaterAction(QWidget *widget, Qt::MouseButtons buttons = Qt::LeftButton);
protected slots:
void run();
private:
bool useInterface;
InterfaceChildPair interface;
QAccessibleInterface *interface;
QWidget *widget;
Qt::MouseButtons buttons;
};
@ -168,7 +154,7 @@ public:
protected slots:
void exitLoopSlot();
protected:
void clickLater(InterfaceChildPair interface, Qt::MouseButtons buttons = Qt::LeftButton, int delay = 300);
void clickLater(QAccessibleInterface *interface, Qt::MouseButtons buttons = Qt::LeftButton, int delay = 300);
void clickLater(QWidget *widget, Qt::MouseButtons buttons = Qt::LeftButton, int delay = 300);
void clearSequence();

View File

@ -116,8 +116,8 @@ void tst_MacGui::dummy()
box->show();
// Find the "OK" button and schedule a press.
InterfaceChildPair interface = wn.find(QAccessible::Name, "OK", box);
QVERIFY(interface.iface);
QAccessibleInterface *interface = wn.find(QAccessible::Name, "OK", box);
QVERIFY(interface);
const int delay = 1000;
clickLater(interface, Qt::LeftButton, delay);
@ -142,8 +142,8 @@ void tst_MacGui::splashScreenModality()
box.show();
// Find the "OK" button and schedule a press.
InterfaceChildPair interface = wn.find(QAccessible::Name, "OK", &box);
QVERIFY(interface.iface);
QAccessibleInterface *interface = wn.find(QAccessible::Name, "OK", &box);
QVERIFY(interface);
const int delay = 1000;
clickLater(interface, Qt::LeftButton, delay);
@ -220,8 +220,8 @@ void tst_MacGui::spinBoxArrowButtons()
const QImage noFocus = grabWindowContents(&colorWidget).toImage();
// Set focus by clicking the less button.
InterfaceChildPair lessInterface = wn.find(QAccessible::Name, "Less", &spinBox);
QVERIFY(lessInterface.iface);
QAccessibleInterface *lessInterface = wn.find(QAccessible::Name, "Less", &spinBox);
QVERIFY(lessInterface);
const int delay = 500;
clickLater(lessInterface, Qt::LeftButton, delay);
const int timeout = 1;
@ -231,7 +231,7 @@ void tst_MacGui::spinBoxArrowButtons()
const QImage focus = grabWindowContents(&colorWidget).toImage();
// Compare the arrow area of the less button to see if it moved.
const QRect lessRect = lessInterface.iface->rect(lessInterface.possibleChild);
const QRect lessRect = lessInterface->rect();
const QRect lessLocalRect(colorWidget.mapFromGlobal(lessRect.topLeft()), colorWidget.mapFromGlobal(lessRect.bottomRight()));
const QRect compareRect = lessLocalRect.adjusted(5, 3, -5, -7);
QVERIFY(noFocus.copy(compareRect) == focus.copy(compareRect));

View File

@ -196,6 +196,13 @@ static int verifyHierarchy(QAccessibleInterface *iface)
return errorAt;
}
QRect childRect(QAccessibleInterface *iface, int index = 0)
{
QAccessibleInterface *child = iface->child(index);
QRect rect = child->rect();
delete child;
return rect;
}
//TESTED_FILES=
@ -246,10 +253,6 @@ private slots:
void abstractScrollAreaTest();
void scrollAreaTest();
void listViewTest();
void treeWidgetTest();
void tableWidgetTest();
void tableViewTest();
void table2ListTest();
void table2TreeTest();
@ -344,11 +347,11 @@ class QtTestAccessibleWidgetIface: public QAccessibleWidget
{
public:
QtTestAccessibleWidgetIface(QtTestAccessibleWidget *w): QAccessibleWidget(w) {}
QString text(Text t, int control = 0) const
QString text(Text t) const
{
if (t == Help)
return QString::fromLatin1("Help yourself");
return QAccessibleWidget::text(t, control);
return QAccessibleWidget::text(t);
}
static QAccessibleInterface *ifaceFactory(const QString &key, QObject *o)
{
@ -434,7 +437,7 @@ void tst_QAccessibility::customWidget()
QVERIFY(iface->isValid());
QCOMPARE(iface->object(), (QObject*)widget);
QCOMPARE(iface->object()->objectName(), QString("Heinz"));
QCOMPARE(iface->text(QAccessible::Help, 0), QString("Help yourself"));
QCOMPARE(iface->text(QAccessible::Help), QString("Help yourself"));
delete iface;
delete widget;
@ -623,8 +626,8 @@ void tst_QAccessibility::navigateCovered()
for (int y = 0; y < w->height(); ++y) {
w1->move(x, y);
if (w1->geometry().intersects(w2->geometry())) {
QVERIFY(iface1->relationTo(0, iface2, 0) & QAccessible::Covers);
QVERIFY(iface2->relationTo(0, iface1, 0) & QAccessible::Covered);
QVERIFY(iface1->relationTo(iface2) & QAccessible::Covers);
QVERIFY(iface2->relationTo(iface1) & QAccessible::Covered);
QCOMPARE(iface1->navigate(QAccessible::Covered, 1, &iface3), 0);
QVERIFY(iface3 != 0);
QVERIFY(iface3->isValid());
@ -636,8 +639,8 @@ void tst_QAccessibility::navigateCovered()
QCOMPARE(iface3->object(), iface1->object());
delete iface3; iface3 = 0;
} else {
QVERIFY(!(iface1->relationTo(0, iface2, 0) & QAccessible::Covers));
QVERIFY(!(iface2->relationTo(0, iface1, 0) & QAccessible::Covered));
QVERIFY(!(iface1->relationTo(iface2) & QAccessible::Covers));
QVERIFY(!(iface2->relationTo(iface1) & QAccessible::Covered));
QCOMPARE(iface1->navigate(QAccessible::Covered, 1, &iface3), -1);
QVERIFY(iface3 == 0);
QCOMPARE(iface1->navigate(QAccessible::Covers, 1, &iface3), -1);
@ -669,13 +672,13 @@ void tst_QAccessibility::navigateCovered()
w1->move(0,0);
w2->move(0,0);
w1->raise();
QVERIFY(iface1->relationTo(0, iface2, 0) & QAccessible::Covers);
QVERIFY(iface2->relationTo(0, iface1, 0) & QAccessible::Covered);
QVERIFY(iface1->relationTo(iface2) & QAccessible::Covers);
QVERIFY(iface2->relationTo(iface1) & QAccessible::Covered);
QVERIFY(!(iface1->state() & QAccessible::Invisible));
w1->hide();
QVERIFY(iface1->state() & QAccessible::Invisible);
QVERIFY(!(iface1->relationTo(0, iface2, 0) & QAccessible::Covers));
QVERIFY(!(iface2->relationTo(0, iface1, 0) & QAccessible::Covered));
QVERIFY(!(iface1->relationTo(iface2) & QAccessible::Covers));
QVERIFY(!(iface2->relationTo(iface1) & QAccessible::Covered));
QCOMPARE(iface2->navigate(QAccessible::Covered, 1, &iface3), -1);
QVERIFY(iface3 == 0);
QCOMPARE(iface1->navigate(QAccessible::Covers, 1, &iface3), -1);
@ -967,6 +970,7 @@ void tst_QAccessibility::actionTest()
{
QPushButton *button = new QPushButton;
button->show();
button->clearFocus();
QCOMPARE(button->hasFocus(), false);
QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(button);
QAccessibleActionInterface *actions = interface->actionInterface();
@ -996,7 +1000,7 @@ void tst_QAccessibility::applicationTest()
QLatin1String name = QLatin1String("My Name");
qApp->setApplicationName(name);
QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(qApp);
QCOMPARE(interface->text(QAccessible::Name, 0), name);
QCOMPARE(interface->text(QAccessible::Name), name);
QCOMPARE(interface->role(), QAccessible::Application);
delete interface;
}
@ -1013,7 +1017,7 @@ void tst_QAccessibility::mainWindowTest()
QVERIFY_EVENT(mw, 0, QAccessible::ObjectShow);
QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(mw);
QCOMPARE(interface->text(QAccessible::Name, 0), name);
QCOMPARE(interface->text(QAccessible::Name), name);
QCOMPARE(interface->role(), QAccessible::Window);
delete interface;
delete mw;
@ -1463,19 +1467,19 @@ void tst_QAccessibility::menuTest()
QVERIFY(interface->rect().contains(iAction->rect()));
#endif
QCOMPARE(iFile->text(QAccessible::Name, 0), QString("File"));
QCOMPARE(iEdit->text(QAccessible::Name, 0), QString("Edit"));
QCOMPARE(iSeparator->text(QAccessible::Name, 0), QString());
QCOMPARE(iHelp->text(QAccessible::Name, 0), QString("Help"));
QCOMPARE(iAction->text(QAccessible::Name, 0), QString("Action!"));
QCOMPARE(iFile->text(QAccessible::Name), QString("File"));
QCOMPARE(iEdit->text(QAccessible::Name), QString("Edit"));
QCOMPARE(iSeparator->text(QAccessible::Name), QString());
QCOMPARE(iHelp->text(QAccessible::Name), QString("Help"));
QCOMPARE(iAction->text(QAccessible::Name), QString("Action!"));
// TODO: Currently not working, task to fix is #100019.
#ifndef Q_OS_MAC
QCOMPARE(iFile->text(QAccessible::Accelerator, 0), tr("Alt+F"));
QCOMPARE(iEdit->text(QAccessible::Accelerator, 0), tr("Alt+E"));
QCOMPARE(iSeparator->text(QAccessible::Accelerator, 0), QString());
QCOMPARE(iHelp->text(QAccessible::Accelerator, 0), tr("Alt+H"));
QCOMPARE(iAction->text(QAccessible::Accelerator, 0), QString());
QCOMPARE(iFile->text(QAccessible::Accelerator), tr("Alt+F"));
QCOMPARE(iEdit->text(QAccessible::Accelerator), tr("Alt+E"));
QCOMPARE(iSeparator->text(QAccessible::Accelerator), QString());
QCOMPARE(iHelp->text(QAccessible::Accelerator), tr("Alt+H"));
QCOMPARE(iAction->text(QAccessible::Accelerator), QString());
#endif
QVERIFY(iFile->actionInterface());
@ -1662,7 +1666,7 @@ void tst_QAccessibility::spinBoxTest()
const QRect widgetRect = spinBox->geometry();
const QRect accessibleRect = interface->rect();
QCOMPARE(accessibleRect, widgetRect);
QCOMPARE(interface->text(QAccessible::Value, 0), QLatin1String("3"));
QCOMPARE(interface->text(QAccessible::Value), QLatin1String("3"));
// one child, the line edit
const int numChildren = interface->childCount();
@ -1670,7 +1674,7 @@ void tst_QAccessibility::spinBoxTest()
QAccessibleInterface *lineEdit = interface->child(0);
QCOMPARE(lineEdit->role(), QAccessible::EditableText);
QCOMPARE(lineEdit->text(QAccessible::Value, 0), QLatin1String("3"));
QCOMPARE(lineEdit->text(QAccessible::Value), QLatin1String("3"));
delete lineEdit;
QVERIFY(interface->valueInterface());
@ -1704,9 +1708,11 @@ void tst_QAccessibility::doubleSpinBoxTest()
// Test that we get valid rects for all the spinbox child interfaces.
const int numChildren = interface->childCount();
for (int i = 1; i <= numChildren; ++i) {
const QRect childRect = interface->rect(i);
for (int i = 0; i < numChildren; ++i) {
QAccessibleInterface *childIface = interface->child(i);
const QRect childRect = childIface->rect();
QVERIFY(childRect.isValid());
delete childIface;
}
delete doubleSpinBox;
@ -1724,7 +1730,7 @@ void tst_QAccessibility::textEditTest()
edit.show();
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(&edit);
QCOMPARE(iface->text(QAccessible::Value, 0), text);
QCOMPARE(iface->text(QAccessible::Value), text);
QCOMPARE(iface->textInterface()->textAtOffset(8, QAccessible2::WordBoundary, &startOffset, &endOffset), QString("world"));
QCOMPARE(startOffset, 6);
QCOMPARE(endOffset, 11);
@ -1751,7 +1757,7 @@ void tst_QAccessibility::textBrowserTest()
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(&textBrowser);
QVERIFY(iface);
QCOMPARE(iface->role(), QAccessible::StaticText);
QCOMPARE(iface->text(QAccessible::Value, 0), text);
QCOMPARE(iface->text(QAccessible::Value), text);
int startOffset;
int endOffset;
QCOMPARE(iface->textInterface()->textAtOffset(8, QAccessible2::WordBoundary, &startOffset, &endOffset), QString("world"));
@ -1860,15 +1866,11 @@ void tst_QAccessibility::mdiSubWindowTest()
QCOMPARE(interface->childCount(), 1);
// setText / text
QCOMPARE(interface->text(QAccessible::Name, 0), QString());
QCOMPARE(interface->text(QAccessible::Name, 1), QString());
QCOMPARE(interface->text(QAccessible::Name), QString());
testWindow->setWindowTitle(QLatin1String("ReplaceMe"));
QCOMPARE(interface->text(QAccessible::Name, 0), QLatin1String("ReplaceMe"));
QCOMPARE(interface->text(QAccessible::Name, 1), QLatin1String("ReplaceMe"));
interface->setText(QAccessible::Name, 0, QLatin1String("TitleSetOnWindow"));
QCOMPARE(interface->text(QAccessible::Name, 0), QLatin1String("TitleSetOnWindow"));
interface->setText(QAccessible::Name, 1, QLatin1String("TitleSetOnChild"));
QCOMPARE(interface->text(QAccessible::Name, 0), QLatin1String("TitleSetOnChild"));
QCOMPARE(interface->text(QAccessible::Name), QLatin1String("ReplaceMe"));
interface->setText(QAccessible::Name, QLatin1String("TitleSetOnWindow"));
QCOMPARE(interface->text(QAccessible::Name), QLatin1String("TitleSetOnWindow"));
mdiArea.setActiveSubWindow(testWindow);
@ -1919,17 +1921,17 @@ void tst_QAccessibility::mdiSubWindowTest()
QCOMPARE(interface->rect(), QRect(globalPos, testWindow->size()));
testWindow->hide();
QCOMPARE(interface->rect(), QRect());
QCOMPARE(interface->rect(1), QRect());
QCOMPARE(childRect(interface), QRect());
testWindow->showMinimized();
QCOMPARE(interface->rect(1), QRect());
QCOMPARE(childRect(interface), QRect());
testWindow->showNormal();
testWindow->widget()->hide();
QCOMPARE(interface->rect(1), QRect());
QCOMPARE(childRect(interface), QRect());
testWindow->widget()->show();
const QRect widgetGeometry = testWindow->contentsRect();
const QPoint globalWidgetPos = QPoint(globalPos.x() + widgetGeometry.x(),
globalPos.y() + widgetGeometry.y());
QCOMPARE(interface->rect(1), QRect(globalWidgetPos, widgetGeometry.size()));
QCOMPARE(childRect(interface), QRect(globalWidgetPos, widgetGeometry.size()));
// childAt
QCOMPARE(interface->childAt(-10, 0), -1);
@ -1962,19 +1964,19 @@ void tst_QAccessibility::lineEditTest()
le->setText(secret);
le->setEchoMode(QLineEdit::Normal);
QVERIFY(!(iface->state() & QAccessible::Protected));
QCOMPARE(iface->text(QAccessible::Value, 0), secret);
QCOMPARE(iface->text(QAccessible::Value), secret);
le->setEchoMode(QLineEdit::NoEcho);
QVERIFY(iface->state() & QAccessible::Protected);
QVERIFY(iface->text(QAccessible::Value, 0).isEmpty());
QVERIFY(iface->text(QAccessible::Value).isEmpty());
le->setEchoMode(QLineEdit::Password);
QVERIFY(iface->state() & QAccessible::Protected);
QVERIFY(iface->text(QAccessible::Value, 0).isEmpty());
QVERIFY(iface->text(QAccessible::Value).isEmpty());
le->setEchoMode(QLineEdit::PasswordEchoOnEdit);
QVERIFY(iface->state() & QAccessible::Protected);
QVERIFY(iface->text(QAccessible::Value, 0).isEmpty());
QVERIFY(iface->text(QAccessible::Value).isEmpty());
le->setEchoMode(QLineEdit::Normal);
QVERIFY(!(iface->state() & QAccessible::Protected));
QCOMPARE(iface->text(QAccessible::Value, 0), secret);
QCOMPARE(iface->text(QAccessible::Value), secret);
QWidget *toplevel = new QWidget;
le->setParent(toplevel);
@ -1999,7 +2001,7 @@ void tst_QAccessibility::lineEditTest()
le->setText(QLatin1String("500"));
le->setValidator(new QIntValidator());
iface->setText(QAccessible::Value, 0, QLatin1String("This text is not a number"));
iface->setText(QAccessible::Value, QLatin1String("This text is not a number"));
QCOMPARE(le->text(), QLatin1String("500"));
delete iface;
@ -2141,13 +2143,12 @@ void tst_QAccessibility::dialogButtonBoxTest()
QApplication::processEvents();
QCOMPARE(iface->childCount(), 3);
QCOMPARE(iface->role(), QAccessible::Grouping);
QCOMPARE(iface->role(1), QAccessible::PushButton);
QCOMPARE(iface->role(2), QAccessible::PushButton);
QCOMPARE(iface->role(3), QAccessible::PushButton);
QStringList actualOrder;
QAccessibleInterface *child;
QAccessibleInterface *leftmost;
child = iface->child(0);
QCOMPARE(child->role(), QAccessible::PushButton);
// first find the leftmost button
while (child->navigate(QAccessible::Left, 1, &leftmost) != -1) {
delete child;
@ -2158,7 +2159,7 @@ void tst_QAccessibility::dialogButtonBoxTest()
// then traverse from left to right to find the correct order of the buttons
int right = 0;
while (right != -1) {
actualOrder << leftmost->text(QAccessible::Name, 0);
actualOrder << leftmost->text(QAccessible::Name);
right = leftmost->navigate(QAccessible::Right, 1, &child);
delete leftmost;
leftmost = child;
@ -2219,7 +2220,7 @@ void tst_QAccessibility::dialogButtonBoxTest()
actualOrder.clear();
int right = 0;
while (right != -1) {
actualOrder << other->text(QAccessible::Name, 0);
actualOrder << other->text(QAccessible::Name);
right = other->navigate(QAccessible::Down, 1, &child);
delete other;
other = child;
@ -2252,7 +2253,7 @@ void tst_QAccessibility::dialTest()
QVERIFY(interface);
QCOMPARE(interface->childCount(), 0);
QCOMPARE(interface->text(QAccessible::Value, 0), QString::number(dial.value()));
QCOMPARE(interface->text(QAccessible::Value), QString::number(dial.value()));
QCOMPARE(interface->rect(), dial.geometry());
QAccessibleValueInterface *valueIface = interface->valueInterface();
@ -2459,345 +2460,8 @@ void tst_QAccessibility::scrollAreaTest()
QTestAccessibility::clearEvents();
}
void tst_QAccessibility::listViewTest()
{
#if defined(Q_OS_UNIX)
QSKIP( "Accessible table1 interface is no longer supported on X11.");
#else
{
QListView listView;
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(&listView);
QVERIFY(iface);
QCOMPARE(iface->childCount(), 1);
delete iface;
}
{
QListWidget listView;
listView.addItem(tr("A"));
listView.addItem(tr("B"));
listView.addItem(tr("C"));
listView.resize(400,400);
listView.show();
QTest::qWait(1); // Need this for indexOfchild to work.
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(&listView);
QCOMPARE((int)iface->role(), (int)QAccessible::Client);
QCOMPARE((int)iface->role(1), (int)QAccessible::List);
QCOMPARE(iface->childCount(), 1);
QAccessibleInterface *child;
iface->navigate(QAccessible::Child, 1, &child);
delete iface;
iface = child;
QCOMPARE(iface->text(QAccessible::Name, 1), QString("A"));
QCOMPARE(iface->text(QAccessible::Name, 2), QString("B"));
QCOMPARE(iface->text(QAccessible::Name, 3), QString("C"));
QCOMPARE(iface->childCount(), 3);
QAccessibleInterface *childA = 0;
QCOMPARE(iface->navigate(QAccessible::Child, 1, &childA), 0);
QVERIFY(childA);
QCOMPARE(iface->indexOfChild(childA), 1);
QCOMPARE(childA->text(QAccessible::Name, 1), QString("A"));
delete childA;
QAccessibleInterface *childB = 0;
QCOMPARE(iface->navigate(QAccessible::Child, 2, &childB), 0);
QVERIFY(childB);
QCOMPARE(iface->indexOfChild(childB), 2);
QCOMPARE(childB->text(QAccessible::Name, 1), QString("B"));
delete childB;
QAccessibleInterface *childC = 0;
QCOMPARE(iface->navigate(QAccessible::Child, 3, &childC), 0);
QVERIFY(childC);
QCOMPARE(iface->indexOfChild(childC), 3);
QCOMPARE(childC->text(QAccessible::Name, 1), QString("C"));
delete childC;
QTestAccessibility::clearEvents();
// Check for events
QTest::mouseClick(listView.viewport(), Qt::LeftButton, 0, listView.visualItemRect(listView.item(1)).center());
QTest::mouseClick(listView.viewport(), Qt::LeftButton, 0, listView.visualItemRect(listView.item(2)).center());
QVERIFY(QTestAccessibility::events().contains(QTestAccessibilityEvent(listView.viewport(), 2, QAccessible::Selection)));
QVERIFY(QTestAccessibility::events().contains(QTestAccessibilityEvent(listView.viewport(), 3, QAccessible::Selection)));
delete iface;
}
QTestAccessibility::clearEvents();
#endif
}
void tst_QAccessibility::treeWidgetTest()
{
#if defined(Q_OS_UNIX)
QSKIP( "Accessible table1 interface is no longer supported on X11.");
#else
QWidget *w = new QWidget;
QTreeWidget *tree = new QTreeWidget(w);
QHBoxLayout *l = new QHBoxLayout(w);
l->addWidget(tree);
for (int i = 0; i < 10; ++i) {
QStringList strings = QStringList() << QString::fromAscii("row: %1").arg(i)
<< QString("column 1") << QString("column 2");
tree->addTopLevelItem(new QTreeWidgetItem(strings));
}
w->show();
QAccessibleInterface *acc = QAccessible::queryAccessibleInterface(tree);
QAccessibleInterface *accViewport = 0;
int entry = acc->navigate(QAccessible::Child, 1, &accViewport);
QVERIFY(accViewport);
QCOMPARE(entry, 0);
QAccessibleInterface *accTreeItem = 0;
entry = accViewport->navigate(QAccessible::Child, 1, &accTreeItem);
QCOMPARE(entry, 0);
QAccessibleInterface *accTreeItem2 = 0;
entry = accTreeItem->navigate(QAccessible::Sibling, 3, &accTreeItem2);
QCOMPARE(entry, 0);
QCOMPARE(accTreeItem2->text(QAccessible::Name, 0), QLatin1String("row: 1"));
// test selected/focused state
QItemSelectionModel *selModel = tree->selectionModel();
QVERIFY(selModel);
selModel->select(QItemSelection(tree->model()->index(0, 0), tree->model()->index(3, 0)), QItemSelectionModel::Select);
selModel->setCurrentIndex(tree->model()->index(1, 0), QItemSelectionModel::Current);
for (int i = 1; i < 10 ; ++i) {
QAccessible::State expected;
if (i <= 5 && i >= 2)
expected = QAccessible::Selected;
if (i == 3)
expected |= QAccessible::Focused;
QCOMPARE(accViewport->state(i) & (QAccessible::Focused | QAccessible::Selected), expected);
}
// Test sanity of its navigation functions
QCOMPARE(verifyHierarchy(acc), 0);
delete accTreeItem2;
delete accTreeItem;
delete accViewport;
delete acc;
delete w;
QTestAccessibility::clearEvents();
#endif
}
void tst_QAccessibility::tableWidgetTest()
{
#if defined(Q_OS_UNIX)
QSKIP( "Accessible table1 interface is no longer supported on X11.");
#else
{
QWidget *topLevel = new QWidget;
QTableWidget *w = new QTableWidget(8,4,topLevel);
for (int r = 0; r < 8; ++r) {
for (int c = 0; c < 4; ++c) {
w->setItem(r, c, new QTableWidgetItem(tr("%1,%2").arg(c).arg(r)));
}
}
w->resize(100, 100);
topLevel->show();
QAccessibleInterface *client = QAccessible::queryAccessibleInterface(w);
QCOMPARE(client->role(), QAccessible::Client);
QCOMPARE(client->childCount(), 3);
QAccessibleInterface *view = 0;
view = client->child(0);
QCOMPARE(view->role(), QAccessible::Table);
QAccessibleInterface *ifRow;
ifRow = view->child(1);
QCOMPARE(ifRow->role(), QAccessible::Row);
QAccessibleInterface *item;
int entry = ifRow->navigate(QAccessible::Child, 1, &item);
QCOMPARE(entry, 1);
QCOMPARE(item , (QAccessibleInterface*)0);
QCOMPARE(ifRow->text(QAccessible::Name, 2), QLatin1String("0,0"));
QCOMPARE(ifRow->text(QAccessible::Name, 3), QLatin1String("1,0"));
QCOMPARE(verifyHierarchy(client), 0);
delete ifRow;
delete view;
delete client;
delete w;
delete topLevel;
}
QTestAccessibility::clearEvents();
#endif
}
class QtTestTableModel: public QAbstractTableModel
{
Q_OBJECT
signals:
void invalidIndexEncountered() const;
public:
QtTestTableModel(int rows = 0, int columns = 0, QObject *parent = 0)
: QAbstractTableModel(parent),
row_count(rows),
column_count(columns) {}
int rowCount(const QModelIndex& = QModelIndex()) const { return row_count; }
int columnCount(const QModelIndex& = QModelIndex()) const { return column_count; }
QVariant data(const QModelIndex &idx, int role) const
{
if (!idx.isValid() || idx.row() >= row_count || idx.column() >= column_count) {
qWarning() << "Invalid modelIndex [%d,%d,%p]" << idx;
emit invalidIndexEncountered();
return QVariant();
}
if (role == Qt::DisplayRole || role == Qt::EditRole)
return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column()).arg(0);
return QVariant();
}
void removeLastRow()
{
beginRemoveRows(QModelIndex(), row_count - 1, row_count - 1);
--row_count;
endRemoveRows();
}
void removeAllRows()
{
beginRemoveRows(QModelIndex(), 0, row_count - 1);
row_count = 0;
endRemoveRows();
}
void removeLastColumn()
{
beginRemoveColumns(QModelIndex(), column_count - 1, column_count - 1);
--column_count;
endRemoveColumns();
}
void removeAllColumns()
{
beginRemoveColumns(QModelIndex(), 0, column_count - 1);
column_count = 0;
endRemoveColumns();
}
void reset()
{
QAbstractTableModel::reset();
}
int row_count;
int column_count;
};
class QtTestDelegate : public QItemDelegate
{
public:
QtTestDelegate(QWidget *parent = 0) : QItemDelegate(parent) {}
virtual QSize sizeHint(const QStyleOptionViewItem &/*option*/, const QModelIndex &/*index*/) const
{
return QSize(100,50);
}
};
void tst_QAccessibility::tableViewTest()
{
#if defined(Q_OS_UNIX)
QSKIP( "Accessible table1 interface is no longer supported on X11.");
#else
{
QtTestTableModel *model = new QtTestTableModel(3, 4);
QTableView *w = new QTableView();
w->setModel(model);
w->setItemDelegate(new QtTestDelegate(w));
w->resize(450,200);
w->resizeColumnsToContents();
w->resizeRowsToContents();
w->show();
QAccessibleInterface *client = QAccessible::queryAccessibleInterface(w);
QAccessibleInterface *table2;
client->navigate(QAccessible::Child, 1, &table2);
QVERIFY(table2);
QCOMPARE(table2->role(1), QAccessible::Row);
QAccessibleInterface *toprow = 0;
table2->navigate(QAccessible::Child, 1, &toprow);
QVERIFY(toprow);
QCOMPARE(toprow->role(1), QAccessible::RowHeader);
QCOMPARE(toprow->role(2), QAccessible::ColumnHeader);
delete toprow;
// call childAt() for each child until we reach the bottom,
// and do it for each row in the table
for (int y = 1; y < 5; ++y) { // this includes the special header
for (int x = 1; x < 6; ++x) {
QCOMPARE(client->role(), QAccessible::Client);
QRect globalRect = client->rect();
QVERIFY(globalRect.isValid());
// make sure we don't hit the vertical header #####
QPoint p = globalRect.topLeft() + QPoint(8, 8);
p.ry() += 50 * (y - 1);
p.rx() += 100 * (x - 1);
int index = client->childAt(p.x(), p.y());
QCOMPARE(index, 1);
QCOMPARE(client->role(index), QAccessible::Table);
// navigate to table/viewport
QAccessibleInterface *table;
client->navigate(QAccessible::Child, index, &table);
QVERIFY(table);
index = table->childAt(p.x(), p.y());
QCOMPARE(index, y);
QCOMPARE(table->role(index), QAccessible::Row);
QAccessibleInterface *row;
QCOMPARE(table->role(1), QAccessible::Row);
// navigate to the row
table->navigate(QAccessible::Child, index, &row);
QVERIFY(row);
QCOMPARE(row->role(1), QAccessible::RowHeader);
index = row->childAt(p.x(), p.y());
QVERIFY(index > 0);
if (x == 1 && y == 1) {
QCOMPARE(row->role(index), QAccessible::RowHeader);
QCOMPARE(row->text(QAccessible::Name, index), QLatin1String(""));
} else if (x > 1 && y > 1) {
QCOMPARE(row->role(index), QAccessible::Cell);
QCOMPARE(row->text(QAccessible::Name, index), QString::fromAscii("[%1,%2,0]").arg(y - 2).arg(x - 2));
} else if (x == 1) {
QCOMPARE(row->role(index), QAccessible::RowHeader);
QCOMPARE(row->text(QAccessible::Name, index), QString::fromAscii("%1").arg(y - 1));
} else if (y == 1) {
QCOMPARE(row->role(index), QAccessible::ColumnHeader);
QCOMPARE(row->text(QAccessible::Name, index), QString::fromAscii("%1").arg(x - 1));
}
delete table;
delete row;
}
}
delete table2;
delete client;
delete w;
delete model;
}
QTestAccessibility::clearEvents();
#endif
}
void tst_QAccessibility::table2ListTest()
{
#if !defined(Q_OS_UNIX)
QSKIP( "Accessible table2 interface is currently only supported on X11.");
#else
QListWidget *listView = new QListWidget;
listView->addItem("Oslo");
listView->addItem("Berlin");
@ -2818,7 +2482,7 @@ void tst_QAccessibility::table2ListTest()
child1 = iface->child(0);
QVERIFY(child1);
QCOMPARE(iface->indexOfChild(child1), 1);
QCOMPARE(child1->text(QAccessible::Name, 0), QString("Oslo"));
QCOMPARE(child1->text(QAccessible::Name), QString("Oslo"));
QCOMPARE(child1->role(), QAccessible::ListItem);
delete child1;
@ -2826,14 +2490,14 @@ void tst_QAccessibility::table2ListTest()
child2 = iface->child(1);
QVERIFY(child2);
QCOMPARE(iface->indexOfChild(child2), 2);
QCOMPARE(child2->text(QAccessible::Name, 0), QString("Berlin"));
QCOMPARE(child2->text(QAccessible::Name), QString("Berlin"));
delete child2;
QAccessibleInterface *child3 = 0;
child3 = iface->child(2);
QVERIFY(child3);
QCOMPARE(iface->indexOfChild(child3), 3);
QCOMPARE(child3->text(QAccessible::Name, 0), QString("Brisbane"));
QCOMPARE(child3->text(QAccessible::Name), QString("Brisbane"));
delete child3;
QTestAccessibility::clearEvents();
@ -2855,10 +2519,10 @@ void tst_QAccessibility::table2ListTest()
QCOMPARE(table2->rowCount(), 4);
QAccessibleTable2CellInterface *cell1;
QVERIFY(cell1 = table2->cellAt(0,0));
QCOMPARE(cell1->text(QAccessible::Name, 0), QString("Oslo"));
QCOMPARE(cell1->text(QAccessible::Name), QString("Oslo"));
QAccessibleTable2CellInterface *cell4;
QVERIFY(cell4 = table2->cellAt(3,0));
QCOMPARE(cell4->text(QAccessible::Name, 0), QString("Munich"));
QCOMPARE(cell4->text(QAccessible::Name), QString("Munich"));
QCOMPARE(cell4->role(), QAccessible::ListItem);
QCOMPARE(cell4->rowIndex(), 3);
QCOMPARE(cell4->columnIndex(), 0);
@ -2869,14 +2533,10 @@ void tst_QAccessibility::table2ListTest()
delete iface;
delete listView;
QTestAccessibility::clearEvents();
#endif
}
void tst_QAccessibility::table2TreeTest()
{
#if !defined(Q_OS_UNIX)
QSKIP( "Accessible table2 interface is currently only supported on X11.");
#else
QTreeWidget *treeView = new QTreeWidget;
treeView->setColumnCount(2);
QTreeWidgetItem *header = new QTreeWidgetItem;
@ -2924,7 +2584,7 @@ void tst_QAccessibility::table2TreeTest()
header1 = iface->child(0);
QVERIFY(header1);
QCOMPARE(iface->indexOfChild(header1), 1);
QCOMPARE(header1->text(QAccessible::Name, 0), QString("Artist"));
QCOMPARE(header1->text(QAccessible::Name), QString("Artist"));
QCOMPARE(header1->role(), QAccessible::ColumnHeader);
delete header1;
@ -2932,7 +2592,7 @@ void tst_QAccessibility::table2TreeTest()
child1 = iface->child(2);
QVERIFY(child1);
QCOMPARE(iface->indexOfChild(child1), 3);
QCOMPARE(child1->text(QAccessible::Name, 0), QString("Spain"));
QCOMPARE(child1->text(QAccessible::Name), QString("Spain"));
QCOMPARE(child1->role(), QAccessible::TreeItem);
QVERIFY(!(child1->state() & QAccessible::Expanded));
delete child1;
@ -2941,7 +2601,7 @@ void tst_QAccessibility::table2TreeTest()
child2 = iface->child(4);
QVERIFY(child2);
QCOMPARE(iface->indexOfChild(child2), 5);
QCOMPARE(child2->text(QAccessible::Name, 0), QString("Austria"));
QCOMPARE(child2->text(QAccessible::Name), QString("Austria"));
delete child2;
QTestAccessibility::clearEvents();
@ -2953,10 +2613,10 @@ void tst_QAccessibility::table2TreeTest()
QCOMPARE(table2->rowCount(), 2);
QAccessibleTable2CellInterface *cell1;
QVERIFY(cell1 = table2->cellAt(0,0));
QCOMPARE(cell1->text(QAccessible::Name, 0), QString("Spain"));
QCOMPARE(cell1->text(QAccessible::Name), QString("Spain"));
QAccessibleTable2CellInterface *cell2;
QVERIFY(cell2 = table2->cellAt(1,0));
QCOMPARE(cell2->text(QAccessible::Name, 0), QString("Austria"));
QCOMPARE(cell2->text(QAccessible::Name), QString("Austria"));
QCOMPARE(cell2->role(), QAccessible::TreeItem);
QCOMPARE(cell2->rowIndex(), 1);
QCOMPARE(cell2->columnIndex(), 0);
@ -2976,11 +2636,11 @@ void tst_QAccessibility::table2TreeTest()
QCOMPARE(table2->columnCount(), 2);
QCOMPARE(table2->rowCount(), 5);
cell1 = table2->cellAt(1,0);
QCOMPARE(cell1->text(QAccessible::Name, 0), QString("Picasso"));
QCOMPARE(cell1->text(QAccessible::Name), QString("Picasso"));
QCOMPARE(iface->indexOfChild(cell1), 5); // 1 based + 2 header + 2 for root item
cell2 = table2->cellAt(4,0);
QCOMPARE(cell2->text(QAccessible::Name, 0), QString("Klimt"));
QCOMPARE(cell2->text(QAccessible::Name), QString("Klimt"));
QCOMPARE(cell2->role(), QAccessible::TreeItem);
QCOMPARE(cell2->rowIndex(), 4);
QCOMPARE(cell2->columnIndex(), 0);
@ -2992,14 +2652,10 @@ void tst_QAccessibility::table2TreeTest()
delete iface;
QTestAccessibility::clearEvents();
#endif
}
void tst_QAccessibility::table2TableTest()
{
#if !defined(Q_OS_UNIX)
QSKIP( "Accessible table2 interface is currently only supported on X11.");
#else
QTableWidget *tableView = new QTableWidget(3, 3);
tableView->setColumnCount(3);
QStringList hHeader;
@ -3038,7 +2694,7 @@ void tst_QAccessibility::table2TableTest()
QAccessibleInterface *child1 = iface->child(2);
QVERIFY(child1);
QCOMPARE(iface->indexOfChild(child1), 3);
QCOMPARE(child1->text(QAccessible::Name, 0), QString("h2"));
QCOMPARE(child1->text(QAccessible::Name), QString("h2"));
QCOMPARE(child1->role(), QAccessible::ColumnHeader);
QVERIFY(!(child1->state() & QAccessible::Expanded));
delete child1;
@ -3046,7 +2702,7 @@ void tst_QAccessibility::table2TableTest()
QAccessibleInterface *child2 = iface->child(10);
QVERIFY(child2);
QCOMPARE(iface->indexOfChild(child2), 11);
QCOMPARE(child2->text(QAccessible::Name, 0), QString("1.1"));
QCOMPARE(child2->text(QAccessible::Name), QString("1.1"));
QAccessibleTable2CellInterface *cell2Iface = static_cast<QAccessibleTable2CellInterface*>(child2);
QCOMPARE(cell2Iface->rowIndex(), 1);
QCOMPARE(cell2Iface->columnIndex(), 1);
@ -3054,7 +2710,7 @@ void tst_QAccessibility::table2TableTest()
QAccessibleInterface *child3 = iface->child(11);
QCOMPARE(iface->indexOfChild(child3), 12);
QCOMPARE(child3->text(QAccessible::Name, 0), QString("1.2"));
QCOMPARE(child3->text(QAccessible::Name), QString("1.2"));
delete child3;
QTestAccessibility::clearEvents();
@ -3066,12 +2722,12 @@ void tst_QAccessibility::table2TableTest()
QCOMPARE(table2->rowCount(), 3);
QAccessibleTable2CellInterface *cell1;
QVERIFY(cell1 = table2->cellAt(0,0));
QCOMPARE(cell1->text(QAccessible::Name, 0), QString("0.0"));
QCOMPARE(cell1->text(QAccessible::Name), QString("0.0"));
QCOMPARE(iface->indexOfChild(cell1), 6);
QAccessibleTable2CellInterface *cell2;
QVERIFY(cell2 = table2->cellAt(0,1));
QCOMPARE(cell2->text(QAccessible::Name, 0), QString("0.1"));
QCOMPARE(cell2->text(QAccessible::Name), QString("0.1"));
QCOMPARE(cell2->role(), QAccessible::Cell);
QCOMPARE(cell2->rowIndex(), 0);
QCOMPARE(cell2->columnIndex(), 1);
@ -3080,7 +2736,7 @@ void tst_QAccessibility::table2TableTest()
QAccessibleTable2CellInterface *cell3;
QVERIFY(cell3 = table2->cellAt(1,2));
QCOMPARE(cell3->text(QAccessible::Name, 0), QString("1.2"));
QCOMPARE(cell3->text(QAccessible::Name), QString("1.2"));
QCOMPARE(cell3->role(), QAccessible::Cell);
QCOMPARE(cell3->rowIndex(), 1);
QCOMPARE(cell3->columnIndex(), 2);
@ -3099,7 +2755,6 @@ void tst_QAccessibility::table2TableTest()
delete tableView;
QTestAccessibility::clearEvents();
#endif
}
void tst_QAccessibility::calendarWidgetTest()
@ -3112,7 +2767,6 @@ void tst_QAccessibility::calendarWidgetTest()
QVERIFY(interface);
QCOMPARE(interface->role(), QAccessible::Table);
QVERIFY(!interface->rect().isValid());
QVERIFY(!interface->rect(1).isValid());
QCOMPARE(interface->childAt(200, 200), -1);
calendarWidget.resize(400, 300);
@ -3228,9 +2882,9 @@ void tst_QAccessibility::dockWidgetTest()
// 4 children: menu bar, dock1, dock2, and central widget
QCOMPARE(accMainWindow->childCount(), 4);
QAccessibleInterface *accDock1 = 0;
for (int i = 1; i <= 4; ++i) {
if (accMainWindow->role(i) == QAccessible::Window) {
accDock1 = accMainWindow->child(i-1);
for (int i = 0; i < 4; ++i) {
accDock1 = accMainWindow->child(i);
if (accMainWindow->role() == QAccessible::Window) {
if (accDock1 && qobject_cast<QDockWidget*>(accDock1->object()) == dock1) {
break;
} else {
@ -3240,8 +2894,11 @@ void tst_QAccessibility::dockWidgetTest()
}
QVERIFY(accDock1);
QCOMPARE(accDock1->role(), QAccessible::Window);
QCOMPARE(accDock1->role(1), QAccessible::TitleBar);
QVERIFY(accDock1->rect().contains(accDock1->rect(1)));
QAccessibleInterface *dock1TitleBar = accDock1->child(0);
QCOMPARE(dock1TitleBar->role(), QAccessible::TitleBar);
QVERIFY(accDock1->rect().contains(dock1TitleBar->rect()));
delete dock1TitleBar;
QPoint globalPos = dock1->mapToGlobal(QPoint(0,0));
globalPos.rx()+=5; //### query style
@ -3347,7 +3004,7 @@ void tst_QAccessibility::labelTest()
QAccessibleInterface *acc_label = QAccessible::queryAccessibleInterface(label);
QVERIFY(acc_label);
QCOMPARE(acc_label->text(QAccessible::Name, 0), text);
QCOMPARE(acc_label->text(QAccessible::Name), text);
delete acc_label;
delete label;
@ -3388,24 +3045,24 @@ void tst_QAccessibility::accelerators()
window->show();
QAccessibleInterface *accLineEdit = QAccessible::queryAccessibleInterface(le);
QCOMPARE(accLineEdit->text(QAccessible::Accelerator, 0), QKeySequence(Qt::ALT).toString(QKeySequence::NativeText) + QLatin1String("L"));
QCOMPARE(accLineEdit->text(QAccessible::Accelerator, 0), QKeySequence(Qt::ALT).toString(QKeySequence::NativeText) + QLatin1String("L"));
QCOMPARE(accLineEdit->text(QAccessible::Accelerator), QKeySequence(Qt::ALT).toString(QKeySequence::NativeText) + QLatin1String("L"));
QCOMPARE(accLineEdit->text(QAccessible::Accelerator), QKeySequence(Qt::ALT).toString(QKeySequence::NativeText) + QLatin1String("L"));
label->setText(tr("Q &"));
QCOMPARE(accLineEdit->text(QAccessible::Accelerator, 0), QString());
QCOMPARE(accLineEdit->text(QAccessible::Accelerator), QString());
label->setText(tr("Q &&"));
QCOMPARE(accLineEdit->text(QAccessible::Accelerator, 0), QString());
QCOMPARE(accLineEdit->text(QAccessible::Accelerator), QString());
label->setText(tr("Q && A"));
QCOMPARE(accLineEdit->text(QAccessible::Accelerator, 0), QString());
QCOMPARE(accLineEdit->text(QAccessible::Accelerator), QString());
label->setText(tr("Q &&&A"));
QCOMPARE(accLineEdit->text(QAccessible::Accelerator, 0), QKeySequence(Qt::ALT).toString(QKeySequence::NativeText) + QLatin1String("A"));
QCOMPARE(accLineEdit->text(QAccessible::Accelerator), QKeySequence(Qt::ALT).toString(QKeySequence::NativeText) + QLatin1String("A"));
label->setText(tr("Q &&A"));
QCOMPARE(accLineEdit->text(QAccessible::Accelerator, 0), QString());
QCOMPARE(accLineEdit->text(QAccessible::Accelerator), QString());
#if !defined(QT_NO_DEBUG) && !defined(Q_WS_MAC)
QTest::ignoreMessage(QtWarningMsg, "QKeySequence::mnemonic: \"Q &A&B\" contains multiple occurrences of '&'");
#endif
label->setText(tr("Q &A&B"));
QCOMPARE(accLineEdit->text(QAccessible::Accelerator, 0), QKeySequence(Qt::ALT).toString(QKeySequence::NativeText) + QLatin1String("A"));
QCOMPARE(accLineEdit->text(QAccessible::Accelerator), QKeySequence(Qt::ALT).toString(QKeySequence::NativeText) + QLatin1String("A"));
#if defined(Q_OS_UNIX)
QCoreApplication::processEvents();