Revision: 3843
http://skim-app.svn.sourceforge.net/skim-app/?rev=3843&view=rev
Author: hofman
Date: 2008-05-04 14:27:07 -0700 (Sun, 04 May 2008)
Log Message:
-----------
Reimplement accessibility for pdfview. Don't add a child for the main text
content, implement missing for RTFForRange and RangeForPosition parameterized
attributes. Use AXTextArea instead of AXStaticText forthe role. All this
implements support for the dictionary popup.
Modified Paths:
--------------
trunk/PDFDisplayView_SKExtensions.h
trunk/PDFDisplayView_SKExtensions.m
trunk/SKPDFView.m
Modified: trunk/PDFDisplayView_SKExtensions.h
===================================================================
--- trunk/PDFDisplayView_SKExtensions.h 2008-05-03 18:20:22 UTC (rev 3842)
+++ trunk/PDFDisplayView_SKExtensions.h 2008-05-04 21:27:07 UTC (rev 3843)
@@ -38,19 +38,3 @@
#import <Cocoa/Cocoa.h>
#import <Quartz/Quartz.h>
-
[EMAIL PROTECTED] SKPDFView, PDFAnnotation;
-
[EMAIL PROTECTED] PDFDisplayView : NSView
-- (void)passwordEntered:(id)sender;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] PDFDisplayView (SKExtensions)
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] SKAccessibilityPDFDisplayViewElement : NSObject {
- id parent;
-}
-+ (id)elementWithParent:(id)aParent;
-- (id)initWithParent:(id)aParent;
[EMAIL PROTECTED]
Modified: trunk/PDFDisplayView_SKExtensions.m
===================================================================
--- trunk/PDFDisplayView_SKExtensions.m 2008-05-03 18:20:22 UTC (rev 3842)
+++ trunk/PDFDisplayView_SKExtensions.m 2008-05-04 21:27:07 UTC (rev 3843)
@@ -43,26 +43,40 @@
#import "SKStringConstants.h"
#import "OBUtilities.h"
-static IMP originalAccessibilityAttributeNames = NULL;
-static IMP originalAccessibilityAttributeValue = NULL;
-static IMP originalAccessibilityHitTest = NULL;
-static IMP originalAccessibilityFocusedUIElement = NULL;
[EMAIL PROTECTED] PDFDisplayView : NSView
+- (void)passwordEntered:(id)sender;
+- (NSRange)accessibilityRangeForSelection:(id)selection;
+- (id)selectionForAccessibilityRange:(NSRange)range;
+- (void)generateAccessibilityTable;
[EMAIL PROTECTED]
[EMAIL PROTECTED] PDFDisplayView (SKExtensions)
[EMAIL PROTECTED]
+
@implementation PDFDisplayView (SKExtensions)
static IMP originalResetCursorRects = NULL;
static IMP originalPasswordEntered = NULL;
-- (SKPDFView *)skpdfView {
+static IMP originalAccessibilityAttributeNames = NULL;
+static IMP originalAccessibilityParameterizedAttributeNames = NULL;
+static IMP originalAccessibilityAttributeValue = NULL;
+static IMP originalAccessibilityAttributeValueForParameter = NULL;
+static IMP originalAccessibilityHitTest = NULL;
+static IMP originalAccessibilityFocusedUIElement = NULL;
+
+- (id)skPdfView {
id pdfView = nil;
@try { pdfView = [self valueForKey:@"pdfView"]; }
@catch (id exception) {}
- return [pdfView isKindOfClass:[SKPDFView class]] ? pdfView : nil;
+ return pdfView;
}
- (void)replacementResetCursorRects {
originalResetCursorRects(self, _cmd);
- [[self skpdfView] resetHoverRects];
+ id pdfView = [self skPdfView];
+ if ([pdfView respondsToSelector:@selector(resetHoverRects)])
+ [pdfView resetHoverRects];
}
- (void)replacementPasswordEntered:(id)sender {
@@ -75,48 +89,82 @@
#pragma mark Accessibility
- (NSArray *)replacementAccessibilityAttributeNames {
- if ([self skpdfView]) {
- static NSArray *attributes = nil;
- if (attributes == nil)
- attributes = [[originalAccessibilityAttributeNames(self, _cmd)
arrayByAddingObject:NSAccessibilityChildrenAttribute] retain];
- return attributes;
+ static NSArray *attributes = nil;
+ if (attributes == nil)
+ attributes = [[originalAccessibilityAttributeNames(self, _cmd)
arrayByAddingObject:NSAccessibilityChildrenAttribute] retain];
+ return attributes;
+}
+
+- (NSArray *)replacementAccessibilityParameterizedAttributeNames {
+ static NSArray *attributes = nil;
+ if (attributes == nil)
+ attributes = [[originalAccessibilityParameterizedAttributeNames(self,
_cmd) arrayByAddingObjectsFromArray:[NSArray
arrayWithObjects:NSAccessibilityRangeForPositionParameterizedAttribute,
NSAccessibilityRTFForRangeParameterizedAttribute, nil]] retain];
+ return attributes;
+}
+
+- (id)replacementAccessibilityAttributeValue:(NSString *)attribute {
+ if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) {
+ return NSAccessibilityTextAreaRole;
+ } else if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) {
+ id pdfView = [self skPdfView];
+ return [pdfView respondsToSelector:@selector(accessibilityChildren)] ?
NSAccessibilityUnignoredChildren([pdfView accessibilityChildren]) :
originalAccessibilityAttributeValue(self, _cmd, attribute);
} else {
- return originalAccessibilityAttributeNames(self, _cmd);
+ return originalAccessibilityAttributeValue(self, _cmd, attribute);
}
}
-- (id)replacementAccessibilityAttributeValue:(NSString *)attribute {
- SKPDFView *pdfView = [self skpdfView];
- if (pdfView) {
- if ([attribute isEqualToString:NSAccessibilityRoleAttribute])
- return NSAccessibilityGroupRole;
- else if ([attribute
isEqualToString:NSAccessibilityRoleDescriptionAttribute])
- return NSAccessibilityRoleDescription(NSAccessibilityGroupRole,
nil);
- else if ([attribute isEqualToString:NSAccessibilityChildrenAttribute])
- return NSAccessibilityUnignoredChildren([pdfView
accessibilityChildren]);
+- (id)replacementAccessibilityAttributeValue:(NSString *)attribute
forParameter:(id)parameter {
+ id value = originalAccessibilityAttributeValueForParameter(self, _cmd,
attribute, parameter);
+ if (value == nil) {
+ if ([attribute
isEqualToString:NSAccessibilityRangeForPositionParameterizedAttribute] && [self
respondsToSelector:@selector(accessibilityRangeForSelection:)]) {
+ id pdfView = [self skPdfView];
+ if (pdfView) {
+ NSPoint point = [pdfView convertPoint:[[pdfView window]
convertScreenToBase:[parameter pointValue]] fromView:nil];
+ PDFPage *page = [pdfView pageForPoint:point nearest:NO];
+ if (page) {
+ int i = [page characterIndexAtPoint:[pdfView
convertPoint:point toPage:page]];
+ if (i != -1) {
+ @try {
+ if ([[self valueForKey:@"numAccessibilityLines"]
unsignedIntValue] == 0 && [self
respondsToSelector:@selector(generateAccessibilityTable)])
+ [self generateAccessibilityTable];
+ }
+ @catch (id exception) {}
+ value = [NSValue valueWithRange:[self
accessibilityRangeForSelection:[page selectionForRange:NSMakeRange(i, 1)]]];
+ }
+ }
+ }
+ } else if ([attribute
isEqualToString:NSAccessibilityRTFForRangeParameterizedAttribute] && [self
respondsToSelector:@selector(selectionForAccessibilityRange:)]) {
+ @try {
+ if ([[self valueForKey:@"numAccessibilityLines"]
unsignedIntValue] == 0 && [self
respondsToSelector:@selector(generateAccessibilityTable)])
+ [self generateAccessibilityTable];
+ }
+ @catch (id exception) {}
+ NSAttributedString *attributedString = [[self
selectionForAccessibilityRange:[parameter rangeValue]] attributedString];
+ value = [attributedString RTFFromRange:NSMakeRange(0,
[attributedString length]) documentAttributes:NULL];
+ }
}
- return originalAccessibilityAttributeValue(self, _cmd, attribute);
+ return value;
}
- (id)replacementAccessibilityHitTest:(NSPoint)point {
- SKPDFView *pdfView = [self skpdfView];
- if (pdfView)
- return [pdfView accessibilityChildAtPoint:point];
- else
- return originalAccessibilityHitTest(self, _cmd, point);
+ id pdfView = [self skPdfView];
+ id element = nil;
+ if ([pdfView respondsToSelector:@selector(accessibilityChildAtPoint:)])
+ element = [pdfView accessibilityChildAtPoint:point];
+ return element ? element : originalAccessibilityHitTest(self, _cmd, point);
}
- (id)replacementAccessibilityFocusedUIElement {
- SKPDFView *pdfView = [self skpdfView];
- if (pdfView)
- return [pdfView accessibilityFocusedChild];
- else
- return originalAccessibilityFocusedUIElement(self, _cmd);
+ id pdfView = [self skPdfView];
+ id element = nil;
+ if ([pdfView respondsToSelector:@selector(accessibilityFocusedChild)])
+ element = [pdfView accessibilityFocusedChild];
+ return element ? element : originalAccessibilityFocusedUIElement(self,
_cmd);
}
- (NSRect)screenRectForRepresentedObject:(id)annotation {
NSRect rect = NSZeroRect;
- SKPDFView *pdfView = [self skpdfView];
+ SKPDFView *pdfView = [self skPdfView];
if (pdfView) {
rect = [pdfView convertRect:[pdfView convertRect:[annotation bounds]
fromPage:[annotation page]] toView:nil];
rect.origin = [[pdfView window] convertBaseToScreen:rect.origin];
@@ -125,11 +173,11 @@
}
- (BOOL)isRepresentedObjectFocused:(id)annotation {
- return [[self skpdfView] activeAnnotation] == annotation;
+ return [[self skPdfView] activeAnnotation] == annotation;
}
- (void)setFocused:(BOOL)focused forRepresentedObject:(id)annotation {
- SKPDFView *pdfView = [self skpdfView];
+ SKPDFView *pdfView = [self skPdfView];
if (pdfView) {
if (focused)
[pdfView setActiveAnnotation:annotation];
@@ -139,7 +187,7 @@
}
- (void)pressRepresentedObject:(id)annotation {
- SKPDFView *pdfView = [self skpdfView];
+ SKPDFView *pdfView = [self skPdfView];
if (pdfView) {
if ([pdfView activeAnnotation] != annotation)
[pdfView setActiveAnnotation:annotation];
@@ -153,8 +201,12 @@
originalPasswordEntered =
OBReplaceMethodImplementationWithSelector(self, @selector(passwordEntered:),
@selector(replacementPasswordEntered:));
if ([self
instancesRespondToSelector:@selector(accessibilityAttributeNames)])
originalAccessibilityAttributeNames =
OBReplaceMethodImplementationWithSelector(self,
@selector(accessibilityAttributeNames),
@selector(replacementAccessibilityAttributeNames));
+ if ([self
instancesRespondToSelector:@selector(accessibilityParameterizedAttributeNames)])
+ originalAccessibilityParameterizedAttributeNames =
OBReplaceMethodImplementationWithSelector(self,
@selector(accessibilityParameterizedAttributeNames),
@selector(replacementAccessibilityParameterizedAttributeNames));
if ([self
instancesRespondToSelector:@selector(accessibilityAttributeValue:)])
originalAccessibilityAttributeValue =
OBReplaceMethodImplementationWithSelector(self,
@selector(accessibilityAttributeValue:),
@selector(replacementAccessibilityAttributeValue:));
+ if ([self
instancesRespondToSelector:@selector(accessibilityAttributeValue:forParameter:)])
+ originalAccessibilityAttributeValueForParameter =
OBReplaceMethodImplementationWithSelector(self,
@selector(accessibilityAttributeValue:forParameter:),
@selector(replacementAccessibilityAttributeValue:forParameter:));
if ([self instancesRespondToSelector:@selector(accessibilityHitTest:)])
originalAccessibilityHitTest =
OBReplaceMethodImplementationWithSelector(self,
@selector(accessibilityHitTest:), @selector(replacementAccessibilityHitTest:));
if ([self
instancesRespondToSelector:@selector(accessibilityFocusedUIElement)])
@@ -162,102 +214,3 @@
}
@end
-
-#pragma mark -
-
[EMAIL PROTECTED] SKAccessibilityPDFDisplayViewElement
-
-+ (id)elementWithParent:(id)aParent {
- return [[[self alloc] initWithParent:aParent] autorelease];
-}
-
-- (id)initWithParent:(id)aParent {
- if (self = [super init]) {
- parent = [aParent retain];
- }
- return self;
-}
-
-- (void)dealloc {
- [parent release];
- [super dealloc];
-}
-
-- (BOOL)isEqual:(id)object {
- if ([object isKindOfClass:[SKAccessibilityPDFDisplayViewElement class]]) {
- SKAccessibilityPDFDisplayViewElement *other =
(SKAccessibilityPDFDisplayViewElement *)object;
- return parent == other->parent;
- } else {
- return NO;
- }
-}
-
-- (unsigned int)hash {
- return [parent hash];
-}
-
-- (NSArray *)accessibilityAttributeNames {
- if (originalAccessibilityAttributeNames != NULL)
- return originalAccessibilityAttributeNames(parent, _cmd);
- else if ([parent respondsToSelector:_cmd])
- return [parent accessibilityAttributeNames];
- else
- return [NSArray array];
-}
-
-- (id)accessibilityAttributeValue:(NSString *)attribute {
- if ([attribute isEqualToString:NSAccessibilityParentAttribute])
- return NSAccessibilityUnignoredAncestor(parent);
- else if (originalAccessibilityAttributeValue != NULL)
- return originalAccessibilityAttributeValue(parent, _cmd, attribute);
- else if ([parent respondsToSelector:_cmd])
- return [parent accessibilityAttributeValue:attribute];
- else
- return nil;
-}
-
-- (BOOL)accessibilityIsAttributeSettable:(NSString *)attribute {
- return [parent respondsToSelector:_cmd] && [parent
accessibilityIsAttributeSettable:attribute];
-}
-
-- (void)accessibilitySetValue:(id)value forAttribute:(NSString *)attribute {
- if ([parent respondsToSelector:_cmd])
- [parent accessibilitySetValue:value forAttribute:attribute];
- if ([attribute isEqualToString:NSAccessibilityFocusedAttribute] && [value
boolValue] && [[parent skpdfView] activeAnnotation])
- [[parent skpdfView] setActiveAnnotation:nil];
-}
-
-- (NSArray *)accessibilityParameterizedAttributeNames {
- return [parent respondsToSelector:_cmd] ? [parent
accessibilityParameterizedAttributeNames] : [NSArray array];
-}
-
-- (id)accessibilityAttributeValue:(NSString *)attribute
forParameter:(id)parameter {
- return [parent respondsToSelector:_cmd] ? [parent
accessibilityAttributeValue:attribute forParameter:parameter] : nil;
-}
-
-- (BOOL)accessibilityIsIgnored {
- return NO;
-}
-
-- (id)accessibilityHitTest:(NSPoint)point {
- return NSAccessibilityUnignoredAncestor(self);
-}
-
-- (id)accessibilityFocusedUIElement {
- return NSAccessibilityUnignoredAncestor(self);
-}
-
-- (NSArray *)accessibilityActionNames {
- return [parent respondsToSelector:_cmd] ? [parent
accessibilityActionNames] : [NSArray array];
-}
-
-- (NSString *)accessibilityActionDescription:(NSString *)anAction {
- return [parent respondsToSelector:_cmd] ? [parent
accessibilityActionDescription:anAction] :
NSAccessibilityActionDescription(anAction);
-}
-
-- (void)accessibilityPerformAction:(NSString *)anAction {
- if ([parent respondsToSelector:_cmd])
- [parent accessibilityPerformAction:anAction];
-}
-
[EMAIL PROTECTED]
Modified: trunk/SKPDFView.m
===================================================================
--- trunk/SKPDFView.m 2008-05-03 18:20:22 UTC (rev 3842)
+++ trunk/SKPDFView.m 2008-05-04 21:27:07 UTC (rev 3843)
@@ -2157,7 +2157,7 @@
NSMutableArray *children = [NSMutableArray array];
- [children addObject:[SKAccessibilityPDFDisplayViewElement
elementWithParent:[self documentView]]];
+ //[children addObject:[SKAccessibilityPDFDisplayViewElement
elementWithParent:[self documentView]]];
unsigned int i;
for (i = range.location; i < NSMaxRange(range); i++) {
@@ -2190,8 +2190,8 @@
child =
NSAccessibilityUnignoredAncestor([SKAccessibilityProxyElement
elementWithObject:annotation parent:[self documentView]]);
}
}
- if (child == nil)
- child =
NSAccessibilityUnignoredAncestor([SKAccessibilityPDFDisplayViewElement
elementWithParent:[self documentView]]);
+ //if (child == nil)
+ // child =
NSAccessibilityUnignoredAncestor([SKAccessibilityPDFDisplayViewElement
elementWithParent:[self documentView]]);
return [child accessibilityHitTest:point];
}
@@ -2201,8 +2201,8 @@
child = NSAccessibilityUnignoredDescendant(editField);
else if (activeAnnotation)
child = NSAccessibilityUnignoredAncestor([SKAccessibilityProxyElement
elementWithObject:activeAnnotation parent:[self documentView]]);
- else
- child =
NSAccessibilityUnignoredAncestor([SKAccessibilityPDFDisplayViewElement
elementWithParent:[self documentView]]);
+ //else
+ // child =
NSAccessibilityUnignoredAncestor([SKAccessibilityPDFDisplayViewElement
elementWithParent:[self documentView]]);
return [child accessibilityFocusedUIElement];
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit