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

Reply via email to