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

Reply via email to