Revision: 3787
http://skim-app.svn.sourceforge.net/skim-app/?rev=3787&view=rev
Author: hofman
Date: 2008-04-22 05:49:42 -0700 (Tue, 22 Apr 2008)
Log Message:
-----------
Add separate files for accessibility proxy for notes and links. Cache those
children, invalidate the cache when the annotations change.
Modified Paths:
--------------
trunk/PDFDisplayView_SKExtensions.h
trunk/PDFDisplayView_SKExtensions.m
trunk/SKPDFView.h
trunk/SKPDFView.m
trunk/Skim.xcodeproj/project.pbxproj
Added Paths:
-----------
trunk/SKAccessibilityPDFAnnotationElement.h
trunk/SKAccessibilityPDFAnnotationElement.m
Modified: trunk/PDFDisplayView_SKExtensions.h
===================================================================
--- trunk/PDFDisplayView_SKExtensions.h 2008-04-22 12:09:12 UTC (rev 3786)
+++ trunk/PDFDisplayView_SKExtensions.h 2008-04-22 12:49:42 UTC (rev 3787)
@@ -46,3 +46,9 @@
@interface PDFDisplayView (SKExtensions)
@end
+
[EMAIL PROTECTED] SKAccessibilityPDFDisplayViewElement : NSObject {
+ id parent;
+}
+- (id)initWithParent:(id)aParent;
[EMAIL PROTECTED]
Modified: trunk/PDFDisplayView_SKExtensions.m
===================================================================
--- trunk/PDFDisplayView_SKExtensions.m 2008-04-22 12:09:12 UTC (rev 3786)
+++ trunk/PDFDisplayView_SKExtensions.m 2008-04-22 12:49:42 UTC (rev 3787)
@@ -42,26 +42,8 @@
#import "SKPDFDocument.h"
#import "SKStringConstants.h"
#import "OBUtilities.h"
+#import "SKAccessibilityPDFAnnotationElement.h"
-
[EMAIL PROTECTED] SKAccessibilityPDFDisplayViewElement : NSObject {
- id parent;
-}
-- (id)initWithParent:(id)aParent;
[EMAIL PROTECTED]
-
-#pragma mark -
-
[EMAIL PROTECTED] SKAccessibilityPDFAnnotationElement : NSObject {
- PDFAnnotation *annotation;
- SKPDFView *pdfView;
- id parent;
-}
-- (id)initWithAnnotation:(PDFAnnotation *)anAnnotation pdfView:(SKPDFView
*)aPdfView parent:(id)aParent;
[EMAIL PROTECTED]
-
-#pragma mark -
-
static IMP originalAccessibilityAttributeNames = NULL;
static IMP originalAccessibilityAttributeValue = NULL;
static IMP originalAccessibilityHitTest = NULL;
@@ -103,52 +85,12 @@
} else if ([attribute
isEqualToString:NSAccessibilityRoleDescriptionAttribute]) {
return NSAccessibilityRoleDescription(NSAccessibilityGroupRole, nil);
} else if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) {
- NSMutableArray *children = [NSMutableArray array];
- [children
addObjectsFromArray:originalAccessibilityAttributeValue(self, _cmd, attribute)];
- if (pdfView) {
- [children addObject:[[[SKAccessibilityPDFDisplayViewElement alloc]
initWithParent:self] autorelease]];
- PDFDocument *pdfDoc = [pdfView document];
- unsigned int i, iMax = [pdfDoc pageCount];
- for (i = 0; i < iMax; i++) {
- PDFPage *page = [pdfDoc pageAtIndex:i];
- NSEnumerator *annotationEnum = [[page annotations]
objectEnumerator];
- PDFAnnotation *annotation;
- while (annotation = [annotationEnum nextObject]) {
- if ([[annotation type] isEqualToString:SKLinkString] ||
[annotation isNoteAnnotation])
- [children
addObject:[[[SKAccessibilityPDFAnnotationElement alloc]
initWithAnnotation:annotation pdfView:pdfView parent:self] autorelease]];
- }
- }
- }
- return NSAccessibilityUnignoredChildren(children);
+ return NSAccessibilityUnignoredChildren([pdfView
accessibilityChildren]);
} else if ([attribute
isEqualToString:NSAccessibilityVisibleChildrenAttribute]) {
- NSMutableArray *children = [NSMutableArray array];
- [children
addObjectsFromArray:originalAccessibilityAttributeValue(self, _cmd, attribute)];
- SKPDFView *pdfView = [self skpdfView];
- if (pdfView) {
- [children addObject:[[[SKAccessibilityPDFDisplayViewElement alloc]
initWithParent:self] autorelease]];
- PDFDocument *pdfDoc = [pdfView document];
- NSRect visibleRect = [pdfView visibleContentRect];
- NSRange range = [pdfView visiblePageIndexRange];
- unsigned int i;
- for (i = range.location; i < NSMaxRange(range); i++) {
- PDFPage *page = [pdfDoc pageAtIndex:i];
- NSEnumerator *annotationEnum = [[page annotations]
objectEnumerator];
- PDFAnnotation *annotation;
- while (annotation = [annotationEnum nextObject]) {
- if ([[annotation type] isEqualToString:SKLinkString] ||
[annotation isNoteAnnotation] &&
- NSIntersectsRect([pdfView convertRect:[annotation
bounds] fromPage:[annotation page]], visibleRect))
- [children
addObject:[[[SKAccessibilityPDFAnnotationElement alloc]
initWithAnnotation:annotation pdfView:pdfView parent:self] autorelease]];
- }
- }
- }
- return NSAccessibilityUnignoredChildren(children);
+ return NSAccessibilityUnignoredChildren([pdfView
accessibilityVisibleChildren]);
} else if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) {
NSNumber *focused = originalAccessibilityAttributeValue(self, _cmd,
attribute);
- SKPDFView *pdfView = [self skpdfView];
- if (pdfView)
- return [NSNumber numberWithBool:[pdfView activeAnnotation] == nil
&& [focused boolValue]];
- else
- return focused;
+ return [NSNumber numberWithBool:[pdfView activeAnnotation] == nil &&
[focused boolValue]];
} else {
return originalAccessibilityAttributeValue(self, _cmd, attribute);
}
@@ -291,121 +233,3 @@
}
@end
-
-#pragma mark -
-
[EMAIL PROTECTED] SKAccessibilityPDFAnnotationElement
-
-- (id)initWithAnnotation:(PDFAnnotation *)anAnnotation pdfView:(SKPDFView
*)aPdfView parent:(id)aParent {
- if (self = [super init]) {
- annotation = anAnnotation;
- pdfView = aPdfView;
- parent = aParent;
- }
- return self;
-}
-
-- (BOOL)isEqual:(id)object {
- if ([object isKindOfClass:[SKAccessibilityPDFAnnotationElement class]]) {
- SKAccessibilityPDFAnnotationElement *other =
(SKAccessibilityPDFAnnotationElement *)object;
- return annotation == other->annotation && pdfView == other->pdfView;
- } else {
- return NO;
- }
-}
-
-- (unsigned int)hash {
- return [annotation hash] + [pdfView hash];
-}
-
-- (NSArray *)accessibilityAttributeNames {
- return [annotation accessibilityAttributeNames];
-}
-
-- (id)accessibilityAttributeValue:(NSString *)attribute {
- if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) {
- return [annotation accessibilityRoleAttribute];
- } else if ([attribute
isEqualToString:NSAccessibilityRoleDescriptionAttribute]) {
- return [annotation accessibilityRoleDescriptionAttribute];
- } else if ([attribute isEqualToString:NSAccessibilityValueAttribute]) {
- return [annotation accessibilityValueAttribute];
- } else if ([attribute isEqualToString:NSAccessibilityTitleAttribute]) {
- return [annotation accessibilityTitleAttribute];
- } else if ([attribute
isEqualToString:NSAccessibilitySelectedTextAttribute]) {
- return [annotation accessibilitySelectedTextAttribute];
- } else if ([attribute
isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) {
- return [annotation accessibilitySelectedTextRangeAttribute];
- } else if ([attribute
isEqualToString:NSAccessibilityNumberOfCharactersAttribute]) {
- return [annotation accessibilityNumberOfCharactersAttribute];
- } else if ([attribute
isEqualToString:NSAccessibilityVisibleCharacterRangeAttribute]) {
- return [annotation accessibilityVisibleCharacterRangeAttribute];
- } else if ([attribute isEqualToString:NSAccessibilityURLAttribute]) {
- return [annotation accessibilityURLAttribute];
- } else if ([attribute isEqualToString:NSAccessibilityParentAttribute]) {
- return NSAccessibilityUnignoredAncestor(parent);
- } else if ([attribute isEqualToString:NSAccessibilityWindowAttribute]) {
- // We're in the same window as our parent.
- return [NSAccessibilityUnignoredAncestor(parent)
accessibilityAttributeValue:NSAccessibilityWindowAttribute];
- } else if ([attribute
isEqualToString:NSAccessibilityTopLevelUIElementAttribute]) {
- // We're in the same top level element as our parent.
- return [NSAccessibilityUnignoredAncestor(parent)
accessibilityAttributeValue:NSAccessibilityTopLevelUIElementAttribute];
- } else if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) {
- return [NSNumber numberWithBool:[pdfView activeAnnotation] ==
annotation];
- } else if ([attribute isEqualToString:NSAccessibilityEnabledAttribute]) {
- return [NSNumber numberWithBool:NO];
- } else if ([attribute isEqualToString:NSAccessibilityPositionAttribute]) {
- NSRect rect = [pdfView convertRect:[annotation bounds]
fromPage:[annotation page]];
- return [NSValue valueWithPoint:[[pdfView window]
convertBaseToScreen:[pdfView convertPoint:rect.origin toView:nil]]];
- } else if ([attribute isEqualToString:NSAccessibilitySizeAttribute]) {
- NSRect rect = [pdfView convertRect:[annotation bounds]
fromPage:[annotation page]];
- return [NSValue valueWithSize:[pdfView convertSize:rect.size
toView:nil]];
- } else {
- return nil;
- }
-}
-
-- (BOOL)accessibilityIsAttributeSettable:(NSString *)attribute {
- return [attribute isEqualToString:NSAccessibilityFocusedAttribute];
-}
-
-- (void)accessibilitySetValue:(id)value forAttribute:(NSString *)attribute {
- if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) {
- if ([value boolValue])
- [pdfView setActiveAnnotation:annotation];
- else if ([pdfView activeAnnotation] == annotation)
- [pdfView setActiveAnnotation:nil];
- }
-}
-
-- (BOOL)accessibilityIsIgnored {
- return NO;
-}
-
-- (id)accessibilityHitTest:(NSPoint)point {
- return NSAccessibilityUnignoredAncestor(self);
-}
-
-- (id)accessibilityFocusedUIElement {
- return NSAccessibilityUnignoredAncestor(self);
-}
-
-- (NSArray *)accessibilityActionNames {
- if ([[annotation type] isEqualToString:SKLinkString] || [annotation
isEditable])
- return [NSArray arrayWithObject:NSAccessibilityPressAction];
- else
- return [NSArray array];
-}
-
-- (NSString *)accessibilityActionDescription:(NSString *)anAction {
- return NSAccessibilityActionDescription(anAction);
-}
-
-- (void)accessibilityPerformAction:(NSString *)anAction {
- if ([anAction isEqualToString:NSAccessibilityPressAction]) {
- if ([pdfView activeAnnotation] != annotation)
- [pdfView setActiveAnnotation:annotation];
- [pdfView editActiveAnnotation:self];
- }
-}
-
[EMAIL PROTECTED]
Added: trunk/SKAccessibilityPDFAnnotationElement.h
===================================================================
--- trunk/SKAccessibilityPDFAnnotationElement.h (rev 0)
+++ trunk/SKAccessibilityPDFAnnotationElement.h 2008-04-22 12:49:42 UTC (rev
3787)
@@ -0,0 +1,49 @@
+//
+// SKAccessibilityPDFAnnotationElement.h
+// Skim
+//
+// Created by Christiaan Hofman on 4/22/08.
+/*
+ This software is Copyright (c) 2008
+ Christiaan Hofman. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <Cocoa/Cocoa.h>
+
[EMAIL PROTECTED] PDFAnnotation, SKPDFView;
+
[EMAIL PROTECTED] SKAccessibilityPDFAnnotationElement : NSObject {
+ PDFAnnotation *annotation;
+ SKPDFView *pdfView;
+ id parent;
+}
+- (id)initWithAnnotation:(PDFAnnotation *)anAnnotation pdfView:(SKPDFView
*)aPdfView parent:(id)aParent;
[EMAIL PROTECTED]
Added: trunk/SKAccessibilityPDFAnnotationElement.m
===================================================================
--- trunk/SKAccessibilityPDFAnnotationElement.m (rev 0)
+++ trunk/SKAccessibilityPDFAnnotationElement.m 2008-04-22 12:49:42 UTC (rev
3787)
@@ -0,0 +1,160 @@
+//
+// SKAccessibilityPDFAnnotationElement.m
+// Skim
+//
+// Created by Christiaan Hofman on 4/22/08.
+/*
+ This software is Copyright (c) 2008
+ Christiaan Hofman. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SKAccessibilityPDFAnnotationElement.h"
+#import <Quartz/Quartz.h>
+#import "SKPDFView.h"
+#import "PDFAnnotation_SKExtensions.h"
+#import "SKStringConstants.h"
+
+
[EMAIL PROTECTED] SKAccessibilityPDFAnnotationElement
+
+- (id)initWithAnnotation:(PDFAnnotation *)anAnnotation pdfView:(SKPDFView
*)aPdfView parent:(id)aParent {
+ if (self = [super init]) {
+ annotation = anAnnotation;
+ pdfView = aPdfView;
+ parent = aParent;
+ }
+ return self;
+}
+
+- (BOOL)isEqual:(id)object {
+ if ([object isKindOfClass:[SKAccessibilityPDFAnnotationElement class]]) {
+ SKAccessibilityPDFAnnotationElement *other =
(SKAccessibilityPDFAnnotationElement *)object;
+ return annotation == other->annotation && pdfView == other->pdfView;
+ } else {
+ return NO;
+ }
+}
+
+- (unsigned int)hash {
+ return [annotation hash] + [pdfView hash];
+}
+
+- (NSArray *)accessibilityAttributeNames {
+ return [annotation accessibilityAttributeNames];
+}
+
+- (id)accessibilityAttributeValue:(NSString *)attribute {
+ if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) {
+ return [annotation accessibilityRoleAttribute];
+ } else if ([attribute
isEqualToString:NSAccessibilityRoleDescriptionAttribute]) {
+ return [annotation accessibilityRoleDescriptionAttribute];
+ } else if ([attribute isEqualToString:NSAccessibilityValueAttribute]) {
+ return [annotation accessibilityValueAttribute];
+ } else if ([attribute isEqualToString:NSAccessibilityTitleAttribute]) {
+ return [annotation accessibilityTitleAttribute];
+ } else if ([attribute
isEqualToString:NSAccessibilitySelectedTextAttribute]) {
+ return [annotation accessibilitySelectedTextAttribute];
+ } else if ([attribute
isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) {
+ return [annotation accessibilitySelectedTextRangeAttribute];
+ } else if ([attribute
isEqualToString:NSAccessibilityNumberOfCharactersAttribute]) {
+ return [annotation accessibilityNumberOfCharactersAttribute];
+ } else if ([attribute
isEqualToString:NSAccessibilityVisibleCharacterRangeAttribute]) {
+ return [annotation accessibilityVisibleCharacterRangeAttribute];
+ } else if ([attribute isEqualToString:NSAccessibilityURLAttribute]) {
+ return [annotation accessibilityURLAttribute];
+ } else if ([attribute isEqualToString:NSAccessibilityParentAttribute]) {
+ return NSAccessibilityUnignoredAncestor(parent);
+ } else if ([attribute isEqualToString:NSAccessibilityWindowAttribute]) {
+ // We're in the same window as our parent.
+ return [NSAccessibilityUnignoredAncestor(parent)
accessibilityAttributeValue:NSAccessibilityWindowAttribute];
+ } else if ([attribute
isEqualToString:NSAccessibilityTopLevelUIElementAttribute]) {
+ // We're in the same top level element as our parent.
+ return [NSAccessibilityUnignoredAncestor(parent)
accessibilityAttributeValue:NSAccessibilityTopLevelUIElementAttribute];
+ } else if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) {
+ return [NSNumber numberWithBool:[pdfView activeAnnotation] ==
annotation];
+ } else if ([attribute isEqualToString:NSAccessibilityEnabledAttribute]) {
+ return [NSNumber numberWithBool:NO];
+ } else if ([attribute isEqualToString:NSAccessibilityPositionAttribute]) {
+ NSRect rect = [pdfView convertRect:[annotation bounds]
fromPage:[annotation page]];
+ return [NSValue valueWithPoint:[[pdfView window]
convertBaseToScreen:[pdfView convertPoint:rect.origin toView:nil]]];
+ } else if ([attribute isEqualToString:NSAccessibilitySizeAttribute]) {
+ NSRect rect = [pdfView convertRect:[annotation bounds]
fromPage:[annotation page]];
+ return [NSValue valueWithSize:[pdfView convertSize:rect.size
toView:nil]];
+ } else {
+ return nil;
+ }
+}
+
+- (BOOL)accessibilityIsAttributeSettable:(NSString *)attribute {
+ return [attribute isEqualToString:NSAccessibilityFocusedAttribute];
+}
+
+- (void)accessibilitySetValue:(id)value forAttribute:(NSString *)attribute {
+ if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) {
+ if ([value boolValue])
+ [pdfView setActiveAnnotation:annotation];
+ else if ([pdfView activeAnnotation] == annotation)
+ [pdfView setActiveAnnotation:nil];
+ }
+}
+
+- (BOOL)accessibilityIsIgnored {
+ return NO;
+}
+
+- (id)accessibilityHitTest:(NSPoint)point {
+ return NSAccessibilityUnignoredAncestor(self);
+}
+
+- (id)accessibilityFocusedUIElement {
+ return NSAccessibilityUnignoredAncestor(self);
+}
+
+- (NSArray *)accessibilityActionNames {
+ if ([[annotation type] isEqualToString:SKLinkString] || [annotation
isEditable])
+ return [NSArray arrayWithObject:NSAccessibilityPressAction];
+ else
+ return [NSArray array];
+}
+
+- (NSString *)accessibilityActionDescription:(NSString *)anAction {
+ return NSAccessibilityActionDescription(anAction);
+}
+
+- (void)accessibilityPerformAction:(NSString *)anAction {
+ if ([anAction isEqualToString:NSAccessibilityPressAction]) {
+ if ([pdfView activeAnnotation] != annotation)
+ [pdfView setActiveAnnotation:annotation];
+ [pdfView editActiveAnnotation:self];
+ }
+}
+
[EMAIL PROTECTED]
Modified: trunk/SKPDFView.h
===================================================================
--- trunk/SKPDFView.h 2008-04-22 12:09:12 UTC (rev 3786)
+++ trunk/SKPDFView.h 2008-04-22 12:49:42 UTC (rev 3787)
@@ -106,6 +106,8 @@
SKTypeSelectHelper *typeSelectHelper;
+ NSMutableArray *accessibilityChildren;
+
PDFAnnotation *activeAnnotation;
PDFAnnotation *highlightAnnotation;
NSTextField *editField;
@@ -192,8 +194,8 @@
- (void)resetHoverRects;
- (void)removeHoverRects;
-- (NSRange)visiblePageIndexRange;
-- (NSRect)visibleContentRect;
+- (NSArray *)accessibilityChildren;
+- (NSArray *)accessibilityVisibleChildren;
- (NSUndoManager *)undoManager;
Modified: trunk/SKPDFView.m
===================================================================
--- trunk/SKPDFView.m 2008-04-22 12:09:12 UTC (rev 3786)
+++ trunk/SKPDFView.m 2008-04-22 12:49:42 UTC (rev 3787)
@@ -67,6 +67,8 @@
#import "NSAffineTransform_SKExtensions.h"
#import "BDSKEdgeView.h"
#import "PDFDocument_SKExtensions.h"
+#import "PDFDisplayView_SKExtensions.h"
+#import "SKAccessibilityPDFAnnotationElement.h"
NSString *SKPDFViewToolModeChangedNotification =
@"SKPDFViewToolModeChangedNotification";
NSString *SKPDFViewAnnotationModeChangedNotification =
@"SKPDFViewAnnotationModeChangedNotification";
@@ -118,6 +120,9 @@
- (void)transformCGContext:(CGContextRef)context forPage:(PDFPage *)page;
+- (NSRange)visiblePageIndexRange;
+- (NSRect)visibleContentRect;
+
- (void)enableNavigationForScreen:(NSScreen *)screen;
- (void)disableNavigation;
@@ -265,6 +270,7 @@
[transitionController release];
[navWindow release];
[readingBar release];
+ [accessibilityChildren release];
[super dealloc];
}
@@ -460,6 +466,8 @@
readingBar = nil;
selectionRect = NSZeroRect;
[self removeHoverRects];
+ [accessibilityChildren release];
+ accessibilityChildren = nil;
[[SKPDFHoverWindow sharedHoverWindow] orderOut:self];
[super setDocument:document];
[self resetHoverRects];
@@ -1854,12 +1862,16 @@
[page addAnnotation:annotation];
[self setNeedsDisplayForAnnotation:annotation];
[self resetHoverRects];
+ [accessibilityChildren release];
+ accessibilityChildren = nil;
[[NSNotificationCenter defaultCenter]
postNotificationName:SKPDFViewDidAddAnnotationNotification object:self
userInfo:[NSDictionary dictionaryWithObjectsAndKeys:page, SKPDFViewPageKey,
annotation, SKPDFViewAnnotationKey, nil]];
}
- (void)removeActiveAnnotation:(id)sender{
if ([activeAnnotation isNoteAnnotation]) {
[self removeAnnotation:activeAnnotation];
+ [accessibilityChildren release];
+ accessibilityChildren = nil;
[[self undoManager] setActionName:NSLocalizedString(@"Remove Note",
@"Undo action name")];
}
}
@@ -1869,6 +1881,8 @@
if (annotation) {
[self removeAnnotation:annotation];
+ [accessibilityChildren release];
+ accessibilityChildren = nil;
[[self undoManager] setActionName:NSLocalizedString(@"Remove Note",
@"Undo action name")];
}
}
@@ -1887,6 +1901,8 @@
[self setActiveAnnotation:nil];
[self setNeedsDisplayForAnnotation:wasAnnotation];
[page removeAnnotation:wasAnnotation];
+ [accessibilityChildren release];
+ accessibilityChildren = nil;
if (wasNote)
[self resetHoverRects];
[[NSNotificationCenter defaultCenter]
postNotificationName:SKPDFViewDidRemoveAnnotationNotification object:self
@@ -1906,6 +1922,8 @@
[self setNeedsDisplayForAnnotation:annotation];
if ([[annotation type] isEqualToString:SKNoteString])
[self resetHoverRects];
+ [accessibilityChildren release];
+ accessibilityChildren = nil;
[[NSNotificationCenter defaultCenter]
postNotificationName:SKPDFViewDidMoveAnnotationNotification object:self
userInfo:[NSDictionary dictionaryWithObjectsAndKeys:oldPage,
SKPDFViewOldPageKey, page, SKPDFViewNewPageKey, annotation,
SKPDFViewAnnotationKey, nil]];
}
@@ -2114,6 +2132,50 @@
}
}
+- (NSArray *)accessibilityChildren {
+ if (accessibilityChildren == nil) {
+ NSMutableArray *children = [[NSMutableArray alloc] init];
+
+ [children addObject:[[[SKAccessibilityPDFDisplayViewElement alloc]
initWithParent:[self documentView]] autorelease]];
+
+ PDFDocument *pdfDoc = [self document];
+ unsigned int i, iMax = [pdfDoc pageCount];
+ for (i = 0; i < iMax; i++) {
+ PDFPage *page = [pdfDoc pageAtIndex:i];
+ NSEnumerator *annotationEnum = [[page annotations]
objectEnumerator];
+ PDFAnnotation *annotation;
+ while (annotation = [annotationEnum nextObject]) {
+ if ([[annotation type] isEqualToString:SKLinkString] ||
[annotation isNoteAnnotation])
+ [children addObject:[[[SKAccessibilityPDFAnnotationElement
alloc] initWithAnnotation:annotation pdfView:self parent:[self documentView]]
autorelease]];
+ }
+ }
+ accessibilityChildren = children;
+ }
+ return accessibilityChildren;
+}
+
+- (NSArray *)accessibilityVisibleChildren {
+ NSMutableArray *children = [NSMutableArray array];
+
+ [children addObject:[[[SKAccessibilityPDFDisplayViewElement alloc]
initWithParent:[self documentView]] autorelease]];
+
+ PDFDocument *pdfDoc = [self document];
+ NSRect visibleRect = [self visibleContentRect];
+ NSRange range = [self visiblePageIndexRange];
+ unsigned int i;
+ for (i = range.location; i < NSMaxRange(range); i++) {
+ PDFPage *page = [pdfDoc pageAtIndex:i];
+ NSEnumerator *annotationEnum = [[page annotations] objectEnumerator];
+ PDFAnnotation *annotation;
+ while (annotation = [annotationEnum nextObject]) {
+ if ([[annotation type] isEqualToString:SKLinkString] ||
[annotation isNoteAnnotation] &&
+ NSIntersectsRect([self convertRect:[annotation bounds]
fromPage:[annotation page]], visibleRect))
+ [children addObject:[[[SKAccessibilityPDFAnnotationElement
alloc] initWithAnnotation:annotation pdfView:self parent:[self documentView]]
autorelease]];
+ }
+ }
+ return children;
+}
+
#pragma mark Snapshots
- (void)takeSnapshot:(id)sender {
@@ -2802,6 +2864,8 @@
[self removeActiveAnnotation:nil];
[self removeAnnotation:newActiveAnnotation];
+ [accessibilityChildren release];
+ accessibilityChildren = nil;
newActiveAnnotation = [[[SKPDFAnnotationMarkup alloc]
initWithSelection:sel markupType:markupType] autorelease];
[newActiveAnnotation setString:[[sel string]
stringByCollapsingWhitespaceAndNewlinesAndRemovingSurroundingWhitespaceAndNewlines]];
Modified: trunk/Skim.xcodeproj/project.pbxproj
===================================================================
--- trunk/Skim.xcodeproj/project.pbxproj 2008-04-22 12:09:12 UTC (rev
3786)
+++ trunk/Skim.xcodeproj/project.pbxproj 2008-04-22 12:49:42 UTC (rev
3787)
@@ -195,6 +195,7 @@
CEE106150BCBB72C00BF2D3E /* SKNotesDocument.m in Sources */ =
{isa = PBXBuildFile; fileRef = CEE106140BCBB72C00BF2D3E /* SKNotesDocument.m
*/; };
CEE1065E0BCBBE1300BF2D3E /* NotesDocument.nib in Resources */ =
{isa = PBXBuildFile; fileRef = CEE106580BCBBE1200BF2D3E /* NotesDocument.nib
*/; };
CEE176E40DBD5B0C00E6C317 /* PDFDisplayView_SKExtensions.m in
Sources */ = {isa = PBXBuildFile; fileRef = CEE176E30DBD5B0C00E6C317 /*
PDFDisplayView_SKExtensions.m */; };
+ CEE177960DBE140900E6C317 /*
SKAccessibilityPDFAnnotationElement.m in Sources */ = {isa = PBXBuildFile;
fileRef = CEE177950DBE140900E6C317 /* SKAccessibilityPDFAnnotationElement.m */;
};
CEE229390BFB7CE9002B746B /* ReleaseNotes.rtf in Resources */ =
{isa = PBXBuildFile; fileRef = CE54AA8E0BBC037400008750 /* ReleaseNotes.rtf */;
};
CEE22EA30BFB8672002B746B /* displayline in CopyFiles */ = {isa
= PBXBuildFile; fileRef = CE1E2F120BDB86A10011D9DD /* displayline */; };
CEE22EA40BFB8684002B746B /* skimnotes in CopyFiles */ = {isa =
PBXBuildFile; fileRef = CEF3BF750B99CA2900E12E3D /* skimnotes */; };
@@ -814,6 +815,8 @@
CEE11EF50BCC262800BF2D3E /* Italian */ = {isa =
PBXFileReference; lastKnownFileType = wrapper.nib; name = Italian; path =
Italian.lproj/NotesDocument.nib; sourceTree = "<group>"; };
CEE176E20DBD5B0C00E6C317 /* PDFDisplayView_SKExtensions.h */ =
{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h;
path = PDFDisplayView_SKExtensions.h; sourceTree = "<group>"; };
CEE176E30DBD5B0C00E6C317 /* PDFDisplayView_SKExtensions.m */ =
{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.objc; path = PDFDisplayView_SKExtensions.m; sourceTree =
"<group>"; };
+ CEE177940DBE140900E6C317 /*
SKAccessibilityPDFAnnotationElement.h */ = {isa = PBXFileReference;
fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path =
SKAccessibilityPDFAnnotationElement.h; sourceTree = "<group>"; };
+ CEE177950DBE140900E6C317 /*
SKAccessibilityPDFAnnotationElement.m */ = {isa = PBXFileReference;
fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path =
SKAccessibilityPDFAnnotationElement.m; sourceTree = "<group>"; };
CEE54D170DA2AA050037169F /* cs */ = {isa = PBXFileReference;
lastKnownFileType = wrapper.nib; name = cs; path = cs.lproj/InfoWindow.nib;
sourceTree = "<group>"; };
CEE54D190DA2AA100037169F /* cs */ = {isa = PBXFileReference;
lastKnownFileType = wrapper.nib; name = cs; path = cs.lproj/MainMenu.nib;
sourceTree = "<group>"; };
CEE54D1A0DA2AA1F0037169F /* cs */ = {isa = PBXFileReference;
lastKnownFileType = wrapper.nib; name = cs; path = cs.lproj/MainWindow.nib;
sourceTree = "<group>"; };
@@ -1272,6 +1275,8 @@
CE2DE4D20B85D94800D0DA12 /* Data */ = {
isa = PBXGroup;
children = (
+ CEE177940DBE140900E6C317 /*
SKAccessibilityPDFAnnotationElement.h */,
+ CEE177950DBE140900E6C317 /*
SKAccessibilityPDFAnnotationElement.m */,
CEBD52EA0C9C0AE500FBF6A4 /* SKBookmark.h */,
CEBD52EB0C9C0AE500FBF6A4 /* SKBookmark.m */,
CEAF2E570C45414100C3ECBB /* SKLine.h */,
@@ -2035,6 +2040,7 @@
CECF61FF0DB258D600587D96 /* SKFontWell.m in
Sources */,
CE80666F0DB910610078D118 /*
SKSnapshotContentView.m in Sources */,
CEE176E40DBD5B0C00E6C317 /*
PDFDisplayView_SKExtensions.m in Sources */,
+ CEE177960DBE140900E6C317 /*
SKAccessibilityPDFAnnotationElement.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
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