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