Cocoa: Handle accessible interface children.
authorMorten Johan Sorvig <morten.sorvig@nokia.com>
Thu, 1 Dec 2011 08:39:25 +0000 (09:39 +0100)
committerQt by Nokia <qt-info@nokia.com>
Fri, 2 Dec 2011 10:13:15 +0000 (11:13 +0100)
Implement AccessIbleChildrenAttribute and
accessiblityHitTest.

Change-Id: Ia9fa80e3015edbb969d173a2587cb53b9c69852e
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@nokia.com>
src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm

index 4ce4130..332577d 100644 (file)
@@ -105,6 +105,7 @@ static QAccessibleInterface *acast(void *ptr)
         attributes = [[NSArray alloc] initWithObjects:
         NSAccessibilityRoleAttribute,
         NSAccessibilityRoleDescriptionAttribute,
+        NSAccessibilityChildrenAttribute,
         NSAccessibilityFocusedAttribute,
         NSAccessibilityParentAttribute,
         NSAccessibilityWindowAttribute,
@@ -122,6 +123,16 @@ static QAccessibleInterface *acast(void *ptr)
         return role;
     } else if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute]) {
         return NSAccessibilityRoleDescription(role, nil);
+    } else if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) {
+        int numKids = acast(accessibleInterface)->childCount();
+
+        NSMutableArray *kids = [NSMutableArray arrayWithCapacity:numKids];
+        for (int i = 0; i < numKids; ++i) {
+            QAccessibleInterface *childInterface = acast(accessibleInterface)->child(i);
+            [kids addObject:[QCocoaAccessibleElement elementWithIndex:i parent:self accessibleInterface:(void*)childInterface]];
+        }
+
+        return NSAccessibilityUnignoredChildren(kids);
     } else if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) {
         // Just check if the app thinks we're focused.
         id focusedElement = [NSApp accessibilityAttributeValue:NSAccessibilityFocusedUIElementAttribute];
@@ -186,8 +197,22 @@ static QAccessibleInterface *acast(void *ptr)
 }
 
 - (id)accessibilityHitTest:(NSPoint)point {
-    Q_UNUSED(point);
-    return NSAccessibilityUnignoredAncestor(self);
+    int index = acast(accessibleInterface)->childAt(point.x, qt_mac_flipYCoordinate(point.y));
+
+    // hit outside
+    if (index == -1) {
+        return 0;
+    }
+
+    // hit this element
+    if (index == 0) {
+        return NSAccessibilityUnignoredAncestor(self);
+    }
+
+    // hit a child, forward to child accessible interface.
+    QAccessibleInterface *childInterface = acast(accessibleInterface)->child(index - 1);
+    QCocoaAccessibleElement *accessibleElement = [QCocoaAccessibleElement elementWithIndex:index - 1 parent:self accessibleInterface: childInterface];
+    return [accessibleElement accessibilityHitTest:point];
 }
 
 - (id)accessibilityFocusedUIElement {