Revision: 3844
          http://skim-app.svn.sourceforge.net/skim-app/?rev=3844&view=rev
Author:   hofman
Date:     2008-05-04 16:09:31 -0700 (Sun, 04 May 2008)

Log Message:
-----------
Implement more primitive methods to get parametrized accessibility attributes, 
as the main one throws exceptions when we override. 

Modified Paths:
--------------
    trunk/OBUtilities.h
    trunk/OBUtilities.m
    trunk/PDFDisplayView_SKExtensions.m

Modified: trunk/OBUtilities.h
===================================================================
--- trunk/OBUtilities.h 2008-05-04 21:27:07 UTC (rev 3843)
+++ trunk/OBUtilities.h 2008-05-04 23:09:31 UTC (rev 3844)
@@ -19,6 +19,7 @@
 
 IMP OBReplaceMethodImplementation(Class aClass, SEL oldSelector, IMP newImp);
 IMP OBReplaceMethodImplementationWithSelector(Class aClass, SEL oldSelector, 
SEL newSelector);
+void OBAddMethodImplementationWithSelector(Class aClass, SEL newSelector, SEL 
oldSelector);
 
 #define OBINITIALIZE \
     do { \

Modified: trunk/OBUtilities.m
===================================================================
--- trunk/OBUtilities.m 2008-05-04 21:27:07 UTC (rev 3843)
+++ trunk/OBUtilities.m 2008-05-04 23:09:31 UTC (rev 3844)
@@ -95,3 +95,9 @@
 {
     return OBReplaceMethodImplementation(aClass, oldSelector, 
SK_method_getImplementation(class_getInstanceMethod(aClass, newSelector)));
 }
+
+void OBAddMethodImplementationWithSelector(Class aClass, SEL newSelector, SEL 
oldSelector)
+{
+    Method method = class_getInstanceMethod(aClass, oldSelector);
+    SK_class_addMethod(aClass, newSelector, 
SK_method_getImplementation(method), SK_method_getTypeEncoding(method));
+}

Modified: trunk/PDFDisplayView_SKExtensions.m
===================================================================
--- trunk/PDFDisplayView_SKExtensions.m 2008-05-04 21:27:07 UTC (rev 3843)
+++ trunk/PDFDisplayView_SKExtensions.m 2008-05-04 23:09:31 UTC (rev 3844)
@@ -61,7 +61,6 @@
 static IMP originalAccessibilityAttributeNames = NULL;
 static IMP originalAccessibilityParameterizedAttributeNames = NULL;
 static IMP originalAccessibilityAttributeValue = NULL;
-static IMP originalAccessibilityAttributeValueForParameter = NULL;
 static IMP originalAccessibilityHitTest = NULL;
 static IMP originalAccessibilityFocusedUIElement = NULL;
 
@@ -96,10 +95,14 @@
 }
 
 - (NSArray *)replacementAccessibilityParameterizedAttributeNames {
-    static NSArray *attributes = nil;
-    if (attributes == nil)
-        attributes = [[originalAccessibilityParameterizedAttributeNames(self, 
_cmd) arrayByAddingObjectsFromArray:[NSArray 
arrayWithObjects:NSAccessibilityRangeForPositionParameterizedAttribute, 
NSAccessibilityRTFForRangeParameterizedAttribute, nil]] retain];
-    return attributes;
+    if ([[self skPdfView] 
respondsToSelector:@selector(accessibilityChildren)]) {
+        static NSArray *attributes = nil;
+        if (attributes == nil)
+            attributes = 
[[originalAccessibilityParameterizedAttributeNames(self, _cmd) 
arrayByAddingObjectsFromArray:[NSArray 
arrayWithObjects:NSAccessibilityRangeForPositionParameterizedAttribute, 
NSAccessibilityRTFForRangeParameterizedAttribute, nil]] retain];
+        return attributes;
+    } else {
+        return originalAccessibilityAttributeNames(self, _cmd);
+    }
 }
 
 - (id)replacementAccessibilityAttributeValue:(NSString *)attribute {
@@ -113,39 +116,40 @@
     }
 }
 
-- (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)]]];
-                    }
+- 
(id)replacementAccessibilityRangeForPositionAttributeForParameter:(id)parameter 
{
+    id pdfView = [self skPdfView];
+    if (pdfView && [self 
respondsToSelector:@selector(accessibilityRangeForSelection:)]) {
+        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) {}
+                return [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 value;
+    return nil;
 }
 
+- (id)replacementAccessibilityRTFForRangeAttributeForParameter:(id)parameter {
+    id pdfView = [self skPdfView];
+    if (pdfView && [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];
+        return [attributedString RTFFromRange:NSMakeRange(0, [attributedString 
length]) documentAttributes:NULL];
+    }
+    return nil;
+}
+
 - (id)replacementAccessibilityHitTest:(NSPoint)point {
     id pdfView = [self skPdfView];
     id element = nil;
@@ -205,12 +209,14 @@
         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)])
         originalAccessibilityFocusedUIElement = 
OBReplaceMethodImplementationWithSelector(self, 
@selector(accessibilityFocusedUIElement), 
@selector(replacementAccessibilityFocusedUIElement));
+    if ([self 
instancesRespondToSelector:@selector(accessibilityRangeForPositionAttributeForParameter:)]
 == NO)
+        OBAddMethodImplementationWithSelector(self, 
@selector(accessibilityRangeForPositionAttributeForParameter:), 
@selector(replacementAccessibilityRangeForPositionAttributeForParameter:));
+    if ([self 
instancesRespondToSelector:@selector(accessibilityRTFForRangeAttributeForParameter:)]
 == NO)
+        OBAddMethodImplementationWithSelector(self, 
@selector(accessibilityRTFForRangeAttributeForParameter:), 
@selector(replacementAccessibilityRTFForRangeAttributeForParameter:));
 }
 
 @end


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