summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
diff options
context:
space:
mode:
authorMorten Sorvig <morten.sorvig@nokia.com>2011-10-11 11:04:59 +0200
committerQt by Nokia <qt-info@nokia.com>2011-10-19 03:04:40 +0200
commit946805f07f9f8270d60df58f07bd8836b76d7258 (patch)
treec9b6901a509d456d0d71784034640f6f1063b32f /src/plugins/platforms/cocoa/qnsviewaccessibility.mm
parentd884f24fe1b86bbd71d62584d5cf1381355efe0d (diff)
Cocoa: Add initial accessibility implementation.
See qcocoaaccessiblity.h for details. For now only the first level of the hierarchy is made accessible. Also add tools/accessibilityinspector which is an utility for inspecting and debugging the Qt accessibility tree. Change-Id: Iff520bec26b3761feb0c2e00471feb379daaa735 Reviewed-by: Morten Johan Sørvig <morten.sorvig@nokia.com>
Diffstat (limited to 'src/plugins/platforms/cocoa/qnsviewaccessibility.mm')
-rw-r--r--src/plugins/platforms/cocoa/qnsviewaccessibility.mm117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/plugins/platforms/cocoa/qnsviewaccessibility.mm b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
new file mode 100644
index 0000000000..327bace123
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** 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 plugins 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 <Carbon/Carbon.h>
+
+#include "qnsview.h"
+#include "qcocoahelpers.h"
+#include "qcocoaaccessibility.h"
+#include "qcocoaaccessibilityelement.h"
+
+#include "QAccessibleActionInterface"
+#include <QtCore/QDebug>
+
+#import <AppKit/NSAccessibility.h>
+
+@implementation QNSView (QNSViewAccessibility)
+
+- (BOOL)accessibilityIsIgnored {
+ return NO;
+}
+
+- (id)accessibilityAttributeValue:(NSString *)attribute {
+ if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) {
+ if (m_accessibleRoot)
+ return macRole(m_accessibleRoot->role());
+ return NSAccessibilityUnknownRole;
+ } else if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute]) {
+ return NSAccessibilityRoleDescriptionForUIElement(self);
+ } else if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) {
+ if (!m_accessibleRoot)
+ return [super accessibilityAttributeValue:attribute];
+
+ // Create QCocoaAccessibleElements for each child if the
+ // root accessible interface.
+ int numKids = m_accessibleRoot->childCount();
+ NSMutableArray *kids = [NSMutableArray arrayWithCapacity:numKids];
+ for (int i = 0; i < numKids; ++i) {
+ [kids addObject:[QCocoaAccessibleElement elementWithIndex:i parent:self accessibleInterface:(void*)m_accessibleRoot->child(i)]];
+ }
+
+ return NSAccessibilityUnignoredChildren(kids);
+ } else {
+ return [super accessibilityAttributeValue:attribute];
+ }
+}
+
+- (id)accessibilityHitTest:(NSPoint)point {
+ NSPoint windowPoint = [[self window] convertScreenToBase:point];
+ NSPoint localPoint = [self convertPoint:windowPoint fromView:nil];
+
+ int index = -1;
+ if (m_accessibleRoot) {
+ index = m_accessibleRoot->childAt(point.x, qt_mac_flipYCoordinate(point.y));
+
+ // qDebug() << "root rect" << m_accessibleRoot->rect();
+ // qDebug() << "hit screen" << point.x << qt_mac_flipYCoordinate(point.y) << index;
+ // if (index > 0) {
+ // qDebug() << "child name" << m_accessibleRoot->child(index - 1)->text(QAccessible::Name);
+ // qDebug() << "child rect" << m_accessibleRoot->child(index - 1)->rect();
+ // }
+ }
+
+ // hit outside
+ if (index == -1) {
+ return [super accessibilityHitTest:point];
+ }
+
+ // hit the NSView / top-level window
+ if (index == 0) {
+ QCocoaAccessibleElement *accessibleElement = [QCocoaAccessibleElement elementWithIndex:index parent:self accessibleInterface:(void*)m_accessibleRoot];
+ return [accessibleElement accessibilityHitTest:point];
+ }
+
+ // hit a child, forward to child accessible interface.
+ QCocoaAccessibleElement *accessibleElement = [QCocoaAccessibleElement elementWithIndex:index - 1 parent:self accessibleInterface:(void*)m_accessibleRoot->child(index -1)];
+ return [accessibleElement accessibilityHitTest:point];
+}
+
+@end