summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorJan-Arve Saether <jan-arve.saether@nokia.com>2012-02-09 11:20:34 +0100
committerQt by Nokia <qt-info@nokia.com>2012-02-10 15:21:46 +0100
commitff2886db6a3308c1f4ee0879af497a5d43c33133 (patch)
tree50bfc43dbcb2bb34898e7723519abde2181d0347 /src/plugins
parent482d96a0c5d523ace63f56bda6851926b4469dd0 (diff)
Move all usages of Relation enum values to QAccessible::relations()
Next step is to remove navigate(), but that has to be done in qtdeclarative first. Change-Id: I01ea1386c092446be04cc19d0f70adf53f094adc Reviewed-by: Frederik Gladhorn <frederik.gladhorn@nokia.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.cpp61
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.h3
-rw-r--r--src/plugins/platforms/windows/qwindowsaccessibility.cpp23
3 files changed, 47 insertions, 40 deletions
diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp
index 652150f392..0fdd4490f7 100644
--- a/src/plugins/accessible/widgets/simplewidgets.cpp
+++ b/src/plugins/accessible/widgets/simplewidgets.cpp
@@ -54,6 +54,7 @@
#include <qlineedit.h>
#include <qstyle.h>
#include <qstyleoption.h>
+#include <QtCore/qvarlengtharray.h>
#ifdef Q_OS_MAC
#include <qfocusframe.h>
@@ -427,52 +428,36 @@ QString QAccessibleDisplay::text(QAccessible::Text t) const
return qt_accStripAmp(str);
}
-QAccessible::Relation QAccessibleDisplay::relationTo(const QAccessibleInterface *other) const
+/*! \reimp */
+QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >
+QAccessibleDisplay::relations(QAccessible::Relation match /*= QAccessible::AllRelations*/) const
{
- QAccessible::Relation relation = QAccessibleWidget::relationTo(other);
+ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > rels = QAccessibleWidget::relations(match);
+ if (match & QAccessible::Labelled) {
+ QVarLengthArray<QObject *, 4> relatedObjects;
- QObject *o = other->object();
- QLabel *label = qobject_cast<QLabel*>(object());
- if (label) {
#ifndef QT_NO_SHORTCUT
- if (o == label->buddy())
- relation |= QAccessible::Label;
+ if (QLabel *label = qobject_cast<QLabel*>(object())) {
+ relatedObjects.append(label->buddy());
#endif
#ifndef QT_NO_GROUPBOX
- } else {
- QGroupBox *groupbox = qobject_cast<QGroupBox*>(object());
- if (groupbox && !groupbox->title().isEmpty())
- if (groupbox->children().contains(o))
- relation |= QAccessible::Label;
-#endif
- }
- return relation;
-}
-
-int QAccessibleDisplay::navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const
-{
- *target = 0;
- if (rel == QAccessible::Labelled) {
- QObject *targetObject = 0;
- QLabel *label = qobject_cast<QLabel*>(object());
- if (label) {
-#ifndef QT_NO_SHORTCUT
- if (entry == 1)
- targetObject = label->buddy();
-#endif
-#ifndef QT_NO_GROUPBOX
- } else {
- QGroupBox *groupbox = qobject_cast<QGroupBox*>(object());
- if (groupbox && !groupbox->title().isEmpty())
- *target = child(entry - 1);
+ } else if (QGroupBox *groupbox = qobject_cast<QGroupBox*>(object())) {
+ if (!groupbox->title().isEmpty()) {
+ const QList<QWidget*> kids = childWidgets(widget());
+ for (int i = 0; i < kids.count(); ++i) {
+ relatedObjects.append(kids.at(i));
+ }
+ }
#endif
}
- if (targetObject)
- *target = QAccessible::queryAccessibleInterface(targetObject);
- if (*target)
- return 0;
+ for (int i = 0; i < relatedObjects.count(); ++i) {
+ const QAccessible::Relation rel = QAccessible::Labelled;
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(relatedObjects.at(i));
+ if (iface)
+ rels.append(qMakePair(iface, rel));
+ }
}
- return QAccessibleWidget::navigate(rel, entry, target);
+ return rels;
}
void *QAccessibleDisplay::interface_cast(QAccessible::InterfaceType t)
diff --git a/src/plugins/accessible/widgets/simplewidgets.h b/src/plugins/accessible/widgets/simplewidgets.h
index bbdececadf..c228775421 100644
--- a/src/plugins/accessible/widgets/simplewidgets.h
+++ b/src/plugins/accessible/widgets/simplewidgets.h
@@ -104,8 +104,7 @@ public:
QString text(QAccessible::Text t) const;
QAccessible::Role role() const;
- QAccessible::Relation relationTo(const QAccessibleInterface *other) const;
- int navigate(QAccessible::RelationFlag, int entry, QAccessibleInterface **target) const;
+ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >relations(QAccessible::Relation match = QAccessible::AllRelations) const;
void *interface_cast(QAccessible::InterfaceType t);
// QAccessibleImageInterface
diff --git a/src/plugins/platforms/windows/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/qwindowsaccessibility.cpp
index 2c49d8614d..e36e255947 100644
--- a/src/plugins/platforms/windows/qwindowsaccessibility.cpp
+++ b/src/plugins/platforms/windows/qwindowsaccessibility.cpp
@@ -988,6 +988,17 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accKeyboardShortcut(VARIANT va
return *pszKeyboardShortcut ? S_OK : S_FALSE;
}
+static QAccessibleInterface *relatedInterface(QAccessibleInterface *iface, QAccessible::RelationFlag flag)
+{
+ typedef QPair<QAccessibleInterface *, QAccessible::Relation> RelationPair;
+ QVector<RelationPair> rels = iface->relations(flag);
+
+ for (int i = 1; i < rels.count(); ++i)
+ delete rels.at(i).first;
+
+ return rels.value(0).first;
+}
+
// moz: [important]
HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accName(VARIANT varID, BSTR* pszName)
{
@@ -1001,8 +1012,20 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accName(VARIANT varID, BSTR* p
if (!child)
return E_FAIL;
name = child->text(QAccessible::Name);
+ if (name.isEmpty()) {
+ if (QAccessibleInterface *labelInterface = relatedInterface(child.data(), QAccessible::Label)) {
+ name = labelInterface->text(QAccessible::Name);
+ delete labelInterface;
+ }
+ }
} else {
name = accessible->text(QAccessible::Name);
+ if (name.isEmpty()) {
+ if (QAccessibleInterface *labelInterface = relatedInterface(accessible, QAccessible::Label)) {
+ name = labelInterface->text(QAccessible::Name);
+ delete labelInterface;
+ }
+ }
}
if (name.size()) {
*pszName = QStringToBSTR(name);