Revision: 13047
          http://sourceforge.net/p/skim-app/code/13047
Author:   hofman
Date:     2022-07-25 14:07:10 +0000 (Mon, 25 Jul 2022)
Log Message:
-----------
swizzle methods on accessibility nodes for annotations to implement press, 
pick, and show menu accessibility actions

Modified Paths:
--------------
    trunk/PDFAnnotation_SKExtensions.m
    trunk/PDFDocumentView_SKExtensions.h
    trunk/PDFDocumentView_SKExtensions.m
    trunk/SKPDFView.m

Modified: trunk/PDFAnnotation_SKExtensions.m
===================================================================
--- trunk/PDFAnnotation_SKExtensions.m  2022-07-24 09:40:21 UTC (rev 13046)
+++ trunk/PDFAnnotation_SKExtensions.m  2022-07-25 14:07:10 UTC (rev 13047)
@@ -668,4 +668,46 @@
     }
 }
 
+- (BOOL)accessibilityPerformPress {
+    if ([self isSkimNote] == NO)
+        return NO;
+    NSDocument *doc = [[self page] containingDocument];
+    if ([doc respondsToSelector:@selector(pdfView)] == NO)
+        return NO;
+    [[(SKMainDocument *)doc pdfView] editAnnotation:self];
+    return YES;
+}
+
+- (BOOL)accessibilityPerformPick {
+    if ([self isSkimNote] == NO)
+        return NO;
+    NSDocument *doc = [[self page] containingDocument];
+    if ([doc respondsToSelector:@selector(pdfView)] == NO)
+        return NO;
+    [[(SKMainDocument *)doc pdfView] setActiveAnnotation:self];
+    return YES;
+}
+
+- (BOOL)accessibilityPerformShowMenu {
+    if ([self isSkimNote] == NO)
+        return NO;
+    NSDocument *doc = [[self page] containingDocument];
+    if ([doc respondsToSelector:@selector(pdfView)] == NO)
+        return NO;
+    PDFView *pdfView = [(SKMainDocument *)doc pdfView];
+    NSPoint point = SKCenterPoint([pdfView convertRect:[self bounds] 
fromPage:[self page]]);
+    NSEvent *event = [NSEvent mouseEventWithType:NSRightMouseDown
+                                        location:[pdfView convertPoint:point 
toView:nil]
+                                   modifierFlags:0
+                                       timestamp:0
+                                    windowNumber:[[pdfView window] 
windowNumber]
+                                         context:nil
+                                     eventNumber:0
+                                      clickCount:1
+                                        pressure:0.0];
+    NSMenu *menu = [pdfView menuForEvent:event];
+    [NSMenu popUpContextMenu:menu withEvent:event forView:pdfView];
+    return YES;
+}
+
 @end

Modified: trunk/PDFDocumentView_SKExtensions.h
===================================================================
--- trunk/PDFDocumentView_SKExtensions.h        2022-07-24 09:40:21 UTC (rev 
13046)
+++ trunk/PDFDocumentView_SKExtensions.h        2022-07-25 14:07:10 UTC (rev 
13047)
@@ -40,3 +40,4 @@
 #import <Quartz/Quartz.h>
 
 extern void SKSwizzlePDFDocumentViewMethods();
+extern void SKSwizzlePDFAccessibilityNodeAnnotationMethods();

Modified: trunk/PDFDocumentView_SKExtensions.m
===================================================================
--- trunk/PDFDocumentView_SKExtensions.m        2022-07-24 09:40:21 UTC (rev 
13046)
+++ trunk/PDFDocumentView_SKExtensions.m        2022-07-25 14:07:10 UTC (rev 
13047)
@@ -43,10 +43,12 @@
 #import "SKRuntime.h"
 #import "NSView_SKExtensions.h"
 #import <objc/objc-runtime.h>
+#import <SkimNotes/SkimNotes.h>
 
 @interface NSView (SKPDFDisplayViewPrivateDeclarations)
 - (id)pdfView;
 - (id)getPDFView;
+- (id)annotation;
 @end
 
 #pragma mark -
@@ -73,6 +75,9 @@
 static BOOL (*original_accessibilityPerformShowAlternateUI)(id, SEL) = NULL;
 static BOOL (*original_accessibilityPerformShowDefaultUI)(id, SEL) = NULL;
 static BOOL (*original_accessibilityPerformShowMenu)(id, SEL) = NULL;
