summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2014-03-17 19:13:08 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-20 12:49:18 +0100
commit200cc1f1e9aded9fb891e9af0699887c04a465a2 (patch)
tree6665e7d81e566103dbfc84dc5d34b3421c40a0d7
parentae13c4e3779163a8db5fbf7d3069913a1505bb1b (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.mm94
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;