diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-03-17 19:13:08 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-20 12:49:18 +0100 |
commit | 200cc1f1e9aded9fb891e9af0699887c04a465a2 (patch) | |
tree | 6665e7d81e566103dbfc84dc5d34b3421c40a0d7 | |
parent | ae13c4e3779163a8db5fbf7d3069913a1505bb1b (diff) |
Accessibility Mac: Fix TextEdit
[ChangeLog][QtGui][Accessibility] Implemented text attributes to
enable VoiceOver to read QTextEdit and QPlainTextEdit.
Task-number: QTBUG-37204
Change-Id: Ie2fa8086a1bcf4907ac59850dc5c6c08b5f0b7f2
Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm index 66c7727f15..d32170ab01 100644 --- a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm +++ b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm @@ -121,6 +121,19 @@ [attributes addObject : NSAccessibilityValueAttribute]; } + if (iface->textInterface()) { + [attributes addObjectsFromArray: [[NSArray alloc] initWithObjects: + NSAccessibilityNumberOfCharactersAttribute, + NSAccessibilitySelectedTextAttribute, + NSAccessibilitySelectedTextRangeAttribute, + NSAccessibilityVisibleCharacterRangeAttribute, + NSAccessibilityInsertionPointLineNumberAttribute, + nil + ]]; + +// TODO: multi-selection: NSAccessibilitySelectedTextRangesAttribute, + } + return [attributes autorelease]; } @@ -167,6 +180,87 @@ return nil; return QCocoaAccessible::getValueAttribute(iface); + + } else if ([attribute isEqualToString:NSAccessibilityNumberOfCharactersAttribute]) { + if (QAccessibleTextInterface *text = iface->textInterface()) + return [NSNumber numberWithInt: text->characterCount()]; + return nil; + } else if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute]) { + if (QAccessibleTextInterface *text = iface->textInterface()) { + int start = 0; + int end = 0; + text->selection(0, &start, &end); + return text->text(start, end).toNSString(); + } + return nil; + } else if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) { + if (QAccessibleTextInterface *text = iface->textInterface()) { + int start = 0; + int end = 0; + if (text->selectionCount() > 0) { + text->selection(0, &start, &end); + } else { + start = text->cursorPosition(); + end = start; + } + return [NSValue valueWithRange:NSMakeRange(quint32(start), quint32(end - start))]; + } + return [NSValue valueWithRange: NSMakeRange(0, 0)]; + } else if ([attribute isEqualToString:NSAccessibilityVisibleCharacterRangeAttribute]) { + // FIXME This is not correct and may mostly impact performance for big texts + return [NSValue valueWithRange: NSMakeRange(0, iface->textInterface()->characterCount())]; + + } else if ([attribute isEqualToString:NSAccessibilityInsertionPointLineNumberAttribute]) { + // FIXME + return nil; + } else if ([attribute isEqualToString:NSAccessibilitySelectedTextRangesAttribute]) { + // FIXME for multi-selection support + return nil; + } + + return nil; +} + +- (NSArray *)accessibilityParameterizedAttributeNames { + + QAccessibleInterface *iface = QAccessible::accessibleInterface(axid); + if (!iface) { + qWarning() << "Called attribute on invalid object: " << axid; + return nil; + } + + if (iface->textInterface()) { + return [[NSArray alloc] initWithObjects: + NSAccessibilityStringForRangeParameterizedAttribute, +// NSAccessibilityLineForIndexParameterizedAttribute, +// NSAccessibilityRangeForLineParameterizedAttribute, +// NSAccessibilityRangeForPositionParameterizedAttribute, +// NSAccessibilityRangeForIndexParameterizedAttribute, +// NSAccessibilityBoundsForRangeParameterizedAttribute, +// NSAccessibilityRTFForRangeParameterizedAttribute, +// NSAccessibilityStyleRangeForIndexParameterizedAttribute, +// NSAccessibilityAttributedStringForRangeParameterizedAttribute, + nil + ]; + } + + return nil; +} + +- (id)accessibilityAttributeValue:(NSString *)attribute forParameter:(id)parameter { + QAccessibleInterface *iface = QAccessible::accessibleInterface(axid); + if (!iface) { + qWarning() << "Called attribute on invalid object: " << axid; + return nil; + } + + if (!iface->textInterface()) + return nil; + + if ([attribute isEqualToString: NSAccessibilityStringForRangeParameterizedAttribute]) { + NSRange range = [parameter rangeValue]; + QString text = iface->textInterface()->text(range.location, range.location + range.length); + return text.toNSString(); } return nil; |