+static BOOL (*original_annotation_accessibilityPerformPress)(id, SEL) = NULL;
+static BOOL (*original_annotation_accessibilityPerformPick)(id, SEL) = NULL;
+static BOOL (*original_annotation_accessibilityPerformShowMenu)(id, SEL) = 
NULL;
 
 #pragma mark PDFPageView fix
 
@@ -114,6 +119,27 @@
     return [pdfView accessibilityPerformShowMenu];
 }
 
+static BOOL replacement_annotation_accessibilityPerformPress(id self, SEL 
_cmd) {
+    id annotation = [self annotation];
+    if ([annotation respondsToSelector:@selector(isSkimNote)] && [annotation 
isSkimNote] && [annotation respondsToSelector:_cmd])
+        return [annotation accessibilityPerformPress];
+    return original_annotation_accessibilityPerformPress(self, _cmd);
+}
+
+static BOOL replacement_annotation_accessibilityPerformPick(id self, SEL _cmd) 
{
+    id annotation = [self annotation];
+    if ([annotation respondsToSelector:@selector(isSkimNote)] && [annotation 
isSkimNote] && [annotation respondsToSelector:_cmd])
+        return [annotation accessibilityPerformPick];
+    return original_annotation_accessibilityPerformPick(self, _cmd);
+}
+
+static BOOL replacement_annotation_accessibilityPerformShowMenu(id self, SEL 
_cmd) {
+    id annotation = [self annotation];
+    if ([annotation respondsToSelector:@selector(isSkimNote)] && [annotation 
isSkimNote] && [annotation respondsToSelector:_cmd])
+        return [annotation accessibilityPerformShowMenu];
+    return original_accessibilityPerformShowMenu(self, _cmd);
+}
+
 #pragma mark SKSwizzlePDFDocumentViewMethods
 
 void SKSwizzlePDFDocumentViewMethods() {
@@ -145,3 +171,17 @@
     original_accessibilityPerformShowDefaultUI = (BOOL (*)(id, 
SEL))SKReplaceInstanceMethodImplementation(PDFDocumentViewClass, 
@selector(accessibilityPerformShowDefaultUI), 
(IMP)replacement_accessibilityPerformShowDefaultUI);
     original_accessibilityPerformShowMenu = (BOOL (*)(id, 
SEL))SKReplaceInstanceMethodImplementation(PDFDocumentViewClass, 
@selector(accessibilityPerformShowMenu), 
(IMP)replacement_accessibilityPerformShowMenu);
 }
+
+void SKSwizzlePDFAccessibilityNodeAnnotationMethods() {
+    if (RUNNING_BEFORE(10_13))
+        return;
+    
+    Class PDFAccessibilityNodeAnnotationClass = 
NSClassFromString(@"PDFAccessibilityNodeAnnotation");
+    
+    if (PDFAccessibilityNodeAnnotationClass == Nil || 
[PDFAccessibilityNodeAnnotationClass 
instancesRespondToSelector:@selector(annotation)] == NO)
+        return;
+    
+    original_annotation_accessibilityPerformPress = (BOOL (*)(id, 
SEL))SKReplaceInstanceMethodImplementation(PDFAccessibilityNodeAnnotationClass, 
@selector(accessibilityPerformPress), 
(IMP)replacement_annotation_accessibilityPerformPress);
+    original_annotation_accessibilityPerformPick = (BOOL (*)(id, 
SEL))SKReplaceInstanceMethodImplementation(PDFAccessibilityNodeAnnotationClass, 
@selector(accessibilityPerformPick), 
(IMP)replacement_annotation_accessibilityPerformPick);
+    original_annotation_accessibilityPerformShowMenu = (BOOL (*)(id, 
SEL))SKReplaceInstanceMethodImplementation(PDFAccessibilityNodeAnnotationClass, 
@selector(accessibilityPerformShowMenu), 
(IMP)replacement_annotation_accessibilityPerformShowMenu);
+}

Modified: trunk/SKPDFView.m
===================================================================
--- trunk/SKPDFView.m   2022-07-24 09:40:21 UTC (rev 13046)
+++ trunk/SKPDFView.m   2022-07-25 14:07:10 UTC (rev 13047)
@@ -270,6 +270,7 @@
     useToolModeCursors = [[NSUserDefaults standardUserDefaults] 
boolForKey:SKUseToolModeCursorsKey];
     
     SKSwizzlePDFDocumentViewMethods();
+    SKSwizzlePDFAccessibilityNodeAnnotationMethods();
 }
 
 + (NSArray *)defaultKeysToObserve {

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Skim-app-commit mailing list
Skim-app-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to