aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/accessible/accessible.pro3
-rw-r--r--src/plugins/accessible/qtquick1/main.cpp106
-rw-r--r--src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.cpp290
-rw-r--r--src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.h80
-rw-r--r--src/plugins/accessible/qtquick1/qaccessibledeclarativeview.cpp97
-rw-r--r--src/plugins/accessible/qtquick1/qaccessibledeclarativeview.h75
-rw-r--r--src/plugins/accessible/qtquick1/qtquick1.pro22
-rw-r--r--src/plugins/accessible/quick/main.cpp98
-rw-r--r--src/plugins/accessible/quick/qaccessiblequickitem.cpp292
-rw-r--r--src/plugins/accessible/quick/qaccessiblequickitem.h83
-rw-r--r--src/plugins/accessible/quick/qaccessiblequickview.cpp137
-rw-r--r--src/plugins/accessible/quick/qaccessiblequickview.h78
-rw-r--r--src/plugins/accessible/quick/quick.pro23
-rw-r--r--src/plugins/accessible/shared/qaccessiblebase.pri7
-rw-r--r--src/plugins/accessible/shared/qdeclarativeaccessible.cpp172
-rw-r--r--src/plugins/accessible/shared/qdeclarativeaccessible.h98
-rw-r--r--src/plugins/plugins.pro1
17 files changed, 1662 insertions, 0 deletions
diff --git a/src/plugins/accessible/accessible.pro b/src/plugins/accessible/accessible.pro
new file mode 100644
index 0000000000..71165af784
--- /dev/null
+++ b/src/plugins/accessible/accessible.pro
@@ -0,0 +1,3 @@
+TEMPLATE = subdirs
+SUBDIRS += quick
+SUBDIRS += qtquick1
diff --git a/src/plugins/accessible/qtquick1/main.cpp b/src/plugins/accessible/qtquick1/main.cpp
new file mode 100644
index 0000000000..5ace1a78a1
--- /dev/null
+++ b/src/plugins/accessible/qtquick1/main.cpp
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdeclarativeaccessible.h"
+#include "qaccessibledeclarativeview.h"
+#include "qaccessibledeclarativeitem.h"
+
+#include <QtQuick1/qdeclarativeitem.h>
+#include <QtWidgets/qgraphicsview.h>
+
+#include <qaccessibleplugin.h>
+#include <qplugin.h>
+#include <qvariant.h>
+#include <qaccessible.h>
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+class AccessibleQtQuick1Factory : public QAccessiblePlugin
+{
+public:
+ AccessibleQtQuick1Factory();
+
+ QStringList keys() const;
+ QAccessibleInterface *create(const QString &classname, QObject *object);
+};
+
+AccessibleQtQuick1Factory::AccessibleQtQuick1Factory()
+{
+}
+
+QStringList AccessibleQtQuick1Factory::keys() const
+{
+ QStringList list;
+ list << QLatin1String("QDeclarativeView");
+ list << QLatin1String("QDeclarativeItem");
+ return list;
+}
+
+QAccessibleInterface *AccessibleQtQuick1Factory::create(const QString &classname, QObject *object)
+{
+ if (classname == QLatin1String("QDeclarativeView")) {
+ QWidget *widget = qobject_cast<QWidget*>(object);
+ if (qobject_cast<QDeclarativeView *>(widget) != 0)
+ return new QAccessibleDeclarativeView(widget);
+ } else if (classname == QLatin1String("QDeclarativeItem")) {
+ QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(object);
+ if (!item->scene())
+ return 0;
+
+ QList<QGraphicsView *> views = item->scene()->views();
+ if (views.isEmpty())
+ return 0;
+ QGraphicsView *view = views.at(0); // Accessibility support for the first view only.
+ // (Not a problem for QDeclarative)
+ return new QAccessibleDeclarativeItem(item, view);
+ }
+
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(AccessibleQtQuick1Factory)
+Q_EXPORT_PLUGIN2(qtaccessibleqtquick1, AccessibleQtQuick1Factory)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
diff --git a/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.cpp b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.cpp
new file mode 100644
index 0000000000..202023990b
--- /dev/null
+++ b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.cpp
@@ -0,0 +1,290 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaccessibledeclarativeitem.h"
+
+#include <QtQuick1/qdeclarativeitem.h>
+#include <QtQuick1/private/qdeclarativeaccessibleattached_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QAccessibleDeclarativeItem::QAccessibleDeclarativeItem(QGraphicsObject *item, QGraphicsView *view)
+ :QDeclarativeAccessible(item)
+ ,m_item(item)
+ ,m_view(view)
+{
+
+}
+
+int QAccessibleDeclarativeItem::childCount() const
+{
+ QList<QGraphicsItem *> children = m_item->childItems();
+ return children.count();
+}
+
+QRect QAccessibleDeclarativeItem::rect() const
+{
+ QRectF sceneRect = m_item->sceneTransform().mapRect(m_item->boundingRect());
+ QPoint pos = m_view->mapFromScene(m_view->mapToGlobal(sceneRect.topLeft().toPoint()));
+ QSize size = sceneRect.size().toSize();
+ return QRect(pos, size);
+}
+
+QRect QAccessibleDeclarativeItem::viewRect() const
+{
+ QPoint screenPos = m_view->mapToGlobal(m_view->pos());
+ return QRect(screenPos, m_view->size());
+}
+
+bool QAccessibleDeclarativeItem::clipsChildren() const
+{
+ return static_cast<QDeclarativeItem *>(m_item)->clip();
+}
+
+static inline bool isAncestor(const QObject *ancestorCandidate, const QObject *child)
+{
+ while (child) {
+ if (child == ancestorCandidate)
+ return true;
+ child = child->parent();
+ }
+ return false;
+}
+
+
+QAccessibleInterface *QAccessibleDeclarativeItem::parent() const
+{
+ QGraphicsItem *parent = m_item->parentItem();
+ QGraphicsObject *parentObj = parent ? parent->toGraphicsObject() : 0;
+ if (parent && !parentObj)
+ qWarning("Can not make QGraphicsItems accessible");
+ QAccessibleInterface *ancestor = (parentObj
+ ? new QAccessibleDeclarativeItem(parentObj, m_view)
+ : QAccessible::queryAccessibleInterface(m_view));
+ return ancestor;
+}
+
+QAccessibleInterface *QAccessibleDeclarativeItem::child(int index) const
+{
+ QList<QGraphicsItem *> children = m_item->childItems();
+
+ if (index >= children.count())
+ return 0;
+
+ QGraphicsItem *child = children.at(index);
+ QGraphicsObject *childObject = qobject_cast<QGraphicsObject *>(child);
+ if (!childObject)
+ return 0;
+
+ return new QAccessibleDeclarativeItem(childObject, m_view);
+}
+
+int QAccessibleDeclarativeItem::navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const
+{
+ //qDebug() << "QAccessibleDeclarativeItem navigate" << rel << entry;
+ Q_ASSERT(entry >= 0);
+
+ *target = 0;
+ if (entry == 0) {
+ *target = new QAccessibleDeclarativeItem(m_item->toGraphicsObject(), m_view);
+ return 0;
+ }
+
+ switch (rel) {
+ case QAccessible::Child: {
+ QList<QGraphicsItem *> children = m_item->childItems();
+ const int childIndex = entry - 1;
+
+ if (childIndex >= children.count())
+ return -1;
+
+ QGraphicsItem *child = children.at(childIndex);
+ QGraphicsObject *childObject = qobject_cast<QGraphicsObject *>(child);
+ if (!childObject)
+ return -1;
+
+ *target = new QAccessibleDeclarativeItem(childObject, m_view);
+ return 0;
+ break;}
+ case QAccessible::Ancestor: {
+ Q_ASSERT(entry >= 1);
+ QGraphicsItem *parent = m_item->parentItem();
+ QGraphicsObject *parentObj = parent ? parent->toGraphicsObject() : 0;
+ if (parent && !parentObj)
+ qWarning("Can not make QGraphicsItems accessible");
+ QAccessibleInterface *ancestor = (parentObj
+ ? new QAccessibleDeclarativeItem(parentObj, m_view)
+ : QAccessible::queryAccessibleInterface(m_view));
+ if (entry == 1) {
+ *target = ancestor;
+ return 0;
+ } else if (entry > 1) {
+ int ret = ancestor->navigate(QAccessible::Ancestor, entry - 1, target);
+ delete ancestor;
+ return ret;
+ }
+ break;}
+ case QAccessible::Sibling: {
+ QAccessibleInterface *iface = 0;
+ if (navigate(QAccessible::Ancestor, 1, &iface) == 0) {
+ if (iface) {
+ int ret = iface->navigate(QAccessible::Child, entry, target);
+ delete iface;
+ return ret;
+ }
+ }
+ return -1;
+ break;}
+ case QAccessible::FocusChild: {
+ QGraphicsObject *focusObject = 0;
+ if (m_item->hasFocus()) {
+ focusObject = m_item->toGraphicsObject();
+ } else {
+ if (QGraphicsItem *focusItem = m_view->scene()->focusItem()) {
+ if (m_item->isAncestorOf(focusItem)) {
+ focusObject = focusItem->toGraphicsObject();
+ }
+ }
+ }
+ //qDebug() << "QAccessibleDeclarativeItem navigate QAccessible::FocusChild" << rel << entry;
+ if (focusObject) {
+ *target = new QAccessibleDeclarativeItem(focusObject, m_view);
+ return 0;
+ }
+ }
+ default: break;
+ }
+
+ return -1;
+
+}
+
+int QAccessibleDeclarativeItem::indexOfChild(const QAccessibleInterface *iface) const
+{
+ // ### No QAccessibleInterfaces are created with a QGraphicsItem.
+ // However, we want to support QML, not QGraphicsView in general.
+ // And since the UI is written in QML, this means we can assume that *all*
+ // QGraphicsItems are actually QGraphicsObjects
+
+ const QGraphicsObject *childObj = static_cast<QGraphicsObject*>(iface->object());
+ if (m_item == childObj)
+ return 0;
+
+ QList<QGraphicsItem*> kids = m_item->childItems();
+ int index = kids.indexOf(const_cast<QGraphicsItem*>(static_cast<const QGraphicsItem*>(childObj)));
+ if (index != -1) {
+ ++index;
+ }
+ return index;
+}
+
+QFlags<QAccessible::StateFlag> QAccessibleDeclarativeItem::state() const
+{
+ QAccessible::State state = QAccessible::Normal;
+
+ if (m_item->hasFocus()) {
+ state |= QAccessible::Focused;
+ }
+ return state;
+}
+
+QAccessible::Role QAccessibleDeclarativeItem::role() const
+{
+ // ### Workaround for setAccessibleRole() not working.
+ // Text items are special since they are defined
+ // entirely from C++ (setting the role from QML works.)
+// if (qobject_cast<QDeclarative1Text*>(m_item))
+// return QAccessible::StaticText;
+
+ QVariant v = QDeclarativeAccessibleAttached::property(m_item, "role");
+ bool ok;
+ QAccessible::Role role = (QAccessible::Role)v.toInt(&ok);
+ if (!ok) // Not sure if this check is needed.
+ role = QAccessible::Pane;
+ return role;
+}
+
+bool QAccessibleDeclarativeItem::isAccessible() const
+{
+ return true;
+}
+
+QString QAccessibleDeclarativeItem::text(QAccessible::Text textType) const
+{
+ // handles generic behaviour not specific to an item
+ switch (textType) {
+ case QAccessible::Name: {
+ QVariant accessibleName = QDeclarativeAccessibleAttached::property(object(), "name");
+ if (!accessibleName.isNull())
+ return accessibleName.toString();
+ break;}
+ case QAccessible::Description: {
+ QVariant accessibleDecription = QDeclarativeAccessibleAttached::property(object(), "description");
+ if (!accessibleDecription.isNull())
+ return accessibleDecription.toString();
+ break;}
+ case QAccessible::Value:
+ case QAccessible::Help:
+ case QAccessible::Accelerator:
+ default:
+ break;
+ }
+
+ // the following blocks handles item-specific behaviour
+ if (role() == QAccessible::EditableText) {
+ if (textType == QAccessible::Value) {
+ QVariant text = object()->property("text");
+ return text.toString();
+ } else if (textType == QAccessible::Name) {
+ return object()->objectName();
+ }
+ } else {
+ if (textType == QAccessible::Name) {
+ QVariant text = object()->property("text");
+ return text.toString();
+ }
+ }
+
+
+ return QString();
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.h b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.h
new file mode 100644
index 0000000000..5582672aae
--- /dev/null
+++ b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QACCESSIBLEDECLARATIVEITEM_H
+#define QACCESSIBLEDECLARATIVEITEM_H
+
+#include "qdeclarativeaccessible.h"
+
+#include <QtWidgets/qgraphicsview.h>
+#include <QtWidgets/qgraphicsitem.h>
+
+QT_BEGIN_NAMESPACE
+
+class QAccessibleDeclarativeItem : public QDeclarativeAccessible
+{
+public:
+ QAccessibleDeclarativeItem(QGraphicsObject *item, QGraphicsView *view);
+
+ QRect rect() const;
+ QRect viewRect() const;
+
+ bool clipsChildren() const;
+
+ QAccessibleInterface *parent() const;
+ QAccessibleInterface *child(int index) const;
+ int childCount() const;
+ int navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const;
+ int indexOfChild(const QAccessibleInterface *iface) const;
+
+ QFlags<QAccessible::StateFlag> state() const;
+ QAccessible::Role role() const;
+ QString text(QAccessible::Text) const;
+
+ virtual bool isAccessible() const;
+private:
+ QGraphicsObject *m_item;
+ QGraphicsView *m_view;
+};
+
+QT_END_NAMESPACE
+
+#endif // QACCESSIBLEGRAPHICSVIEWIMPLEMENTATION_H
diff --git a/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.cpp b/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.cpp
new file mode 100644
index 0000000000..1aa4bef992
--- /dev/null
+++ b/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaccessibledeclarativeview.h"
+#include "qdeclarativeaccessible.h"
+#include "qaccessibledeclarativeitem.h"
+
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+QAccessibleDeclarativeView::QAccessibleDeclarativeView(QWidget *widget)
+ :QAccessibleWidget(widget)
+{
+ m_view = static_cast<QDeclarativeView *>(widget);
+}
+
+int QAccessibleDeclarativeView::childCount() const
+{
+ return 1;
+}
+
+QAccessibleInterface *QAccessibleDeclarativeView::child(int index) const
+{
+ if (index == 0) {
+ QDeclarativeItem *declarativeRoot = m_view->accessibleRootItem();
+ return new QAccessibleDeclarativeItem(declarativeRoot, m_view);
+ }
+ return 0;
+}
+
+int QAccessibleDeclarativeView::navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const
+{
+ if (rel == QAccessible::Child) {
+ *target = child(entry - 1);
+ return *target ? 0 : -1;
+ }
+ return QAccessibleWidget::navigate(rel, entry, target);
+}
+
+QAccessibleInterface *QAccessibleDeclarativeView::childAt(int x, int y) const
+{
+ return child(0); // return the top-level QML item
+}
+
+int QAccessibleDeclarativeView::indexOfChild(const QAccessibleInterface *iface) const
+{
+ if (iface) {
+ QDeclarativeItem *declarativeRoot = m_view->accessibleRootItem();
+ if (declarativeRoot == iface->object())
+ return 1;
+ }
+ return -1;
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
diff --git a/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.h b/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.h
new file mode 100644
index 0000000000..48833f932c
--- /dev/null
+++ b/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QACCESSIBLEDECLARATIVEVIEW_H
+#define QACCESSIBLEDECLARATIVEVIEW_H
+
+#include <QtGui/qaccessible2.h>
+#include <QtWidgets/qaccessiblewidget.h>
+
+#include <QtQuick1/qdeclarativeview.h>
+#include <QtQuick1/qdeclarativeitem.h>
+#include <QtWidgets/qwidget.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+class QAccessibleDeclarativeView: public QAccessibleWidget
+{
+public:
+ explicit QAccessibleDeclarativeView(QWidget *widget);
+
+ QAccessibleInterface *child(int index) const;
+ int childCount() const;
+ int navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const;
+ QAccessibleInterface *childAt(int x, int y) const;
+ int indexOfChild(const QAccessibleInterface *iface) const;
+
+private:
+ QDeclarativeView *m_view;
+};
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // QACCESSIBLEDECLARATIVEVIEW_H
diff --git a/src/plugins/accessible/qtquick1/qtquick1.pro b/src/plugins/accessible/qtquick1/qtquick1.pro
new file mode 100644
index 0000000000..f4602e4420
--- /dev/null
+++ b/src/plugins/accessible/qtquick1/qtquick1.pro
@@ -0,0 +1,22 @@
+contains(QT_CONFIG, accessibility) {
+
+TARGET = qtaccessibleqtquick1
+load(qt_plugin)
+include ($$PWD/../shared/qaccessiblebase.pri)
+
+QT += core-private gui-private widgets-private v8-private declarative-private qtquick1-private
+DESTDIR = $$QT.gui.plugins/accessible
+
+QTDIR_build:REQUIRES += "contains(QT_CONFIG, accessibility)"
+
+DEFINES+=Q_ACCESSIBLE_QUICK_ITEM_ENABLE_DEBUG_DESCRIPTION
+
+SOURCES += \
+ main.cpp \
+ qaccessibledeclarativeview.cpp \
+ qaccessibledeclarativeitem.cpp
+
+HEADERS += \
+ qaccessibledeclarativeview.h \
+ qaccessibledeclarativeitem.h
+}
diff --git a/src/plugins/accessible/quick/main.cpp b/src/plugins/accessible/quick/main.cpp
new file mode 100644
index 0000000000..8b8285e450
--- /dev/null
+++ b/src/plugins/accessible/quick/main.cpp
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qdeclarativeaccessible.h"
+#include "qaccessiblequickview.h"
+#include "qaccessiblequickitem.h"
+
+#include <QtQuick/QQuickView>
+#include <QtQuick/QQuickItem>
+
+#include <qaccessibleplugin.h>
+#include <qvariant.h>
+#include <qplugin.h>
+#include <qaccessible.h>
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+class AccessibleQuickFactory : public QAccessiblePlugin
+{
+public:
+ AccessibleQuickFactory();
+
+ QStringList keys() const;
+ QAccessibleInterface *create(const QString &classname, QObject *object);
+};
+
+AccessibleQuickFactory::AccessibleQuickFactory()
+{
+}
+
+QStringList AccessibleQuickFactory::keys() const
+{
+ QStringList list;
+ list << QLatin1String("QQuickView");
+ list << QLatin1String("QQuickItem");
+ return list;
+}
+
+QAccessibleInterface *AccessibleQuickFactory::create(const QString &classname, QObject *object)
+{
+ if (classname == QLatin1String("QQuickView")) {
+ return new QAccessibleQuickView(qobject_cast<QQuickView *>(object)); // FIXME
+ } else if (classname == QLatin1String("QQuickItem")) {
+ QQuickItem * item = qobject_cast<QQuickItem *>(object);
+ Q_ASSERT(item);
+ return new QAccessibleQuickItem(item);
+ }
+
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(AccessibleQuickFactory)
+Q_EXPORT_PLUGIN2(qtaccessiblequick, AccessibleQuickFactory)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
diff --git a/src/plugins/accessible/quick/qaccessiblequickitem.cpp b/src/plugins/accessible/quick/qaccessiblequickitem.cpp
new file mode 100644
index 0000000000..7131e110d8
--- /dev/null
+++ b/src/plugins/accessible/quick/qaccessiblequickitem.cpp
@@ -0,0 +1,292 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaccessiblequickitem.h"
+#include "QtQuick/private/qquickitem_p.h"
+#include "QtQuick/private/qquicktext_p.h"
+#include "QtQuick/private/qquickaccessibleattached_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QAccessibleQuickItem::QAccessibleQuickItem(QQuickItem *item)
+ : QDeclarativeAccessible(item)
+ , m_item(item)
+{
+}
+
+int QAccessibleQuickItem::childCount() const
+{
+ return childItems().count();
+}
+
+QRect QAccessibleQuickItem::rect() const
+{
+ // ### no canvas in some cases.
+ // ### Should we really check for 0 opacity?
+ if (!m_item->canvas() ||!m_item->isVisible() || qFuzzyIsNull(m_item->opacity())) {
+ return QRect();
+ }
+
+ QSizeF size = QSizeF(m_item->width(), m_item->height());
+ // ### If the bounding rect fails, we first try the implicit size, then we go for the
+ // parent size. WE MIGHT HAVE TO REVISIT THESE FALLBACKS.
+ if (size.isEmpty()) {
+ size = QSizeF(m_item->implicitWidth(), m_item->implicitHeight());
+ if (size.isEmpty())
+ // ### Seems that the above fallback is not enough, fallback to use the parent size...
+ size = QSizeF(m_item->parentItem()->width(), m_item->parentItem()->height());
+ }
+
+ QRectF sceneRect = m_item->mapRectToScene(QRectF(QPointF(0, 0), size));
+ QPoint screenPos = m_item->canvas()->mapToGlobal(sceneRect.topLeft().toPoint());
+
+ QRect r = QRect(screenPos, sceneRect.size().toSize());
+
+ if (!r.isValid()) {
+ qWarning() << m_item->metaObject()->className() << m_item->property("accessibleText") << r;
+ }
+ return r;
+}
+
+QRect QAccessibleQuickItem::viewRect() const
+{
+ // ### no canvas in some cases.
+ if (!m_item->canvas()) {
+ return QRect();
+ }
+
+ QQuickCanvas *canvas = m_item->canvas();
+ QPoint screenPos = canvas->mapToGlobal(QPoint(0,0));
+ return QRect(screenPos, canvas->size());
+}
+
+
+bool QAccessibleQuickItem::clipsChildren() const
+{
+ return static_cast<QQuickItem *>(m_item)->clip();
+}
+
+
+QAccessibleInterface *QAccessibleQuickItem::parent() const
+{
+ QQuickItem *parent = m_item->parentItem();
+ if (parent) {
+ QQuickCanvas *canvas = m_item->canvas();
+ // Jump out to the scene widget if the parent is the root item.
+ // There are two root items, QQuickCanvas::rootItem and
+ // QQuickView::declarativeRoot. The former is the true root item,
+ // but is not a part of the accessibility tree. Check if we hit
+ // it here and return an interface for the scene instead.
+ if (parent == canvas->rootItem()) {
+ return QAccessible::queryAccessibleInterface(canvas);
+ } else {
+ QDeclarativeAccessible *ancestor = new QAccessibleQuickItem(parent);
+ return ancestor;
+ }
+ }
+ return 0;
+}
+
+QAccessibleInterface *QAccessibleQuickItem::child(int index) const
+{
+ QList<QQuickItem *> children = childItems();
+
+ if (index < 0 || index >= children.count())
+ return 0;
+
+ QQuickItem *child = children.at(index);
+ if (!child) // FIXME can this happen?
+ return 0;
+
+ return new QAccessibleQuickItem(child);
+}
+
+int QAccessibleQuickItem::navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const
+{
+ *target = 0;
+ if (entry == 0) {
+ *target = new QAccessibleQuickItem(m_item);
+ return 0;
+ }
+
+ switch (rel) {
+ case QAccessible::Child: { // FIMXE
+ QList<QQuickItem *> children = childItems();
+ const int childIndex = entry - 1;
+
+ if (childIndex >= children.count())
+ return -1;
+
+ QQuickItem *child = children.at(childIndex);
+ if (!child)
+ return -1;
+
+ *target = new QAccessibleQuickItem(child);
+ return 0;
+ break;}
+ case QAccessible::Ancestor: { // FIMXE
+ QQuickItem *parent = m_item->parentItem();
+ if (parent) {
+ QDeclarativeAccessible *ancestor = new QAccessibleQuickItem(parent);
+ if (entry == 1) {
+ QQuickCanvas *canvas = m_item->canvas();
+ // Jump out to the scene widget if the parent is the root item.
+ // There are two root items, QQuickCanvas::rootItem and
+ // QQuickView::declarativeRoot. The former is the true root item,
+ // but is not a part of the accessibility tree. Check if we hit
+ // it here and return an interface for the scene instead.
+ if (parent == canvas->rootItem()) {
+ *target = QAccessible::queryAccessibleInterface(canvas);
+ } else {
+ *target = ancestor;
+ }
+ return 0;
+ } else if (entry > 1) {
+ int ret = ancestor->navigate(QAccessible::Ancestor, entry - 1, target);
+ delete ancestor;
+ return ret;
+ }
+ }
+ return -1;
+ break;}
+ default: break;
+ }
+
+ return -1;
+}
+
+int QAccessibleQuickItem::indexOfChild(const QAccessibleInterface *iface) const
+{
+ QList<QQuickItem*> kids = childItems();
+ int idx = kids.indexOf(static_cast<QQuickItem*>(iface->object()));
+ if (idx != -1)
+ ++idx;
+ return idx;
+}
+
+QList<QQuickItem *> QAccessibleQuickItem::childItems() const
+{
+ if (role() == QAccessible::Button)
+ return QList<QQuickItem *>();
+ return m_item->childItems();
+}
+
+QFlags<QAccessible::StateFlag> QAccessibleQuickItem::state() const
+{
+ QAccessible::State state = QAccessible::Normal;
+
+ if (m_item->hasActiveFocus()) {
+ state |= QAccessible::Focused;
+ }
+ return state;
+}
+
+
+QAccessible::Role QAccessibleQuickItem::role() const
+{
+ // Workaround for setAccessibleRole() not working for
+ // Text items. Text items are special since they are defined
+ // entirely from C++ (setting the role from QML works.)
+ if (qobject_cast<QQuickText*>(const_cast<QQuickItem *>(m_item)))
+ return QAccessible::StaticText;
+
+ QVariant v = QQuickAccessibleAttached::property(m_item, "role");
+ bool ok;
+ QAccessible::Role role = (QAccessible::Role)v.toInt(&ok);
+ if (!ok) // Not sure if this check is needed.
+ role = QAccessible::Pane;
+ return role;
+}
+
+bool QAccessibleQuickItem::isAccessible() const
+{
+ return m_item->d_func()->isAccessible;
+}
+
+QString QAccessibleQuickItem::text(QAccessible::Text textType) const
+{
+ // handles generic behavior not specific to an item
+ switch (textType) {
+ case QAccessible::Name: {
+ QVariant accessibleName = QQuickAccessibleAttached::property(object(), "name");
+ if (!accessibleName.isNull())
+ return accessibleName.toString();
+ break;}
+ case QAccessible::Description: {
+ QVariant accessibleDecription = QQuickAccessibleAttached::property(object(), "description");
+ if (!accessibleDecription.isNull())
+ return accessibleDecription.toString();
+ break;}
+#ifdef Q_ACCESSIBLE_QUICK_ITEM_ENABLE_DEBUG_DESCRIPTION
+ case QAccessible::DebugDescription: {
+ QString debugString;
+ debugString = QString::fromAscii(object()->metaObject()->className()) + QLatin1Char(' ');
+ debugString += isAccessible() ? QLatin1String("enabled") : QLatin1String("disabled");
+ return debugString;
+ break; }
+#endif
+ case QAccessible::Value:
+ case QAccessible::Help:
+ case QAccessible::Accelerator:
+ default:
+ break;
+ }
+
+ // the following blocks handles item-specific behavior
+ if (role() == QAccessible::EditableText) {
+ if (textType == QAccessible::Value) {
+ QVariant text = object()->property("text");
+ return text.toString();
+ } else if (textType == QAccessible::Name) {
+ return object()->objectName();
+ }
+ } else {
+ if (textType == QAccessible::Name) {
+ QVariant text = object()->property("text");
+ return text.toString();
+ }
+ }
+
+
+ return QString();
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/accessible/quick/qaccessiblequickitem.h b/src/plugins/accessible/quick/qaccessiblequickitem.h
new file mode 100644
index 0000000000..9782f67731
--- /dev/null
+++ b/src/plugins/accessible/quick/qaccessiblequickitem.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QACCESSIBLEQUICKITEM_H
+#define QACCESSIBLEQUICKITEM_H
+
+#include <QtQuick/QQuickItem>
+#include <QtQuick/QQuickView>
+#include "qdeclarativeaccessible.h"
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+class QAccessibleQuickItem : public QDeclarativeAccessible
+{
+public:
+ QAccessibleQuickItem(QQuickItem *item);
+
+ QRect rect() const;
+ QRect viewRect() const;
+
+ bool clipsChildren() const;
+
+ QAccessibleInterface *parent() const;
+ QAccessibleInterface *child(int index) const;
+ int childCount() const;
+ int navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const;
+ int indexOfChild(const QAccessibleInterface *iface) const;
+ QList<QQuickItem *> childItems() const;
+
+ QFlags<QAccessible::StateFlag> state() const;
+ QAccessible::Role role() const;
+ QString text(QAccessible::Text) const;
+
+ bool isAccessible() const;
+private:
+ QQuickItem *m_item;
+};
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // QACCESSIBLEQUICKITEM_H
diff --git a/src/plugins/accessible/quick/qaccessiblequickview.cpp b/src/plugins/accessible/quick/qaccessiblequickview.cpp
new file mode 100644
index 0000000000..cd4b4937ec
--- /dev/null
+++ b/src/plugins/accessible/quick/qaccessiblequickview.cpp
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaccessiblequickview.h"
+
+#include <QtQuick/qquickitem.h>
+
+#include "qaccessiblequickitem.h"
+#include "qdeclarativeaccessible.h"
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+QAccessibleQuickView::QAccessibleQuickView(QQuickView *object)
+ :QAccessibleObject(object)
+{
+ m_view = static_cast<QQuickView *>(object);
+}
+
+int QAccessibleQuickView::childCount() const
+{
+ return m_view->rootItem() ? 1 : 0;
+}
+
+QAccessibleInterface *QAccessibleQuickView::parent() const
+{
+ // FIXME: for now we assume to be a top level window...
+ return QAccessible::queryAccessibleInterface(qApp);
+}
+
+QAccessibleInterface *QAccessibleQuickView::child(int index) const
+{
+ if (index == 0) {
+ QQuickItem *declarativeRoot = m_view->rootObject();
+ return new QAccessibleQuickItem(declarativeRoot);
+ }
+ return 0;
+}
+
+QAccessible::Role QAccessibleQuickView::role() const
+{
+ return QAccessible::Window; // FIXME
+}
+
+QAccessible::State QAccessibleQuickView::state() const
+{
+ return QAccessible::Normal; // FIXME
+}
+
+QRect QAccessibleQuickView::rect() const
+{
+ return QRect(m_view->x(), m_view->y(), m_view->width(), m_view->height());
+}
+
+int QAccessibleQuickView::navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const
+{
+ switch (rel) {
+ case QAccessible::Child:
+ *target = child(entry - 1);
+ case QAccessible::Ancestor:
+ *target = parent();
+ default:
+ *target = 0;
+ }
+ return *target ? 0 : -1;
+}
+
+QString QAccessibleQuickView::text(QAccessible::Text text) const
+{
+#ifdef Q_ACCESSIBLE_QUICK_ITEM_ENABLE_DEBUG_DESCRIPTION
+ if (text == QAccessible::DebugDescription) {
+ return QString::fromAscii(object()->metaObject()->className()) ;
+ }
+#endif
+ return m_view->windowTitle();
+}
+
+QAccessibleInterface *QAccessibleQuickView::childAt(int x, int y) const
+{
+ Q_UNUSED(x);
+ Q_UNUSED(y);
+ return child(0); // return the top-level QML item
+}
+
+int QAccessibleQuickView::indexOfChild(const QAccessibleInterface *iface) const
+{
+ if (iface) {
+ QQuickItem *declarativeRoot = m_view->rootObject();
+ if (declarativeRoot == iface->object())
+ return 1;
+ }
+ return -1;
+
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
diff --git a/src/plugins/accessible/quick/qaccessiblequickview.h b/src/plugins/accessible/quick/qaccessiblequickview.h
new file mode 100644
index 0000000000..0b9b5d1f80
--- /dev/null
+++ b/src/plugins/accessible/quick/qaccessiblequickview.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QAccessibleQuickView_H
+#define QAccessibleQuickView_H
+
+#include <QtGui/qaccessible2.h>
+#include <QtGui/qaccessibleobject.h>
+#include <QtQuick/qquickview.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+class QAccessibleQuickView : public QAccessibleObject
+{
+public:
+ QAccessibleQuickView(QQuickView *object);
+
+ QAccessibleInterface *parent() const;
+ QAccessibleInterface *child(int index) const;
+
+ QAccessible::Role role() const;
+ QAccessible::State state() const;
+ QRect rect() const;
+
+ int childCount() const;
+ int navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const;
+ int indexOfChild(const QAccessibleInterface *iface) const;
+ QString text(QAccessible::Text text) const;
+ QAccessibleInterface *childAt(int x, int y) const;
+private:
+ QQuickView *m_view;
+};
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // QAccessibleQuickView_H
diff --git a/src/plugins/accessible/quick/quick.pro b/src/plugins/accessible/quick/quick.pro
new file mode 100644
index 0000000000..97a1d50098
--- /dev/null
+++ b/src/plugins/accessible/quick/quick.pro
@@ -0,0 +1,23 @@
+contains(QT_CONFIG, accessibility) {
+
+TARGET = qtaccessiblequick
+load(qt_plugin)
+include ($$PWD/../shared/qaccessiblebase.pri)
+
+QT += core-private gui-private v8-private declarative-private quick-private
+DESTDIR = $$QT.gui.plugins/accessible
+
+QTDIR_build:REQUIRES += "contains(QT_CONFIG, accessibility)"
+
+#DEFINES+=Q_ACCESSIBLE_QUICK_ITEM_ENABLE_DEBUG_DESCRIPTION
+
+SOURCES += \
+ main.cpp \
+ qaccessiblequickview.cpp \
+ qaccessiblequickitem.cpp
+
+HEADERS += \
+ qaccessiblequickview.h \
+ qaccessiblequickitem.h
+}
+
diff --git a/src/plugins/accessible/shared/qaccessiblebase.pri b/src/plugins/accessible/shared/qaccessiblebase.pri
new file mode 100644
index 0000000000..8c82705443
--- /dev/null
+++ b/src/plugins/accessible/shared/qaccessiblebase.pri
@@ -0,0 +1,7 @@
+target.path += $$[QT_INSTALL_PLUGINS]/accessible
+INSTALLS += target
+
+INCLUDEPATH += $$PWD
+DEPENDPATH += $$PWD
+SOURCES += $$PWD/qdeclarativeaccessible.cpp
+HEADERS += $$PWD/qdeclarativeaccessible.h
diff --git a/src/plugins/accessible/shared/qdeclarativeaccessible.cpp b/src/plugins/accessible/shared/qdeclarativeaccessible.cpp
new file mode 100644
index 0000000000..abe73f24ea
--- /dev/null
+++ b/src/plugins/accessible/shared/qdeclarativeaccessible.cpp
@@ -0,0 +1,172 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qnamespace.h>
+#include "qdeclarativeaccessible.h"
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+
+QString Q_GUI_EXPORT qTextBeforeOffsetFromString(int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset, const QString& text);
+QString Q_GUI_EXPORT qTextAtOffsetFromString(int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset, const QString& text);
+QString Q_GUI_EXPORT qTextAfterOffsetFromString(int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset, const QString& text);
+
+QDeclarativeAccessible::QDeclarativeAccessible(QObject *object)
+ :QAccessibleObject(object)
+{
+}
+
+QDeclarativeAccessible::~QDeclarativeAccessible()
+{
+}
+
+QFlags<QAccessible::RelationFlag> QDeclarativeAccessible::relationTo(const QAccessibleInterface *) const
+{
+ return QAccessible::Unrelated;
+}
+
+QAccessibleInterface *QDeclarativeAccessible::childAt(int x, int y) const
+{
+ // Look for children first.
+ // Start with the last child first, because children are ordered in paint order
+ // (which is opposite of hit test order)
+
+ // If the item clips its children, we can return early if the coordinate is outside its rect
+ if (clipsChildren()) {
+ if (!rect().contains(x, y))
+ return 0;
+ }
+
+ for (int i = childCount() - 1; i >= 0; --i) {
+ QAccessibleInterface *childIface = child(i);
+ if (childIface && !(childIface->state() & QAccessible::Invisible)) {
+ if (childIface->rect().contains(x, y))
+ return childIface;
+ }
+ }
+ return 0;
+}
+
+QFlags<QAccessible::StateFlag> QDeclarativeAccessible::state() const
+{
+ QAccessible::State state;// = state();
+
+ //QRect viewRect(QPoint(0, 0), m_implementation->size());
+ //QRect itemRect(m_item->scenePos().toPoint(), m_item->boundingRect().size().toSize());
+
+ QRect viewRect_ = viewRect();
+ QRect itemRect = rect();
+
+ // qDebug() << "viewRect" << viewRect << "itemRect" << itemRect;
+ // error case:
+ if (viewRect_.isNull() || itemRect.isNull()) {
+ state |= QAccessible::Invisible;
+ }
+
+ if (!viewRect_.intersects(itemRect)) {
+ state |= QAccessible::Offscreen;
+ // state |= QAccessible::Invisible; // no set at this point to ease development
+ }
+
+ if (!object()->property("visible").toBool() || qFuzzyIsNull(object()->property("opacity").toDouble())) {
+ state |= QAccessible::Invisible;
+ }
+
+ if ((role() == QAccessible::CheckBox || role() == QAccessible::RadioButton) && object()->property("checked").toBool()) {
+ state |= QAccessible::Checked;
+ }
+
+ if (role() == QAccessible::EditableText)
+ state |= QAccessible::Focusable;
+
+ //qDebug() << "state?" << m_item->property("state").toString() << m_item->property("status").toString() << m_item->property("visible").toString();
+
+ return state;
+}
+
+QStringList QDeclarativeAccessible::actionNames() const
+{
+ QStringList actions;
+ switch (role()) {
+ case QAccessible::PushButton:
+ actions << QAccessibleActionInterface::pressAction();
+ break;
+ case QAccessible::RadioButton:
+ case QAccessible::CheckBox:
+ actions << QAccessibleActionInterface::checkAction();
+ break;
+ default:
+ break;
+ }
+ return actions;
+}
+
+void QDeclarativeAccessible::doAction(const QString &actionName)
+{
+ if (role() == QAccessible::PushButton && actionName == QAccessibleActionInterface::pressAction()) {
+ QMetaObject::invokeMethod(object(), "accessibleAction");
+ }
+ if ((role() == QAccessible::CheckBox || role() == QAccessible::RadioButton) && actionName == QAccessibleActionInterface::checkAction()) {
+ bool checked = object()->property("checked").toBool();
+ object()->setProperty("checked", QVariant(!checked));
+ }
+}
+
+QStringList QDeclarativeAccessible::keyBindingsForAction(const QString &actionName) const
+{
+ Q_UNUSED(actionName)
+ return QStringList();
+}
+
+QVariant QDeclarativeAccessible::invokeMethod(QAccessible::Method method, const QVariantList&)
+{
+ Q_UNUSED(method)
+ return QVariant();
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
diff --git a/src/plugins/accessible/shared/qdeclarativeaccessible.h b/src/plugins/accessible/shared/qdeclarativeaccessible.h
new file mode 100644
index 0000000000..16b61508c0
--- /dev/null
+++ b/src/plugins/accessible/shared/qdeclarativeaccessible.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVEACCESSIBLE_H
+#define QDECLARATIVEACCESSIBLE_H
+
+#include <QtGui/qaccessibleobject.h>
+#include <QtGui/qaccessible2.h>
+//#include <QtQuick1/qdeclarativeview.h>
+//#include <QtQuick1/qdeclarativeitem.h>
+#include <QtDeclarative/qdeclarativeproperty.h>
+
+//#include <private/qdeclarativeaccessible_p.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+/*
+ -- Declarative Accessibility Overview. --
+
+ * Item interface classes:
+ QAccessibleDeclarativeItem for QtQuick1
+ QAccessibleQuickItem for for QtQuick2
+ Common base class: QDeclarativeAccessible
+
+ * View interface classes.
+
+ These are the root of the QML accessible tree and connects it to the widget hierarchy.
+
+ QAccessbileDeclarativeView is the root for the QGraphicsView implementation
+ QAccessbileQuickView is the root for the SceneGraph implementation
+
+*/
+class QDeclarativeAccessible: public QAccessibleObject, public QAccessibleActionInterface
+{
+public:
+ ~QDeclarativeAccessible();
+
+ virtual QRect viewRect() const = 0;
+ QFlags<QAccessible::RelationFlag> relationTo(const QAccessibleInterface*) const;
+ QAccessibleInterface *childAt(int, int) const;
+ QFlags<QAccessible::StateFlag> state() const;
+ QVariant invokeMethod(QAccessible::Method, const QVariantList &);
+
+ QStringList actionNames() const;
+ void doAction(const QString &actionName);
+ QStringList keyBindingsForAction(const QString &actionName) const;
+
+protected:
+ virtual bool clipsChildren() const = 0;
+ // For subclasses, use instantiateObject factory method outside the class.
+ QDeclarativeAccessible(QObject *object);
+};
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // QDECLARATIVEACCESSIBLE_H
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index 664a457608..ae42ba1ba4 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -1,2 +1,3 @@
TEMPLATE = subdirs
SUBDIRS += qmltooling
+SUBDIRS += accessible