Revision: 14456
          http://sourceforge.net/p/skim-app/code/14456
Author:   hofman
Date:     2024-09-17 15:47:33 +0000 (Tue, 17 Sep 2024)
Log Message:
-----------
Use a customview to display the pdf page in presentation. Simplifies the 
PDFView subclass and avoids flickering when pages changeor transitions. 
Synchronize currentPage in pdfview with the presentation view.

Modified Paths:
--------------
    trunk/SKMainDocument.m
    trunk/SKMainTouchBarController.m
    trunk/SKMainWindowController.h
    trunk/SKMainWindowController.m
    trunk/SKMainWindowController_Actions.m
    trunk/SKMainWindowController_FullScreen.m
    trunk/SKMainWindowController_UI.m
    trunk/SKNavigationWindow.h
    trunk/SKNavigationWindow.m
    trunk/SKPDFView.h
    trunk/SKPDFView.m
    trunk/SKPresentationOptionsSheetController.m
    trunk/SKTransitionController.h
    trunk/SKTransitionController.m
    trunk/Skim.xcodeproj/project.pbxproj

Added Paths:
-----------
    trunk/SKPresentationView.h
    trunk/SKPresentationView.m

Modified: trunk/SKMainDocument.m
===================================================================
--- trunk/SKMainDocument.m      2024-09-12 21:33:13 UTC (rev 14455)
+++ trunk/SKMainDocument.m      2024-09-17 15:47:33 UTC (rev 14456)
@@ -1693,11 +1693,11 @@
 }
 
 - (PDFPage *)currentPage {
-    return [[self pdfView] currentPage];
+    return [mainWindowController currentPage];
 }
 
 - (void)setCurrentPage:(PDFPage *)page {
-    [[self pdfView] goToCurrentPage:page];
+    [mainWindowController setCurrentPage:page];
 }
 
 - (NSData *)currentQDPoint {
@@ -1981,14 +1981,17 @@
     
     if ([location isKindOfClass:[PDFPage class]]) {
         id pointData = [args objectForKey:@"At"];
-        if ([pointData isKindOfClass:[NSData class]]) {
+        if ([mainWindowController interactionMode] == SKPresentationMode) {
+            [mainWindowController setCurrentPage:(PDFPage *)location];
+        } else if ([pointData isKindOfClass:[NSData class]]) {
             NSPoint point = [(NSData *)pointData pointValueAsQDPoint];
             [[self pdfView] goToDestination:[[PDFDestination alloc] 
initWithPage:(PDFPage *)location atPoint:point]];
         } else {
             [[self pdfView] goToCurrentPage:(PDFPage *)location];
         }
+    } else if ([mainWindowController interactionMode] == SKPresentationMode) {
     } else if ([location isKindOfClass:[PDFAnnotation class]]) {
-           [[self pdfView] scrollAnnotationToVisible:(PDFAnnotation 
*)location];
+        [[self pdfView] scrollAnnotationToVisible:(PDFAnnotation *)location];
     } else if ([location isKindOfClass:[PDFOutline class]]) {
         PDFDestination *dest = [(PDFOutline *)location destination];
         if (dest) {

Modified: trunk/SKMainTouchBarController.m
===================================================================
--- trunk/SKMainTouchBarController.m    2024-09-12 21:33:13 UTC (rev 14455)
+++ trunk/SKMainTouchBarController.m    2024-09-17 15:47:33 UTC (rev 14456)
@@ -291,33 +291,30 @@
 - (void)goToPreviousNextPage:(id)sender {
     NSInteger tag = [sender selectedSegment];
     if (tag == 0)
-        [mainController.pdfView goToPreviousPage:sender];
+        [mainController doGoToPreviousPage:sender];
     else if (tag == 1)
-        [mainController.pdfView goToNextPage:sender];
+        [mainController doGoToNextPage:sender];
 }
 
 - (void)goToPreviousNextFirstLastPage:(id)sender {
     NSInteger tag = [sender selectedSegment];
     if (tag == 0)
-        [mainController.pdfView goToFirstPage:sender];
+        [mainController doGoToFirstPage:sender];
     else if (tag == 1)
-        [mainController.pdfView goToNextPage:sender];
+        [mainController doGoToPreviousPage:sender];
     else if (tag == 2)
-        [mainController.pdfView goToPreviousPage:sender];
+        [mainController doGoToNextPage:sender];
     else if (tag == 3)
-        [mainController.pdfView goToLastPage:sender];
+        [mainController doGoToLastPage:sender];
 }
 
 - (void)zoomInActualOut:(id)sender {
     NSInteger tag = [sender selectedSegment];
     if ([mainController interactionMode] == SKPresentationMode) {
-        if (tag == 0) {
-            if ([mainController.pdfView autoScales])
-                [mainController.pdfView setScaleFactor:1.0];
-        } else if (tag == 1) {
-            [mainController.pdfView setScaleFactor:1.0];
+        if (tag == 0 || tag == 1) {
+            [mainController doZoomToActualSize:sender];
         } else if (tag == 2) {
-            [mainController.pdfView setAutoScales:YES];
+            [mainController doAutoScale:sender];
         }
     } else {
         if (tag == 0) {
@@ -368,9 +365,10 @@
 }
 
 - (void)handleScaleChangedNotification:(NSNotification *)notification {
-    [zoomInActualOutButton setEnabled:[mainController.pdfView canZoomOut] 
forSegment:0];
+    BOOL isPresentation = [mainController interactionMode] == 
SKPresentationMode;
+    [zoomInActualOutButton setEnabled:isPresentation == NO && 
[mainController.pdfView canZoomOut] forSegment:0];
     [zoomInActualOutButton setEnabled:YES forSegment:1];
-    [zoomInActualOutButton setEnabled:[mainController.pdfView canZoomIn] 
forSegment:2];
+    [zoomInActualOutButton setEnabled:isPresentation || 
[mainController.pdfView canZoomIn] forSegment:2];
 }
 
 - (void)handleToolModeChangedNotification:(NSNotification *)notification {
@@ -429,6 +427,7 @@
     [toolModeButton setEnabled:enabled];
     [annotationModeButton setEnabled:enabled];
     [noteButton setEnabled:enabled];
+    [self handleScaleChangedNotification:nil];
 }
 
 - (void)overviewChanged {

Modified: trunk/SKMainWindowController.h
===================================================================
--- trunk/SKMainWindowController.h      2024-09-12 21:33:13 UTC (rev 14455)
+++ trunk/SKMainWindowController.h      2024-09-17 15:47:33 UTC (rev 14456)
@@ -69,8 +69,8 @@
 };
 
 @class PDFAnnotation, PDFSelection, SKGroupedSearchResult;
-@class SKPDFView, SKSecondaryPDFView, SKStatusBar, SKFindController, 
SKSplitView, SKFieldEditor, SKOverviewView, SKSideWindow;
-@class SKLeftSideViewController, SKRightSideViewController, 
SKMainToolbarController, SKMainTouchBarController, SKProgressController, 
SKPresentationOptionsSheetController, SKNoteTypeSheetController, 
SKSnapshotWindowController;
+@class SKPDFView, SKSecondaryPDFView, SKPresentationView, SKStatusBar, 
SKFindController, SKSplitView, SKFieldEditor, SKOverviewView, SKSideWindow;
+@class SKLeftSideViewController, SKRightSideViewController, 
SKMainToolbarController, SKMainTouchBarController, SKProgressController, 
SKPresentationOptionsSheetController, SKNoteTypeSheetController, 
SKSnapshotWindowController, SKTransitionController;
 
 @interface SKMainWindowController : NSWindowController 
<SKSnapshotWindowControllerDelegate, SKThumbnailDelegate, 
SKFindControllerDelegate, SKPDFViewDelegate, SKPDFDocumentDelegate, 
NSTouchBarDelegate> {
     SKSplitView                         *splitView;
@@ -83,6 +83,8 @@
     
     SKSecondaryPDFView                  *secondaryPdfView;
     
+    SKPresentationView                  *presentationView;
+    
     SKLeftSideViewController            *leftSideController;
     SKRightSideViewController           *rightSideController;
     
@@ -224,6 +226,8 @@
 
 @property (nonatomic, nullable, readonly) NSString *searchString;
 
+- (SKTransitionController *)transitionControllerCreating:(BOOL)create;
+
 - (void)showSnapshotAtPageNumber:(NSInteger)pageNum forRect:(NSRect)rect 
scaleFactor:(CGFloat)scaleFactor autoFits:(BOOL)autoFits;
 - (void)showSnapshotsWithSetups:(NSArray *)setups;
 - (void)showNote:(PDFAnnotation *)annotation;
@@ -271,6 +275,8 @@
 
 @property (nonatomic, nullable, copy) NSString *pageLabel;
 
+@property (nonatomic, nullable, strong) PDFPage *currentPage;
+
 @property (nonatomic, readonly) SKInteractionMode interactionMode;
 
 @property (nonatomic) SKLeftSidePaneState leftSidePaneState;

Modified: trunk/SKMainWindowController.m
===================================================================
--- trunk/SKMainWindowController.m      2024-09-12 21:33:13 UTC (rev 14455)
+++ trunk/SKMainWindowController.m      2024-09-17 15:47:33 UTC (rev 14456)
@@ -107,6 +107,7 @@
 #import "NSObject_SKExtensions.h"
 #import "SKChainedUndoManager.h"
 #import "SKThumbnailStamp.h"
+#import "SKPresentationView.h"
 
 #define MULTIPLICATION_SIGN_CHARACTER (unichar)0x00d7
 
@@ -158,6 +159,7 @@
 #define LOCKED_KEY                  @"locked"
 #define CROPBOXES_KEY               @"cropBpxes"
 
+#define TRANSITION_KEY      @"transition"
 #define PAGETRANSITIONS_KEY @"pageTransitions"
 
 #define WINDOW_KEY @"window"
@@ -174,6 +176,8 @@
 
 static char SKMainWindowContentLayoutObservationContext;
 
+static char SKMainWindowTransitionsObservationContext;
+
 #define SKLeftSidePaneWidthKey @"SKLeftSidePaneWidth"
 #define SKRightSidePaneWidthKey @"SKRightSidePaneWidth"
 
@@ -212,7 +216,7 @@
 @implementation SKMainWindowController
 
 @synthesize mainWindow, splitView, topConstraint, centerContentView, 
pdfSplitView, pdfContentView, findBarTopConstraint, statusBar, pdfView, 
secondaryPdfView, leftSideController, rightSideController, leftSideContentView, 
rightSideContentView, presentationNotesDocument, presentationNotesOffset, 
notes, thumbnails, snapshots, searchResults, groupedSearchResults, tags, 
rating, pageLabel, interactionMode, placeholderPdfDocument;
-@dynamic pdfDocument, presentationOptions, presentationUndoManager, 
selectedNotes, hasNotes, widgetProperties, leftSidePaneState, 
rightSidePaneState, findPaneState, displaysFindPane, leftSidePaneIsOpen, 
rightSidePaneIsOpen, recentInfoNeedsUpdate, searchString, hasOverview, 
notesMenu;
+@dynamic pdfDocument, presentationOptions, presentationUndoManager, 
selectedNotes, hasNotes, widgetProperties, currentPage, leftSidePaneState, 
rightSidePaneState, findPaneState, displaysFindPane, leftSidePaneIsOpen, 
rightSidePaneIsOpen, recentInfoNeedsUpdate, searchString, hasOverview, 
notesMenu;
 
 + (BOOL)automaticallyNotifiesObserversOfPageLabel { return NO; }
 
@@ -1208,6 +1212,20 @@
     return YES;
 }
 
+- (PDFPage *)currentPage {
+    if ([self interactionMode] == SKPresentationMode)
+        return [presentationView page];
+    else
+        return [[self pdfView] currentPage];
+}
+
+- (void)setCurrentPage:(PDFPage *)page {
+    if ([self interactionMode] == SKPresentationMode)
+        return [presentationView setPage:page];
+    else
+        [[self pdfView] goToCurrentPage:page];
+}
+
 - (SKLeftSidePaneState)leftSidePaneState {
     return mwcFlags.leftSidePaneState;
 }
@@ -1399,8 +1417,21 @@
     groupedSearchResults = [newGroupedSearchResults mutableCopy];
 }
 
+- (SKTransitionController *)transitionControllerCreating:(BOOL)create {
+    SKTransitionController *transitionController = [presentationView 
transitionController];
+    if (transitionController == nil && create) {
+        transitionController = [[SKTransitionController alloc] init];
+        [transitionController addObserver:self forKeyPath:TRANSITION_KEY 
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) 
context:&SKMainWindowTransitionsObservationContext];
+        [transitionController addObserver:self forKeyPath:PAGETRANSITIONS_KEY 
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) 
context:&SKMainWindowTransitionsObservationContext];
+        if (presentationView == nil)
+            presentationView = [[SKPresentationView alloc] init];
+        [presentationView setTransitionController:transitionController];
+    }
+    return transitionController;
+}
+
 - (NSDictionary *)presentationOptions {
-    SKTransitionController *transitions = [pdfView transitionController];
+    SKTransitionController *transitions = [self 
transitionControllerCreating:NO];
     SKTransitionInfo *transition = [transitions transition];
     NSArray *pageTransitions = [transitions pageTransitions];
     NSMutableDictionary *options = nil;
@@ -1412,7 +1443,7 @@
 }
 
 - (void)setPresentationOptions:(NSDictionary *)dictionary {
-    SKTransitionController *transitions = [pdfView transitionController];
+    SKTransitionController *transitions = [self 
transitionControllerCreating:YES];
     [transitions setTransition:[[SKTransitionInfo alloc] 
initWithProperties:dictionary]];
     [transitions setPageTransitions:[dictionary 
objectForKey:PAGETRANSITIONS_KEY]];
 }
@@ -1545,7 +1576,7 @@
     }
     
     BOOL isPresentation = [self interactionMode] == SKPresentationMode;
-    NSView *oldView = isPresentation ? pdfView : splitView;
+    NSView *oldView = isPresentation ? presentationView : splitView;
     NSView *contentView = [oldView superview];
     BOOL hasStatus = isPresentation == NO && [statusBar isVisible];
     NSArray *constraints = @[
@@ -1609,7 +1640,8 @@
         animate = NO;
     
     BOOL isMainWindow = [overviewContentView window] == mainWindow;
-    NSView *newView = isMainWindow ? splitView : pdfView;
+    NSView *newView = isMainWindow ? splitView : presentationView;
+    NSView *newKeyView = isMainWindow ? pdfView : presentationView;
     NSView *contentView = [overviewContentView superview];
     BOOL hasStatus = isMainWindow && [statusBar isVisible];
     NSArray *constraints = @[
@@ -1625,8 +1657,7 @@
             }
             completionHandler:^{
                 [touchBarController overviewChanged];
-                if ([pdfView window] == [self window])
-                    [[self window] makeFirstResponder:pdfView];
+                [[newKeyView window] makeFirstResponder:newKeyView];
                 if (handler)
                     handler();
             }];
@@ -1634,8 +1665,7 @@
         [contentView replaceSubview:overviewContentView with:newView];
         [NSLayoutConstraint activateConstraints:constraints];
         [touchBarController overviewChanged];
-        if ([pdfView window] == [self window])
-            [[self window] makeFirstResponder:pdfView];
+        [[newKeyView window] makeFirstResponder:newKeyView];
         if (handler)
             handler();
     }
@@ -2160,8 +2190,11 @@
         if (presentationNotes == nil)
             presentationNotes = [[NSMutableArray alloc] init];
         [presentationNotes addObject:annotation];
-        if (page)
+        if (page) {
             [self updateThumbnailAtPageIndex:[page pageIndex]];
+            if ([presentationView page] == page)
+                [presentationView setNeedsDisplay:YES];
+        }
     } else {
         [[undoManager prepareWithInvocationTarget:[notification object]] 
removeAnnotation:annotation];
         
@@ -2183,6 +2216,8 @@
                     [self snapshotNeedsUpdate:wc placeholder:NO];
             }
             [secondaryPdfView setNeedsDisplayForAddedAnnotation:annotation 
onPage:page];
+            if ([self interactionMode] == SKPresentationMode && 
[presentationView page] == page)
+                [presentationView setNeedsDisplay:YES];
         }
     }
 }
@@ -2197,8 +2232,11 @@
         [[[self presentationUndoManager] 
prepareWithInvocationTarget:[notification object]] addAnnotation:annotation 
toPage:page];
         
         [presentationNotes removeObject:annotation];
-        if (page)
+        if (page) {
             [self updateThumbnailAtPageIndex:[page pageIndex]];
+            if ([presentationView page] == page)
+                [presentationView setNeedsDisplay:YES];
+        }
     } else {
         [[undoManager prepareWithInvocationTarget:[notification object]] 
addAnnotation:annotation toPage:page];
         
@@ -2223,6 +2261,8 @@
                     [self snapshotNeedsUpdate:wc placeholder:NO];
             }
             [secondaryPdfView setNeedsDisplayForRemovedAnnotation:annotation 
onPage:page];
+            if ([self interactionMode] == SKPresentationMode && 
[presentationView page] == page)
+                [presentationView setNeedsDisplay:YES];
         }
     }
 }
@@ -2246,6 +2286,8 @@
         }
         [secondaryPdfView setNeedsDisplayForRemovedAnnotation:annotation 
onPage:oldPage];
         [secondaryPdfView setNeedsDisplayForAddedAnnotation:annotation 
onPage:newPage];
+        if ([self interactionMode] == SKPresentationMode && ([presentationView 
page] == oldPage || [presentationView page] == newPage))
+            [presentationView setNeedsDisplay:YES];
     }
     
     [rightSideController.noteArrayController rearrangeObjects];
@@ -2489,6 +2531,12 @@
         @try { [overviewView removeObserver:self 
forKeyPath:@"selectionIndexPaths" 
context:&SKMainWindowThumbnailSelectionObservationContext]; }
         @catch (id e) {}
     }
+    if ([presentationView transitionController]) {
+        @try { [[presentationView transitionController] removeObserver:self 
forKeyPath:TRANSITION_KEY context:&SKMainWindowTransitionsObservationContext]; }
+        @catch (id e) {}
+        @try { [[presentationView transitionController] removeObserver:self 
forKeyPath:PAGETRANSITIONS_KEY 
context:&SKMainWindowTransitionsObservationContext]; }
+        @catch (id e) {}
+    }
 }
 
 #pragma mark Undo
@@ -2601,13 +2649,29 @@
             }
         }
         
+    } else if (context == &SKMainWindowTransitionsObservationContext) {
+        
+        id oldValue = [change objectForKey:NSKeyValueChangeOldKey];
+        if (oldValue == [NSNull null])
+            oldValue = nil;
+        
+        if ([keyPath isEqualToString:TRANSITION_KEY])
+            [[[self document] undoManager] registerUndoWithTarget:object 
selector:@selector(setTransition:) object:oldValue];
+        else if ([keyPath isEqualToString:PAGETRANSITIONS_KEY])
+            [[[self document] undoManager] registerUndoWithTarget:object 
selector:@selector(setPageTransitions:) object:oldValue];
+
     } else if (context == &SKMainWindowThumbnailSelectionObservationContext) {
         
         NSIndexSet *indexes = [overviewView selectionIndexes];
         if ([indexes count] == 1 && mwcFlags.updatingThumbnailSelection == 0) {
             NSUInteger pageIndex = [indexes firstIndex];
-            if ([[pdfView currentPage] pageIndex] != pageIndex)
-                [pdfView goToCurrentPage:[[pdfView document] 
pageAtIndex:pageIndex]];
+            if ([self interactionMode] == SKPresentationMode) {
+                if ([[presentationView page] pageIndex] != pageIndex)
+                    [presentationView setPage:[[pdfView document] 
pageAtIndex:pageIndex]];
+            } else {
+                if ([[pdfView currentPage] pageIndex] != pageIndex)
+                    [pdfView goToCurrentPage:[[pdfView document] 
pageAtIndex:pageIndex]];
+            }
         } else if ([indexes count] == 0) {
             mwcFlags.updatingThumbnailSelection = 1;
             [overviewView setSelectionIndexes:[NSIndexSet 
indexSetWithIndex:[[pdfView currentPage] pageIndex]]];
@@ -2705,6 +2769,9 @@
                         [self updateRightStatus];
                     }
                 }
+                
+                if ([self interactionMode] == SKPresentationMode && 
[presentationView page] == page)
+                    [presentationView setNeedsDisplay:YES];
             }
             
             if (mwcFlags.autoResizeNoteRows) {

Modified: trunk/SKMainWindowController_Actions.m
===================================================================
--- trunk/SKMainWindowController_Actions.m      2024-09-12 21:33:13 UTC (rev 
14455)
+++ trunk/SKMainWindowController_Actions.m      2024-09-17 15:47:33 UTC (rev 
14456)
@@ -80,6 +80,7 @@
 #import "PDFSelection_SKExtensions.h"
 #import "SKOutlineView.h"
 #import "SKOverviewView.h"
+#import "SKPresentationView.h"
 #import "NSUserDefaults_SKExtensions.h"
 
 #define STATUSBAR_HEIGHT 22.0
@@ -329,20 +330,32 @@
 }
 
 - (IBAction)doGoToNextPage:(id)sender {
-    [pdfView goToNextPage:sender];
+    if ([self interactionMode] == SKPresentationMode)
+        [presentationView goToNextPage:sender];
+    else
+        [pdfView goToNextPage:sender];
 }
 
 - (IBAction)doGoToPreviousPage:(id)sender {
-    [pdfView goToPreviousPage:sender];
+    if ([self interactionMode] == SKPresentationMode)
+        [presentationView goToPreviousPage:sender];
+    else
+        [pdfView goToPreviousPage:sender];
 }
 
 
 - (IBAction)doGoToFirstPage:(id)sender {
-    [pdfView goToFirstPage:sender];
+    if ([self interactionMode] == SKPresentationMode)
+        [presentationView goToFirstPage:sender];
+    else
+        [pdfView goToFirstPage:sender];
 }
 
 - (IBAction)doGoToLastPage:(id)sender {
-    [pdfView goToLastPage:sender];
+    if ([self interactionMode] == SKPresentationMode)
+        [presentationView goToLastPage:sender];
+    else
+        [pdfView goToLastPage:sender];
 }
 
 - (IBAction)doGoToPage:(id)sender {
@@ -364,10 +377,14 @@
 
 - (IBAction)doGoBack:(id)sender {
     [pdfView goBack:sender];
+    if ([self interactionMode] == SKPresentationMode)
+        [presentationView setPage:[pdfView currentPage]];
 }
 
 - (IBAction)doGoForward:(id)sender {
     [pdfView goForward:sender];
+    if ([self interactionMode] == SKPresentationMode)
+        [presentationView setPage:[pdfView currentPage]];
 }
 
 - (IBAction)goToMarkedPage:(id)sender {
@@ -375,6 +392,7 @@
     NSUInteger currentPageIndex = [[pdfView currentPage] pageIndex];
     if (markedPage.pageIndex == NSNotFound || [pdfDoc isLocked] || [pdfDoc 
pageCount] == 0) {
         NSBeep();
+        return;
     } else if (beforeMarkedPage.pageIndex != NSNotFound) {
         beforeMarkedPage.pageIndex = MIN(beforeMarkedPage.pageIndex, [pdfDoc 
pageCount] - 1);
         [pdfView goToCurrentDestination:beforeMarkedPage];
@@ -383,6 +401,8 @@
         markedPage.pageIndex = MIN(markedPage.pageIndex, [pdfDoc pageCount] - 
1);
         [pdfView goToCurrentDestination:markedPage];
     }
+    if ([self interactionMode] == SKPresentationMode)
+        [presentationView setPage:[pdfView currentPage]];
 }
 
 - (IBAction)markPage:(id)sender {
@@ -409,7 +429,10 @@
 }
 
 - (IBAction)doZoomToActualSize:(id)sender {
-    [pdfView setScaleFactor:1.0];
+    if ([self interactionMode] == SKPresentationMode)
+        [presentationView setAutoScales:NO];
+    else
+        [pdfView setScaleFactor:1.0];
 }
 
 - (IBAction)doZoomToSelection:(id)sender {
@@ -468,12 +491,15 @@
 }
 
 - (IBAction)doAutoScale:(id)sender {
-    [pdfView setAutoScales:YES];
+    if ([self interactionMode] == SKPresentationMode)
+        [presentationView setAutoScales:YES];
+    else
+        [pdfView setAutoScales:YES];
 }
 
 - (IBAction)toggleAutoScale:(id)sender {
     if ([self interactionMode] == SKPresentationMode)
-        [pdfView toggleAutoActualSize:sender];
+        [presentationView toggleAutoActualSize:sender];
     else
         [pdfView setAutoScales:[pdfView autoScales] == NO];
 }
@@ -1226,6 +1252,8 @@
             [self toggleLeftSidePane:sender];
         else if ([self hasOverview])
             [self hideOverviewAnimating:YES];
+        else if ([presentationView hasBlackout])
+            [presentationView toggleBlackout:sender];
         else
             [self exitPresentation];
     } else if ([self hasOverview]) {

Modified: trunk/SKMainWindowController_FullScreen.m
===================================================================
--- trunk/SKMainWindowController_FullScreen.m   2024-09-12 21:33:13 UTC (rev 
14455)
+++ trunk/SKMainWindowController_FullScreen.m   2024-09-17 15:47:33 UTC (rev 
14456)
@@ -65,6 +65,7 @@
 #import "NSColor_SKExtensions.h"
 #import "SKStatusBar.h"
 #import "SKAnimatedBorderlessWindow.h"
+#import "SKPresentationView.h"
 #import "NSWindow_SKExtensions.h"
 
 #define MAINWINDOWFRAME_KEY         @"windowFrame"
@@ -190,61 +191,6 @@
     return alternateScreens;
 }
 
-- (void)enterPresentationMode {
-    NSScrollView *scrollView = [pdfView scrollView];
-    [savedNormalSetup setObject:[NSNumber numberWithBool:[scrollView 
hasHorizontalScroller]] forKey:HASHORIZONTALSCROLLER_KEY];
-    [savedNormalSetup setObject:[NSNumber numberWithBool:[scrollView 
hasVerticalScroller]] forKey:HASVERTICALSCROLLER_KEY];
-    [savedNormalSetup setObject:[NSNumber numberWithBool:[scrollView 
autohidesScrollers]] forKey:AUTOHIDESSCROLLERS_KEY];
-    [savedNormalSetup setObject:[NSNumber numberWithBool:[scrollView 
drawsBackground]] forKey:DRAWSBACKGROUND_KEY];
-    // Set up presentation mode
-    [pdfView setNeedsRewind:YES];
-    [pdfView setBackgroundColor:[NSColor clearColor]];
-    [pdfView setAutoScales:YES];
-    [pdfView setDisplayMode:kPDFDisplaySinglePage];
-    [pdfView setDisplayBox:kPDFDisplayBoxCropBox];
-    [pdfView setDisplaysPageBreaks:NO];
-    [scrollView setAutohidesScrollers:YES];
-    [scrollView setHasHorizontalScroller:NO];
-    [scrollView setHasVerticalScroller:NO];
-    [scrollView setDrawsBackground:NO];
-    if (mwcFlags.fullSizeContent) {
-        [scrollView setAutomaticallyAdjustsContentInsets:YES];
-        [scrollView setContentInsets:NSEdgeInsetsZero];
-    }
-    
-    [pdfView setCurrentSelection:nil];
-    if ([pdfView hasReadingBar])
-        [pdfView toggleReadingBar];
-    
-    if ([[NSUserDefaults standardUserDefaults] 
boolForKey:SKResizablePresentationKey]) {
-        [[self window] setStyleMask:[[self window] styleMask] | 
NSWindowStyleMaskResizable];
-        [[self window] setHasShadow:YES];
-    }
-    
-    // prevent sleep
-    if (activity == nil)
-        activity = [[NSProcessInfo processInfo] 
beginActivityWithOptions:NSActivityUserInitiated | 
NSActivityIdleDisplaySleepDisabled | NSActivityIdleSystemSleepDisabled  
reason:@"Presentation"];
-}
-
-- (void)exitPresentationMode {
-    if (activity) {
-        [[NSProcessInfo processInfo] endActivity:activity];
-        activity = nil;
-    }
-    
-    [self removePresentationNotesNavigation];
-    
-    NSScrollView *scrollView = [pdfView scrollView];
-    [scrollView setHasHorizontalScroller:[[savedNormalSetup 
objectForKey:HASHORIZONTALSCROLLER_KEY] boolValue]];
-    [scrollView setHasVerticalScroller:[[savedNormalSetup 
objectForKey:HASVERTICALSCROLLER_KEY] boolValue]];
-    [scrollView setAutohidesScrollers:[[savedNormalSetup 
objectForKey:AUTOHIDESSCROLLERS_KEY] boolValue]];
-    [scrollView setDrawsBackground:[[savedNormalSetup 
objectForKey:DRAWSBACKGROUND_KEY] boolValue]];
-    if (mwcFlags.fullSizeContent && [[findController view] window]) {
-        [scrollView setAutomaticallyAdjustsContentInsets:NO];
-        [scrollView setContentInsets:NSEdgeInsetsMake([findController height] 
+ titleBarHeight, 0.0, 0.0, 0.0)];
-    }
-}
-
 - (void)showNotesForPresentationWindow:(NSWindow *)window {
     PDFDocument *pdfDoc = [[self presentationNotesDocument] pdfDocument];
     NSInteger offset = [self presentationNotesOffset];
@@ -284,7 +230,8 @@
         [mainWindow makeKeyAndOrderFront:nil];
     }
     [mainWindow display];
-    [mainWindow makeFirstResponder:[self hasOverview] ? overviewView : 
pdfView];
+    if ([pdfView window] == mainWindow)
+        [mainWindow makeFirstResponder:pdfView];
     [mainWindow recalculateKeyViewLoop];
     [mainWindow setDelegate:self];
     [mainWindow makeKeyWindow];
@@ -327,36 +274,27 @@
     [window setAlphaValue:0.0];
 }
 
-- (void)displayStaticContentInPresentationWindow:(NSWindow *)window {
-    NSRect rect = [[window contentView] bounds];
-    NSBitmapImageRep *imageRep = nil;
-    
-    if ([pdfView window] == window) {
-        imageRep = [pdfView bitmapImageRepCachingDisplay];
-    } else {
-        PDFPage *page = [pdfView currentPage];
-        NSRect pageRect = [page boundsForBox:kPDFDisplayBoxCropBox];
-        if (([page rotation] % 180) != 0)
-            pageRect = NSMakeRect(0.0, 0.0, NSHeight(pageRect), 
NSWidth(pageRect));
-        CGFloat scale = fmin(NSHeight(rect) / NSHeight(pageRect), 
NSWidth(rect) / NSWidth(pageRect));
-        pageRect = NSInsetRect(rect, 0.5 * (NSWidth(rect) - scale * 
NSWidth(pageRect)), 0.5 * (NSHeight(rect) - scale * NSHeight(pageRect)));
-        imageRep = [[window contentView] 
bitmapImageRepForCachingDisplayInRect:rect];
-        CGContextRef context = [[NSGraphicsContext 
graphicsContextWithBitmapImageRep:imageRep] CGContext];
-        CGContextSetFillColorWithColor(context, 
CGColorGetConstantColor(kCGColorWhite));
-        CGContextFillRect(context, 
SKPixelAlignedRect(NSRectToCGRect(pageRect), context));
-        CGContextSaveGState(context);
-        CGContextTranslateCTM(context, NSMinX(pageRect), NSMinY(pageRect));
-        CGContextScaleCTM(context, scale, scale);
-        [page drawWithBox:kPDFDisplayBoxCropBox toContext:context];
-        CGContextRestoreGState(context);
+#pragma mark SKPresentationView delegate
+
+- (void)handlePresentationViewPageChanged:(NSNotification *)notification {
+    PDFPage *page = [presentationView page];
+    if (page) {
+        if (page != [pdfView currentPage]) {
+            // make sure we can synchronize the page between the 
presentationView and the pdfView
+            if ([pdfView displayMode] != kPDFDisplaySinglePage)
+                [pdfView setExtendedDisplayMode:kPDFDisplaySinglePage];
+            [pdfView goToCurrentPage:page];
+        }
+        if ([self presentationNotesDocument]) {
+            PDFDocument *pdfDoc = [[self presentationNotesDocument] 
pdfDocument];
+            NSInteger offset = [self presentationNotesOffset];
+            NSUInteger pageIndex = (NSUInteger)MAX(0, MIN((NSInteger)[pdfDoc 
pageCount], (NSInteger)pageIndex + offset));
+            if ([self presentationNotesDocument] == [self document])
+                [[presentationPreview pdfView] goToCurrentPage:[pdfDoc 
pageAtIndex:pageIndex]];
+            else
+                [[self presentationNotesDocument] setCurrentPage:[pdfDoc 
pageAtIndex:pageIndex]];
+        }
     }
-    
-    NSImage *image = [[NSImage alloc] initWithSize:rect.size];
-    [image addRepresentation:imageRep];
-    
-    if ([pdfView window] == window)
-        [pdfView removeFromSuperview];
-    [[window addImageViewWithImage:image] 
setContentFilters:SKColorEffectFilters()];
 }
 
 #pragma mark API
@@ -412,7 +350,15 @@
     
     NSWindow *presentationWindow = [[SKFullScreenWindow alloc] 
initWithContentRect:[screen ?: [mainWindow screen] frame]];
     [presentationWindow setAlphaValue:0.0];
-    [self displayStaticContentInPresentationWindow:presentationWindow];
+    
+    if (presentationView == nil)
+        presentationView = [[SKPresentationView alloc] 
initWithFrame:[[presentationWindow contentView] bounds]];
+    [[presentationWindow contentView] 
addSubviewWithConstraints:presentationView];
+    [presentationWindow makeFirstResponder:presentationView];
+    [presentationView setAutoScales:YES];
+    [presentationView setPage:[pdfView currentPage]];
+    [[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(handlePresentationViewPageChanged:) 
name:SKPresentationViewPageChangedNotification object:presentationView];
+    
     [presentationWindow orderFront:nil];
     
     if ([self presentationNotesDocument])
@@ -429,7 +375,7 @@
             [[[presentationPreview window] animator] setAlphaValue:1.0];
         }
         completionHandler:^{
-            PDFPage *page = [[self pdfView] currentPage];
+            //PDFPage *page = [[self pdfView] currentPage];
             
             if ([[[self window] tabbedWindows] count] > 1) {
                 NSUInteger tabIndex = [[[self window] tabbedWindows] 
indexOfObject:[self window]];
@@ -454,21 +400,19 @@
             if ([self hasOverview])
                 [self hideOverviewAnimating:NO];
             
-            [self enterPresentationMode];
+            if ([[NSUserDefaults standardUserDefaults] 
boolForKey:SKResizablePresentationKey]) {
+                [[self window] setStyleMask:[[self window] styleMask] | 
NSWindowStyleMaskResizable];
+                [[self window] setHasShadow:YES];
+            }
             
-            [[[[presentationWindow contentView] subviews] firstObject] 
removeFromSuperview];
-            [[presentationWindow contentView] 
addSubviewWithConstraints:pdfView];
-            [pdfView layoutDocumentView];
-            [pdfView requiresDisplay];
-            [presentationWindow makeFirstResponder:pdfView];
-            [presentationWindow recalculateKeyViewLoop];
+            // prevent sleep
+            if (activity == nil)
+                activity = [[NSProcessInfo processInfo] 
beginActivityWithOptions:NSActivityUserInitiated | 
NSActivityIdleDisplaySleepDisabled | NSActivityIdleSystemSleepDisabled  
reason:@"Presentation"];
+            
             [presentationWindow setDelegate:self];
 
-            if ([[pdfView currentPage] isEqual:page] == NO)
-                [pdfView goToPage:page];
+            [presentationView didOpen];
             
-            [pdfView setPresentationMode:YES];
-            
             [touchBarController interactionModeChanged];
             
             mwcFlags.isSwitchingFullScreen = 0;
@@ -479,9 +423,6 @@
     if ([self canExitPresentation] == NO)
         return;
     
-    NSColor *backgroundColor = [PDFView defaultBackgroundColor];
-    PDFPage *page = [[self pdfView] currentPage];
-    
     mwcFlags.isSwitchingFullScreen = 1;
     
     if ([self leftSidePaneIsOpen])
@@ -495,13 +436,11 @@
     presentationNotes = nil;
     presentationUndoManager = nil;
     
-    // do this first, otherwise the navigation window may be covered by 
fadeWindow and then reveiled again, which looks odd
-    [pdfView setPresentationMode:NO];
+    [presentationView willClose];
+    [[NSNotificationCenter defaultCenter] removeObserver:self 
name:SKPresentationViewPageChangedNotification object:presentationView];
     
     NSWindow *presentationWindow = [self window];
     
-    [self displayStaticContentInPresentationWindow:presentationWindow];
-    
     while ([[presentationWindow childWindows] count] > 0) {
         NSWindow *childWindow = [[presentationWindow childWindows] lastObject];
         [presentationWindow removeChildWindow:childWindow];
@@ -513,21 +452,20 @@
     
     interactionMode = SKNormalMode;
     
-    // this should be done before exitPresentationMode to get a smooth 
transition
-    [pdfContentView addSubview:pdfView positioned:NSWindowBelow 
relativeTo:nil];
-    [NSLayoutConstraint activateConstraints:@[
-        [[pdfView leadingAnchor] constraintEqualToAnchor:[pdfContentView 
leadingAnchor]],
-        [[pdfContentView trailingAnchor] constraintEqualToAnchor:[pdfView 
trailingAnchor]],
-        [[pdfView topAnchor] constraintEqualToAnchor:[pdfContentView 
topAnchor]],
-        [[pdfContentView bottomAnchor] constraintEqualToAnchor:[pdfView 
bottomAnchor]]]];
-    [pdfView setBackgroundColor:backgroundColor];
-    [secondaryPdfView setBackgroundColor:backgroundColor];
-    if ([self hasOverview])
-        [overviewContentView removeFromSuperview];
+    if (activity) {
+        [[NSProcessInfo processInfo] endActivity:activity];
+        activity = nil;
+    }
     
-    [self exitPresentationMode];
-    [self applyPDFSettings:savedNormalSetup rewind:YES];
+    [self removePresentationNotesNavigation];
     
+    PDFDisplayMode mode = [[savedNormalSetup objectForKey:@"displayMode"] 
integerValue];
+    if (mode == kPDFDisplaySinglePageContinuous && [[savedNormalSetup 
objectForKey:@"displayDirection"] boolValue])
+        mode = kPDFDisplayHorizontalContinuous;
+    //make sure we reset the display mode
+    if (mode != [pdfView extendedDisplayMode])
+        [pdfView setExtendedDisplayModeAndRewind:mode];
+    
     [pdfView layoutDocumentView];
     [pdfView requiresDisplay];
     
@@ -537,9 +475,6 @@
     }
     mwcFlags.thumbnailsUpdatedDuringPresentaton = 0;
     
-    if ([[[self pdfView] currentPage] isEqual:page] == NO)
-        [[self pdfView] goToCurrentPage:page];
-    
     mwcFlags.isSwitchingFullScreen = 0;
     
     [self forceSubwindowsOnTop:NO];
@@ -574,7 +509,11 @@
             [[[presentationPreview window] animator] setAlphaValue:0.0];
         }
         completionHandler:^{
+            if ([overviewContentView window] == presentationWindow)
+                [overviewContentView removeFromSuperview];
             [presentationWindow orderOut:nil];
+            [presentationView setPage:nil];
+            [presentationView setAutoScales:NO];
             if (presentationPreview) {
                 [[presentationPreview window] 
setAnimationBehavior:NSWindowAnimationBehaviorNone];
                 [presentationPreview close];

Modified: trunk/SKMainWindowController_UI.m
===================================================================
--- trunk/SKMainWindowController_UI.m   2024-09-12 21:33:13 UTC (rev 14455)
+++ trunk/SKMainWindowController_UI.m   2024-09-17 15:47:33 UTC (rev 14456)
@@ -90,6 +90,7 @@
 #import "NSObject_SKExtensions.h"
 #import "NSPasteboard_SKExtensions.h"
 #import "SKApplicationController.h"
+#import "SKPresentationView.h"
 
 #define NOTES_KEY       @"notes"
 #define SNAPSHOTS_KEY   @"snapshots"
@@ -483,11 +484,16 @@
     if ([[aNotification object] 
isEqual:leftSideController.thumbnailTableView]) {
         if (mwcFlags.updatingThumbnailSelection == 0) {
             NSInteger row = [leftSideController.thumbnailTableView 
selectedRow];
-            if (row != -1)
-                [pdfView goToCurrentPage:[[pdfView document] pageAtIndex:row]];
-            
-            if ([self interactionMode] == SKPresentationMode && 
[[NSUserDefaults standardUserDefaults] 
boolForKey:SKAutoHidePresentationContentsKey])
-                [self hideSideWindow];
+            if ([self interactionMode] == SKPresentationMode) {
+                if (row != -1)
+                    [presentationView setPage:[[pdfView document] 
pageAtIndex:row]];
+
+                if ([[NSUserDefaults standardUserDefaults] 
boolForKey:SKAutoHidePresentationContentsKey])
+                    [self hideSideWindow];
+            } else {
+                if (row != -1)
+                    [pdfView goToCurrentPage:[[pdfView document] 
pageAtIndex:row]];
+            }
         }
     } else if ([[aNotification object] 
isEqual:rightSideController.snapshotTableView]) {
         NSInteger row = [[aNotification object] selectedRow];
@@ -1564,18 +1570,6 @@
     [self showSnapshotAtPageNumber:pageNum forRect:rect 
scaleFactor:scaleFactor autoFits:autoFits];
 }
 
-- (void)PDFViewExitPresentation:(PDFView *)sender {
-    [self exitPresentation];
-}
-
-- (void)PDFViewTogglePages:(PDFView *)sender {
-    [self toggleOverview:sender];
-}
-
-- (void)PDFViewToggleContents:(PDFView *)sender {
-    [self toggleLeftSidePane:sender];
-}
-
 - (void)PDFView:(PDFView *)sender rotatePageAtIndex:(NSUInteger)idx 
by:(NSInteger)rotation {
     [self rotatePageAtIndex:idx by:rotation];
 }
@@ -1801,7 +1795,7 @@
     } else if (action == @selector(doZoomOut:)) {
         return [self interactionMode] != SKPresentationMode && [self 
hasOverview] == NO && [pdfView canZoomOut];
     } else if (action == @selector(doZoomToActualSize:)) {
-        return [[self pdfDocument] isLocked] == NO && ([pdfView autoScales] || 
fabs([pdfView scaleFactor] - 1.0) > 0.0);
+        return [[self pdfDocument] isLocked] == NO && ([self interactionMode] 
== SKPresentationMode ? [presentationView autoScales] : ([pdfView autoScales] 
|| fabs([pdfView scaleFactor] - 1.0) > 0.0));
     } else if (action == @selector(doZoomToPhysicalSize:)) {
         return [self interactionMode] != SKPresentationMode && [self 
hasOverview] == NO && [[self pdfDocument] isLocked] == NO && ([pdfView 
autoScales] || fabs([pdfView physicalScaleFactor] - 1.0 ) > 0.001);
     } else if (action == @selector(doZoomToSelection:)) {
@@ -1818,9 +1812,9 @@
         }
         return [self interactionMode] != SKPresentationMode && [self 
hasOverview] == NO && [[self pdfDocument] isLocked] == NO;
     } else if (action == @selector(doAutoScale:)) {
-        return [[self pdfDocument] isLocked] == NO && [pdfView autoScales] == 
NO && [self hasOverview] == NO;
+        return [[self pdfDocument] isLocked] == NO && ([self interactionMode] 
== SKPresentationMode ? [presentationView autoScales] == NO : [pdfView 
autoScales] == NO) && [self hasOverview] == NO;
     } else if (action == @selector(toggleAutoScale:)) {
-        [menuItem setState:[pdfView autoScales] ? NSControlStateValueOn : 
NSControlStateValueOff];
+        [menuItem setState:([self interactionMode] == SKPresentationMode ? 
[presentationView autoScales] : [pdfView autoScales]) ? NSControlStateValueOn : 
NSControlStateValueOff];
         return [[self pdfDocument] isLocked] == NO && [self hasOverview] == NO;
     } else if (action == @selector(rotateRight:) || action == 
@selector(rotateLeft:) || action == @selector(rotateAllRight:) || action == 
@selector(rotateAllLeft:)) {
         return [self interactionMode] != SKPresentationMode && [[self 
pdfDocument] isLocked] == NO;
@@ -1996,16 +1990,6 @@
     [self updateLeftStatus];
     if ([[NSUserDefaults standardUserDefaults] 
boolForKey:SKDisplayPageBoundsKey])
         [self updateRightStatus];
-
-    if ([self interactionMode] == SKPresentationMode && [self 
presentationNotesDocument]) {
-        PDFDocument *pdfDoc = [[self presentationNotesDocument] pdfDocument];
-        NSInteger offset = [self presentationNotesOffset];
-        pageIndex = (NSUInteger)MAX(0, MIN((NSInteger)[pdfDoc pageCount], 
(NSInteger)pageIndex + offset));
-        if ([self presentationNotesDocument] == [self document])
-            [[presentationPreview pdfView] goToCurrentPage:[pdfDoc 
pageAtIndex:pageIndex]];
-        else
-            [[self presentationNotesDocument] setCurrentPage:[pdfDoc 
pageAtIndex:pageIndex]];
-    }
     
     mwcFlags.recentInfoNeedsUpdate = 1;
 }

Modified: trunk/SKNavigationWindow.h
===================================================================
--- trunk/SKNavigationWindow.h  2024-09-12 21:33:13 UTC (rev 14455)
+++ trunk/SKNavigationWindow.h  2024-09-17 15:47:33 UTC (rev 14456)
@@ -41,10 +41,10 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-@class SKPDFView, SKNavigationToolTipView, SKNavigationButton;
+@class SKPresentationView, SKNavigationToolTipView, SKNavigationButton;
 
 @interface SKHUDWindow : SKAnimatedBorderlessWindow
-- (instancetype)initWithPDFView:(SKPDFView *)pdfView;
+- (instancetype)initWithView:(SKPresentationView *)pdfView;
 - (void)showForWindow:(NSWindow *)window;
 - (void)handleParentWindowDidResizeNotification:(NSNotification *)notification;
 @end
@@ -57,7 +57,7 @@
     SKNavigationButton *cursorButton;
     SKNavigationButton *closeButton;
 }
-- (void)handleScaleChangedNotification:(NSNotification *)notification;
+- (void)handleAutoScalesChangedNotification:(NSNotification *)notification;
 - (void)handlePageChangedNotification:(NSNotification *)notification;
 @end
 

Modified: trunk/SKNavigationWindow.m
===================================================================
--- trunk/SKNavigationWindow.m  2024-09-12 21:33:13 UTC (rev 14455)
+++ trunk/SKNavigationWindow.m  2024-09-17 15:47:33 UTC (rev 14456)
@@ -37,9 +37,8 @@
  */
 
 #import "SKNavigationWindow.h"
-#import <Quartz/Quartz.h>
 #import "NSBezierPath_SKExtensions.h"
-#import "SKPDFView.h"
+#import "SKPresentationView.h"
 #import "NSParagraphStyle_SKExtensions.h"
 #import "NSGeometry_SKExtensions.h"
 #import "PDFView_SKExtensions.h"
@@ -74,8 +73,8 @@
 
 @implementation SKHUDWindow
 
-- (instancetype)initWithPDFView:(SKPDFView *)pdfView {
-    NSScreen *screen = [[pdfView window] screen] ?: [NSScreen mainScreen];
+- (instancetype)initWithView:(SKPresentationView *)presentationView {
+    NSScreen *screen = [[presentationView window] screen] ?: [NSScreen 
mainScreen];
     CGFloat width = 5 * BUTTON_WIDTH + 3 * SEP_WIDTH + 2 * BUTTON_MARGIN;
     NSRect contentRect = NSMakeRect(NSMidX([screen frame]) - 0.5 * width, 
NSMinY([screen frame]) + WINDOW_OFFSET, width, BUTTON_HEIGHT + 2 * 
BUTTON_MARGIN);
     self = [super initWithContentRect:contentRect];
@@ -83,7 +82,7 @@
         
         [self setIgnoresMouseEvents:NO];
         [self setDisplaysWhenScreenProfileChanges:YES];
-        [self setLevel:[[pdfView window] level]];
+        [self setLevel:[[presentationView window] level]];
         [self setMovableByWindowBackground:YES];
         
         contentRect.origin = NSZeroPoint;
@@ -147,26 +146,26 @@
 
 @implementation SKNavigationWindow
 
-- (instancetype)initWithPDFView:(SKPDFView *)pdfView {
-    self = [super initWithPDFView:pdfView];
+- (instancetype)initWithView:(SKPresentationView *)presentationView {
+    self = [super initWithView:presentationView];
     if (self) {
         
         NSRect rect = NSMakeRect(BUTTON_MARGIN, BUTTON_MARGIN, BUTTON_WIDTH, 
BUTTON_HEIGHT);
         previousButton = [[SKNavigationButton alloc] initWithFrame:rect];
-        [previousButton setTarget:pdfView];
+        [previousButton setTarget:presentationView];
         [previousButton setAction:@selector(goToPreviousPage:)];
         [previousButton setToolTip:NSLocalizedString(@"Previous", @"Tool tip 
message")];
         [previousButton setPath:previousButtonPath(rect.size)];
-        [previousButton setEnabled:[pdfView canGoToPreviousPage]];
+        [previousButton setEnabled:[presentationView canGoToPreviousPage]];
         [[self contentView] addSubview:previousButton];
         
         rect.origin.x = NSMaxX(rect);
         nextButton = [[SKNavigationButton alloc] initWithFrame:rect];
-        [nextButton setTarget:pdfView];
+        [nextButton setTarget:presentationView];
         [nextButton setAction:@selector(goToNextPage:)];
         [nextButton setToolTip:NSLocalizedString(@"Next", @"Tool tip 
message")];
         [nextButton setPath:nextButtonPath(rect.size)];
-        [nextButton setEnabled:[pdfView canGoToNextPage]];
+        [nextButton setEnabled:[presentationView canGoToNextPage]];
         [[self contentView] addSubview:nextButton];
         
         rect.origin.x = NSMaxX(rect);
@@ -176,19 +175,19 @@
         rect.origin.x = NSMaxX(rect);
         rect.size.width = BUTTON_WIDTH;
         zoomButton = [[SKNavigationButton alloc] initWithFrame:rect];
-        [zoomButton setTarget:pdfView];
+        [zoomButton setTarget:presentationView];
         [zoomButton setAction:@selector(toggleAutoActualSize:)];
         [zoomButton setToolTip:NSLocalizedString(@"Fit to Screen", @"Tool tip 
message")];
         [zoomButton setAlternateToolTip:NSLocalizedString(@"Actual Size", 
@"Tool tip message")];
         [zoomButton setPath:zoomButtonPath(rect.size)];
         [zoomButton setAlternatePath:alternateZoomButtonPath(rect.size)];
-        [zoomButton setState:[pdfView autoScales]];
+        [zoomButton setState:[presentationView autoScales]];
         [zoomButton setButtonType:NSPushOnPushOffButton];
         [[self contentView] addSubview:zoomButton];
-        [[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(handleScaleChangedNotification:) 
-                                                     
name:PDFViewScaleChangedNotification object:pdfView];
+        [[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(handleAutoScalesChangedNotification:)
+                                                     
name:SKPresentationViewAutoScalesChangedNotification object:presentationView];
         [[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(handlePageChangedNotification:) 
-                                                     
name:PDFViewPageChangedNotification object:pdfView];
+                                                     
name:SKPresentationViewPageChangedNotification object:presentationView];
         
         rect.origin.x = NSMaxX(rect);
         rect.size.width = SEP_WIDTH;
@@ -197,7 +196,7 @@
         rect.origin.x = NSMaxX(rect);
         rect.size.width = BUTTON_WIDTH;
         cursorButton = [[SKNavigationButton alloc] initWithFrame:rect];
-        [cursorButton setTarget:pdfView];
+        [cursorButton setTarget:presentationView];
         [cursorButton setAction:@selector(showCursorStyleWindow:)];
         [cursorButton setToolTip:NSLocalizedString(@"Pointer", @"Tool tip 
message")];
         [cursorButton setPath:cursorButtonPath(rect.size)];
@@ -210,13 +209,13 @@
         rect.origin.x = NSMaxX(rect);
         rect.size.width = BUTTON_WIDTH;
         closeButton = [[SKNavigationButton alloc] initWithFrame:rect];
-        [closeButton setTarget:pdfView];
+        [closeButton setTarget:presentationView];
         [closeButton setAction:@selector(exitPresentation:)];
         [closeButton setToolTip:NSLocalizedString(@"Close", @"Tool tip 
message")];
         [closeButton setPath:closeButtonPath(rect.size)];
         [[self contentView] addSubview:closeButton];
         
-        NSScreen *screen = [[pdfView window] screen] ?: [NSScreen mainScreen];
+        NSScreen *screen = [[presentationView window] screen] ?: [NSScreen 
mainScreen];
         NSRect frame;
         frame.size.width = 5 * BUTTON_WIDTH + 3 * SEP_WIDTH + 2 * 
BUTTON_MARGIN;
         frame.size.height = BUTTON_HEIGHT + 2.0 * BUTTON_MARGIN;
@@ -233,7 +232,7 @@
     [super orderOut:sender];
 }
 
-- (void)handleScaleChangedNotification:(NSNotification *)notification {
+- (void)handleAutoScalesChangedNotification:(NSNotification *)notification {
     [zoomButton setState:[[notification object] autoScales] ? 
NSControlStateValueOn : NSControlStateValueOff];
 }
 
@@ -251,8 +250,8 @@
 
 @implementation SKCursorStyleWindow
 
-- (instancetype)initWithPDFView:(SKPDFView *)pdfView {
-    self = [super initWithPDFView:pdfView];
+- (instancetype)initWithView:(SKPresentationView *)presentationView {
+    self = [super initWithView:presentationView];
     if (self) {
         
         NSRect rect;
@@ -270,8 +269,8 @@
         rect = [styleButton frame];
         rect.origin.x = rect.origin.y = BUTTON_MARGIN;
         [styleButton setFrame:rect];
-        [styleButton selectSegmentWithTag:[pdfView cursorStyle]];
-        [styleButton setTarget:pdfView];
+        [styleButton selectSegmentWithTag:[presentationView cursorStyle]];
+        [styleButton setTarget:presentationView];
         [styleButton setAction:@selector(changeCursorStyle:)];
         if (@available(macOS 10.14, *))
             [[styleButton cell] 
setBackgroundStyle:NSBackgroundStyleEmphasized];
@@ -292,8 +291,8 @@
         [removeShadowButton setSegmentCount:1];
         [removeShadowButton setTrackingMode:NSSegmentSwitchTrackingSelectAny];
         [removeShadowButton setLabel:NSLocalizedString(@"Remove shadow", 
@"Button title") forSegment:0];
-        [removeShadowButton setSelected:[pdfView removeCursorShadow] 
forSegment:0];
-        [removeShadowButton setTarget:pdfView];
+        [removeShadowButton setSelected:[presentationView removeCursorShadow] 
forSegment:0];
+        [removeShadowButton setTarget:presentationView];
         [removeShadowButton setAction:@selector(toggleRemoveCursorShadow:)];
         if (@available(macOS 10.14, *))
             [[removeShadowButton cell] 
setBackgroundStyle:NSBackgroundStyleEmphasized];
@@ -313,8 +312,8 @@
         [drawButton setTrackingMode:NSSegmentSwitchTrackingSelectAny];
         [drawButton setWidth:30.0 forSegment:0];
         [drawButton setImage:[NSImage imageNamed:SKImageNameInkToolAdorn] 
forSegment:0];
-        [drawButton setSelected:[pdfView drawInPresentation] forSegment:0];
-        [drawButton setTarget:pdfView];
+        [drawButton setSelected:[presentationView drawInPresentation] 
forSegment:0];
+        [drawButton setTarget:presentationView];
         [drawButton setAction:@selector(toggleDrawInPresentation:)];
         if (@available(macOS 10.14, *))
             [[drawButton cell] setBackgroundStyle:NSBackgroundStyleEmphasized];
@@ -338,7 +337,7 @@
         [closeButton setTrackingMode:NSSegmentSwitchTrackingMomentary];
         [closeButton setWidth:24.0 forSegment:0];
         [closeButton setImage:[NSImage 
imageNamed:NSImageNameStopProgressTemplate] forSegment:0];
-        [closeButton setTarget:pdfView];
+        [closeButton setTarget:presentationView];
         [closeButton setAction:@selector(closeCursorStyleWindow:)];
         if (@available(macOS 10.14, *))
             [[closeButton cell] 
setBackgroundStyle:NSBackgroundStyleEmphasized];
@@ -346,7 +345,7 @@
         [closeButton sizeToFit];
         [[self contentView] addSubview:closeButton];
         
-        NSScreen *screen = [[pdfView window] screen] ?: [NSScreen mainScreen];
+        NSScreen *screen = [[presentationView window] screen] ?: [NSScreen 
mainScreen];
         NSRect frame;
         frame.size.width = NSWidth([styleButton frame]) + 
NSWidth([removeShadowButton frame]) + NSWidth([drawButton frame]) + 
NSWidth([closeButton frame]) + 2.0 * BUTTON_MARGIN + 2.0 * SMALL_SEP_WIDTH;
         frame.size.height = NSHeight(rect) + 2.0 * BUTTON_MARGIN;

Modified: trunk/SKPDFView.h
===================================================================
--- trunk/SKPDFView.h   2024-09-12 21:33:13 UTC (rev 14455)
+++ trunk/SKPDFView.h   2024-09-17 15:47:33 UTC (rev 14456)
@@ -123,9 +123,6 @@
 - (void)PDFViewDidEndEditing:(PDFView *)sender;
 - (void)PDFView:(PDFView *)sender editAnnotation:(PDFAnnotation *)annotation;
 - (void)PDFView:(PDFView *)sender showSnapshotAtPageNumber:(NSInteger)pageNum 
forRect:(NSRect)rect scaleFactor:(CGFloat)scaleFactor autoFits:(BOOL)autoFits;
-- (void)PDFViewExitPresentation:(PDFView *)sender;
-- (void)PDFViewTogglePages:(PDFView *)sender;
-- (void)PDFViewToggleContents:(PDFView *)sender;
 - (void)PDFViewPerformHideFind:(PDFView *)sender;
 - (BOOL)PDFViewIsFindVisible:(PDFView *)sender;
 - (void)PDFView:(PDFView *)sender rotatePageAtIndex:(NSUInteger)idx 
by:(NSInteger)rotation;
@@ -132,7 +129,7 @@
 - (nullable NSUndoManager *)undoManagerForPDFView:(PDFView *)sender;
 @end
 
-@class SKReadingBar, SKTransitionController, SKTypeSelectHelper, 
SKNavigationWindow, SKCursorStyleWindow, SKTextNoteEditor, SKSyncDot, 
SKLoupeController, SKLayerController;
+@class SKReadingBar, SKTypeSelectHelper, SKNavigationWindow, 
SKCursorStyleWindow, SKTextNoteEditor, SKSyncDot, SKLoupeController, 
SKLayerController;
 
 @interface SKPDFView : SKBasePDFView {
     SKToolMode toolMode;
@@ -152,8 +149,6 @@
     CGFloat pacerWaitTime;
     NSInteger pacerCounter;
     
-    SKTransitionController *transitionController;
-    
     SKTypeSelectHelper *typeSelectHelper;
     
        PDFAnnotation *currentAnnotation;
@@ -180,20 +175,11 @@
     
     NSInteger spellingTag;
     
-    NSInteger laserPointerColor;
-    
     _Atomic(BOOL) inKeyWindow;
     
-    struct _pdfvFlags {
-        unsigned int presentationMode:1;
-        unsigned int hideNotes:1;
-        unsigned int wantsNewUndoGroup:1;
-        unsigned int cursorHidden:1;
-        unsigned int useArrowCursorInPresentation:1;
-        unsigned int removeLaserPointerShadow:1;
-        unsigned int drawInPresentation:1;
-        unsigned int zooming:1;
-    } pdfvFlags;
+    BOOL hideNotes;
+    BOOL wantsNewUndoGroup;
+    BOOL zooming;
 }
 
 @property (nonatomic) PDFDisplayMode extendedDisplayMode;
@@ -201,7 +187,6 @@
 @property (nonatomic) SKToolMode toolMode;
 @property (nonatomic) SKNoteType annotationMode;
 @property (nonatomic) SKTemporaryToolMode temporaryToolMode;
-@property (nonatomic, getter=isPresentationMode) BOOL presentationMode;
 @property (nonatomic, nullable, strong) PDFAnnotation *currentAnnotation;
 @property (nonatomic, readonly, getter=isEditing) BOOL editing;
 @property (nonatomic, readonly, getter=isZooming) BOOL zooming;
@@ -214,7 +199,6 @@
 @property (nullable, readonly) SKReadingBar *readingBar;
 @property (nonatomic) CGFloat pacerSpeed;
 @property (nonatomic, readonly) BOOL hasPacer;
-@property (nonatomic, nullable, readonly) SKTransitionController 
*transitionController;
 @property (nonatomic, nullable, strong) SKTypeSelectHelper *typeSelectHelper;
 
 @property (nonatomic) BOOL needsRewind;
@@ -241,19 +225,6 @@
 - (void)setDisplayBoxAndRewind:(PDFDisplayBox)box;
 - (void)setDisplaysAsBookAndRewind:(BOOL)asBook;
 
-- (void)zoomLog:(nullable id)sender;
-- (void)toggleAutoActualSize:(nullable id)sender;
-- (void)exitPresentation:(nullable id)sender;
-
-- (void)showCursorStyleWindow:(nullable id)sender;
-- (void)closeCursorStyleWindow:(nullable id)sender;
-- (NSInteger)cursorStyle;
-- (void)changeCursorStyle:(nullable id)sender;
-- (BOOL)removeCursorShadow;
-- (void)toggleRemoveCursorShadow:(nullable id)sender;
-- (BOOL)drawInPresentation;
-- (void)toggleDrawInPresentation:(nullable id)sender;
-
 - (void)addAnnotationForContext:(nullable id)sender;
 - (void)addAnnotationWithType:(SKNoteType)annotationType;
 - (void)removeCurrentAnnotation:(nullable id)sender;

Modified: trunk/SKPDFView.m
===================================================================
--- trunk/SKPDFView.m   2024-09-12 21:33:13 UTC (rev 14455)
+++ trunk/SKPDFView.m   2024-09-17 15:47:33 UTC (rev 14456)
@@ -37,7 +37,6 @@
  */
 
 #import "SKPDFView.h"
-#import "SKNavigationWindow.h"
 #import "SKImageToolTipWindow.h"
 #import <SkimNotes/SkimNotes.h>
 #import "PDFAnnotation_SKExtensions.h"
@@ -50,7 +49,6 @@
 #import "SKStringConstants.h"
 #import "NSUserDefaults_SKExtensions.h"
 #import "SKReadingBar.h"
-#import "SKTransitionController.h"
 #import "SKTextNoteEditor.h"
 #import "SKSyncDot.h"
 #import "SKLineInspector.h"
@@ -107,9 +105,6 @@
 #define SMALL_MAGNIFICATION   1.5
 #define LARGE_MAGNIFICATION   4.0
 
-#define AUTO_HIDE_DELAY 3.0
-#define SHOW_NAV_DELAY  0.25
-
 // based on: reading speed: 240 words/min
 // layout: 10 words/line, 40 line/page, 600 points/page
 #define DEFAULT_PACER_SPEED 6.0
@@ -138,10 +133,6 @@
 #define SKUseToolModeCursorsKey @"SKUseToolModeCursors"
 #define SKMagnifyWithMousePressedKey @"SKMagnifyWithMousePressed"
 #define SKPacerSpeedKey @"SKPacerSpeed"
-#define SKUseArrowCursorInPresentationKey @"SKUseArrowCursorInPresentation"
-#define SKLaserPointerColorKey @"SKLaserPointerColor"
-#define SKRemoveLaserPointerShadowKey @"SKRemoveLaserPointerShadows"
-#define SKDisableDrawingInPresentationKey @"SKDisableDrawingInPresentation"
 
 #define SKAnnotationKey @"SKAnnotation"
 
@@ -157,12 +148,6 @@
 static inline NSSize SKFitTextNoteSize(NSString *string, NSFont *font, CGFloat 
width);
 
 enum {
-    SKNavigationNone,
-    SKNavigationBottom,
-    SKNavigationEverywhere,
-};
-
-enum {
     SKLayerNone,
     SKLayerUse,
     SKLayerAdd,
@@ -206,15 +191,9 @@
 
 - (void)beginNewUndoGroupIfNeededWithCommit:(BOOL)commit;
 
-- (void)enableNavigation;
-- (void)disableNavigation;
-
 - (void)stopPacer;
 - (void)updatePacer;
 
-- (void)doAutoHide;
-- (void)showNavWindow;
-
 - (void)setNeedsDisplayForReadingBarBounds:(NSRect)rect onPage:(PDFPage *)page;
 
 - (void)doMoveCurrentAnnotationForKey:(unichar)eventChar 
byAmount:(CGFloat)delta;
@@ -236,7 +215,6 @@
 - (void)doMarqueeZoomWithEvent:(NSEvent *)theEvent;
 - (BOOL)doDragMouseWithEvent:(NSEvent *)theEvent;
 - (BOOL)doDragTextWithEvent:(NSEvent *)theEvent;
-- (void)doDragWindowWithEvent:(NSEvent *)theEvent;
 - (void)setCursorForMouse:(NSEvent *)theEvent;
 - (void)showHelpMenu;
 
@@ -253,8 +231,8 @@
 
 @implementation SKPDFView
 
-@synthesize toolMode, annotationMode, temporaryToolMode, currentAnnotation, 
readingBar, pacerSpeed, transitionController, typeSelectHelper, syncDot;
-@dynamic extendedDisplayMode, presentationMode, displaysHorizontally, 
hideNotes, canSelectNote, hasReadingBar, hasPacer, currentSelectionPage, 
currentSelectionRect, currentMagnification, needsRewind, editing, zooming;
+@synthesize toolMode, annotationMode, temporaryToolMode, currentAnnotation, 
readingBar, pacerSpeed, typeSelectHelper, syncDot, hideNotes, zooming;
+@dynamic extendedDisplayMode, displaysHorizontally, canSelectNote, 
hasReadingBar, hasPacer, currentSelectionPage, currentSelectionRect, 
currentMagnification, needsRewind, editing;
 
 + (void)initialize {
     SKINITIALIZE;
@@ -283,26 +261,14 @@
     toolMode = [[NSUserDefaults standardUserDefaults] 
integerForKey:SKLastToolModeKey];
     annotationMode = [[NSUserDefaults standardUserDefaults] 
integerForKey:SKLastAnnotationModeKey];
     
-    transitionController = nil;
-    
     typeSelectHelper = nil;
     
     spellingTag = [NSSpellChecker uniqueSpellDocumentTag];
     
-    pdfvFlags.presentationMode = 0;
-    pdfvFlags.hideNotes = 0;
-    pdfvFlags.wantsNewUndoGroup = 0;
-    pdfvFlags.cursorHidden = 0;
-    pdfvFlags.useArrowCursorInPresentation = [[NSUserDefaults 
standardUserDefaults] boolForKey:SKUseArrowCursorInPresentationKey];
-    pdfvFlags.removeLaserPointerShadow = [[NSUserDefaults 
standardUserDefaults] boolForKey:SKRemoveLaserPointerShadowKey];
-    pdfvFlags.drawInPresentation = NO == [[NSUserDefaults 
standardUserDefaults] boolForKey:SKDisableDrawingInPresentationKey];
+    hideNotes = NO;
+    wantsNewUndoGroup = NO;
     inKeyWindow = NO;
     
-    laserPointerColor = [[NSUserDefaults standardUserDefaults] 
integerForKey:SKLaserPointerColorKey];
-    
-    navWindow = nil;
-    cursorWindow = nil;
-    
     readingBar = nil;
     
     pacerTimer = nil;
@@ -366,7 +332,6 @@
     for (NSString *key in [[self class] defaultKeysToObserve])
         [sud removeObserver:self forKeyPath:key 
context:&SKPDFViewDefaultsObservationContext];
     [[NSNotificationCenter defaultCenter] removeObserver:self];
-    [self disableNavigation];
     [[SKImageToolTipWindow sharedToolTipWindow] orderOut:self];
     [self removePDFToolTipRects];
     [syncDot invalidate];
@@ -394,7 +359,7 @@
 - (void)resetPDFToolTipRects {
     [self removePDFToolTipRects];
     
-    if ([self document] && [self window] && pdfvFlags.presentationMode == 0) {
+    if ([self document] && [self window]) {
         NSRect visibleRect = [self visibleContentRect];
         NSView *docView = [self documentView];
         BOOL hasLinkToolTips = toolMode != SKToolModeMagnify;
@@ -683,42 +648,6 @@
     }
 }
 
-- (BOOL)isPresentationMode {
-    return pdfvFlags.presentationMode;
-}
-
-- (void)setPresentationMode:(BOOL)flag {
-    if (pdfvFlags.presentationMode != flag) {
-        [self setTemporaryToolMode:SKToolModeNone];
-        if (pdfvFlags.presentationMode) {
-            pdfvFlags.cursorHidden = NO;
-            [NSCursor setHiddenUntilMouseMoves:NO];
-            if ([[self documentView] isHidden])
-                [[self documentView] setHidden:NO];
-        }
-        pdfvFlags.presentationMode = flag;
-        if (pdfvFlags.presentationMode) {
-            if (toolMode == SKToolModeText || toolMode == SKToolModeNote) {
-                if (currentAnnotation)
-                    [self setCurrentAnnotation:nil];
-                if ([[self currentSelection] hasCharacters])
-                    [self setCurrentSelection:nil];
-            } else if (toolMode == SKToolModeSelect && 
NSEqualRects(selectionRect, NSZeroRect) == NO) {
-                [self setCurrentSelectionRect:NSZeroRect];
-                [[NSNotificationCenter defaultCenter] 
postNotificationName:SKPDFViewSelectionChangedNotification object:self];
-            }
-            [self stopPacer];
-        }
-        // always clean up navWindow and hanging perform requests
-        [self disableNavigation];
-        if (pdfvFlags.presentationMode)
-            [self enableNavigation];
-        [self resetPDFToolTipRects];
-        if ([self respondsToSelector:@selector(enableSwipeGestures:)])
-            [self enableSwipeGestures:pdfvFlags.presentationMode == 0];
-    }
-}
-
 - (void)setCurrentAnnotation:(PDFAnnotation *)newAnnotation {
        if (newAnnotation != currentAnnotation) {
         PDFAnnotation *wasAnnotation = currentAnnotation;
@@ -748,10 +677,6 @@
     return editor != nil;
 }
 
-- (BOOL)isZooming {
-    return pdfvFlags.zooming;
-}
-
 - (void)setDisplayMode:(PDFDisplayMode)mode {
     if (mode != [self displayMode] || (mode == kPDFDisplaySinglePageContinuous 
&& [self displaysHorizontally])) {
         PDFPage *page = [self currentPage];
@@ -963,27 +888,15 @@
     return loupeController ? [loupeController magnification] : 0.0;
 }
 
-- (BOOL)hideNotes {
-    return pdfvFlags.hideNotes;
-}
-
 - (void)setHideNotes:(BOOL)flag {
-    if (pdfvFlags.hideNotes != flag) {
-        pdfvFlags.hideNotes = flag;
-        if (pdfvFlags.hideNotes)
+    if (hideNotes != flag) {
+        hideNotes = flag;
+        if (hideNotes)
             [self setCurrentAnnotation:nil];
         [self requiresDisplay];
     }
 }
 
-- (SKTransitionController * )transitionController {
-    if (transitionController == nil) {
-        transitionController = [[SKTransitionController alloc] init];
-        [transitionController setView:self];
-    }
-    return transitionController;
-}
-
 - (void)setHighlightAnnotation:(PDFAnnotation *)annotation {
     if (annotation != highlightAnnotation) {
         highlightAnnotation = annotation;
@@ -1009,12 +922,11 @@
 }
 
 - (void)setUndoActionName:(NSString *)actionName {
-    if (pdfvFlags.presentationMode)
-        [[self undoManager] setActionName:actionName];
+    [[self undoManager] setActionName:actionName];
 }
 
 - (BOOL)canSelectNote {
-    return pdfvFlags.hideNotes == NO && pdfvFlags.presentationMode == 0 && 
(toolMode == SKToolModeText || toolMode == SKToolModeNote) && [[self document] 
allowsNotes];
+    return hideNotes == NO && (toolMode == SKToolModeText || toolMode == 
SKToolModeNote) && [[self document] allowsNotes];
 }
 
 #pragma mark Reading bar
@@ -1191,59 +1103,6 @@
 
 #pragma mark Actions
 
-- (void)animateTransitionForNextPage:(BOOL)next {
-    PDFPage *fromPage = [self currentPage];
-    NSUInteger idx = [fromPage pageIndex];
-    NSUInteger toIdx = (next ? idx + 1 : idx - 1);
-    PDFPage *toPage = [[self document] pageAtIndex:toIdx];
-    if ([transitionController pageTransitions] ||
-        ([fromPage label] && [toPage label] && [[fromPage label] 
isEqualToString:[toPage label]] == NO)) {
-        NSRect rect = [self convertRect:[fromPage boundsForBox:[self 
displayBox]] fromPage:fromPage];
-        [[self transitionController] animateForRect:rect from:idx to:toIdx 
change:^{
-            if (next)
-                [super goToNextPage:self];
-            else
-                [super goToPreviousPage:self];
-            return [self convertRect:[toPage boundsForBox:[self displayBox]] 
fromPage:toPage];
-        }];
-    } else if (next) {
-        [super goToNextPage:self];
-    } else {
-        [super goToPreviousPage:self];
-    }
-}
-
-- (void)doAutoHideCursor {
-    if ([NSWindow windowNumberAtPoint:[NSEvent mouseLocation] 
belowWindowWithWindowNumber:0] == [[self window] windowNumber]) {
-        [[NSCursor emptyCursor] set];
-        pdfvFlags.cursorHidden = YES;
-        [NSCursor setHiddenUntilMouseMoves:YES];
-    }
-}
-
-- (void)doAutoHideCursorIfNeeded {
-    if (pdfvFlags.presentationMode && [self window] && pdfvFlags.cursorHidden) 
{
-        [self performSelector:@selector(doAutoHideCursor) withObject:nil 
afterDelay:0.0];
-        [self performSelector:@selector(doAutoHideCursor) withObject:nil 
afterDelay:0.1];
-    }
-}
-
-- (IBAction)goToNextPage:(id)sender {
-    if (pdfvFlags.presentationMode && [self window] && [transitionController 
hasTransition] && [self canGoToNextPage])
-        [self animateTransitionForNextPage:YES];
-    else
-        [super goToNextPage:sender];
-    [self doAutoHideCursorIfNeeded];
-}
-
-- (IBAction)goToPreviousPage:(id)sender {
-    if (pdfvFlags.presentationMode && [self window] && [transitionController 
hasTransition] && [self canGoToPreviousPage])
-        [self animateTransitionForNextPage:NO];
-    else
-        [super goToPreviousPage:sender];
-    [self doAutoHideCursorIfNeeded];
-}
-
 - (IBAction)delete:(id)sender
 {
        if ([currentAnnotation isSkimNote])
@@ -1472,18 +1331,6 @@
     [self setAnnotationMode:[sender tag]];
 }
 
-- (void)zoomLog:(id)sender {
-    [self setScaleFactor:exp([sender doubleValue])];
-}
-
-- (void)toggleAutoActualSize:(id)sender {
-    if ([self autoScales])
-        [self setScaleFactor:1.0];
-    else
-        [self setAutoScales:YES];
-    [self doAutoHideCursorIfNeeded];
-}
-
 - (void)_setSinglePageScrolling:(id)sender {
     [self setExtendedDisplayModeAndRewind:kPDFDisplaySinglePageContinuous];
 }
@@ -1500,11 +1347,6 @@
     [self setExtendedDisplayModeAndRewind:kPDFDisplayHorizontalContinuous];
 }
 
-- (void)exitPresentation:(id)sender {
-    if ([[self delegate] 
respondsToSelector:@selector(PDFViewExitPresentation:)])
-        [[self delegate] PDFViewExitPresentation:self];
-}
-
 - (void)showColorsForThisAnnotation:(id)sender {
     PDFAnnotation *annotation = [sender representedObject];
     if (annotation)
@@ -1527,21 +1369,21 @@
 }
 
 - (void)zoomIn:(id)sender {
-    pdfvFlags.zooming = YES;
+    zooming = YES;
     [super zoomIn:sender];
-    pdfvFlags.zooming = NO;
+    zooming = NO;
 }
 
 - (void)zoomOut:(id)sender {
-    pdfvFlags.zooming = YES;
+    zooming = YES;
     [super zoomOut:sender];
-    pdfvFlags.zooming = NO;
+    zooming = NO;
 }
 
 - (void)setScaleFactor:(CGFloat)scale {
-    pdfvFlags.zooming = YES;
+    zooming = YES;
     [super setScaleFactor:scale];
-    pdfvFlags.zooming = NO;
+    zooming = NO;
 }
 
 - (void)zoomToPhysicalSize:(id)sender {
@@ -1641,36 +1483,6 @@
     [[NSSpellChecker sharedSpellChecker] ignoreWord:[[sender selectedCell] 
stringValue] inSpellDocumentWithTag:spellingTag];
 }
 
-- (void)toggleBlackout:(id)sender {
-    NSView *documentView = [self documentView];
-    [documentView setHidden:[documentView isHidden] == NO];
-}
-
-- (void)toggleLaserPointer:(id)sender {
-    pdfvFlags.useArrowCursorInPresentation = 
pdfvFlags.useArrowCursorInPresentation == NO;
-    [self setCursorForMouse:nil];
-    [[NSUserDefaults standardUserDefaults] 
setBool:pdfvFlags.useArrowCursorInPresentation 
forKey:SKUseArrowCursorInPresentationKey];
-    [cursorWindow selectCursorStyle:[self cursorStyle]];
-}
-
-- (void)nextLaserPointerColor:(id)sender {
-    laserPointerColor = (laserPointerColor + 1) % 7;
-    pdfvFlags.cursorHidden = 0;
-    [self setCursorForMouse:nil];
-    [self performSelectorOnce:@selector(doAutoHide) 
afterDelay:AUTO_HIDE_DELAY];
-    [[NSUserDefaults standardUserDefaults] setInteger:laserPointerColor 
forKey:SKLaserPointerColorKey];
-    [cursorWindow selectCursorStyle:[self cursorStyle]];
-}
-
-- (void)previousLaserPointerColor:(id)sender {
-    laserPointerColor = (laserPointerColor + 6) % 7;
-    pdfvFlags.cursorHidden = 0;
-    [self setCursorForMouse:nil];
-    [self performSelectorOnce:@selector(doAutoHide) 
afterDelay:AUTO_HIDE_DELAY];
-    [[NSUserDefaults standardUserDefaults] setInteger:laserPointerColor 
forKey:SKLaserPointerColorKey];
-    [cursorWindow selectCursorStyle:[self cursorStyle]];
-}
-
 - (void)nextToolMode:(id)sender {
     [self setToolMode:(toolMode + 1) % TOOL_MODE_COUNT];
 }
@@ -1772,97 +1584,60 @@
     NSUInteger modifiers = [theEvent deviceIndependentModifierFlags] & 
~NSEventModifierFlagCapsLock;
     NSUInteger standardModifiers = modifiers & ~NSEventModifierFlagNumericPad 
& ~NSEventModifierFlagFunction;
 
-    if (pdfvFlags.presentationMode) {
-        // Presentation mode
-        if ([[self scrollView] hasHorizontalScroller] == NO && 
-            (eventChar == NSRightArrowFunctionKey) &&  (standardModifiers == 
0)) {
-            [self goToNextPage:self];
-        } else if ([[self scrollView] hasHorizontalScroller] == NO && 
-                   (eventChar == NSLeftArrowFunctionKey) &&  
(standardModifiers == 0)) {
-            [self goToPreviousPage:self];
-        } else if ((eventChar == 'p') && (modifiers == 0)) {
-            if ([[self delegate] 
respondsToSelector:@selector(PDFViewTogglePages:)])
-                [[self delegate] PDFViewTogglePages:self];
-        } else if ((eventChar == 't') && (modifiers == 0)) {
-            if ([[self delegate] 
respondsToSelector:@selector(PDFViewToggleContents:)])
-                [[self delegate] PDFViewToggleContents:self];
-        } else if ((eventChar == 'a') && (modifiers == 0)) {
-            [self toggleAutoActualSize:self];
-        } else if ((eventChar == 'b') && (modifiers == 0)) {
-            [self toggleBlackout:self];
-        } else if ((eventChar == 'l') && (modifiers == 0)) {
-            [self toggleLaserPointer:nil];
-        } else if (pdfvFlags.useArrowCursorInPresentation == 0 && (eventChar 
== 'c') && (modifiers == 0)) {
-            [self nextLaserPointerColor:nil];
-        } else if (pdfvFlags.useArrowCursorInPresentation == 0 && (eventChar 
== 'C') && ((modifiers & ~NSEventModifierFlagShift) == 0)) {
-            [self previousLaserPointerColor:nil];
-        } else if (pdfvFlags.useArrowCursorInPresentation == 0 && (eventChar 
== ',') && (modifiers == 0)) {
-            if ([cursorWindow isVisible])
-                [self closeCursorStyleWindow:nil];
-            else
-                [self showCursorStyleWindow:nil];
-        } else if ((eventChar == '?') && ((modifiers & 
~NSEventModifierFlagShift) == 0)) {
-            [self showHelpMenu];
-        } else {
-            [super keyDown:theEvent];
-        }
-    } else {
-        // Normal or fullscreen mode
-        if ((eventChar == NSDeleteCharacter || eventChar == 
NSDeleteFunctionKey) &&
-            (standardModifiers == 0)) {
-            [self delete:self];
-        } else if (([self toolMode] == SKToolModeText || [self toolMode] == 
SKToolModeNote) && currentAnnotation && editor == nil && IS_ENTER(eventChar) && 
(standardModifiers == 0)) {
-            [self editCurrentAnnotation:self];
-        } else if (([self toolMode] == SKToolModeText || [self toolMode] == 
SKToolModeNote) && 
-                   (eventChar == SKEscapeCharacter) && (standardModifiers == 
NSEventModifierFlagOption)) {
-            [self setCurrentAnnotation:nil];
-        } else if (([self toolMode] == SKToolModeText || [self toolMode] == 
SKToolModeNote) && 
-                   (eventChar == NSTabCharacter) && (standardModifiers == 
NSEventModifierFlagOption)) {
-            [self selectNextCurrentAnnotation:self];
-        // backtab is a bit inconsistent, it seems Shift+Tab gives a 
Shift-BackTab key event, I would have expected either Shift-Tab (as for the raw 
event) or BackTab (as for most shift-modified keys)
-        } else if (([self toolMode] == SKToolModeText || [self toolMode] == 
SKToolModeNote) && 
-                   (((eventChar == NSBackTabCharacter) && ((standardModifiers 
& ~NSEventModifierFlagShift) == NSEventModifierFlagOption)) ||
-                    ((eventChar == NSTabCharacter) && (standardModifiers == 
(NSEventModifierFlagOption | NSEventModifierFlagShift))))) {
-            [self selectPreviousCurrentAnnotation:self];
-        } else if ([self hasReadingBar] && IS_ARROW(eventChar) && 
(standardModifiers == moveReadingBarModifiers)) {
-            [self doMoveReadingBarForKey:eventChar];
-        } else if ([self hasReadingBar] && IS_UP_DOWN_ARROW(eventChar) && 
(standardModifiers == resizeReadingBarModifiers)) {
-            [self doResizeReadingBarForKey:eventChar];
-        } else if (IS_LEFT_RIGHT_ARROW(eventChar) && (standardModifiers == 
(NSEventModifierFlagOption | NSEventModifierFlagCommand))) {
-            [self setToolMode:(toolMode + (eventChar == 
NSRightArrowFunctionKey ? 1 : TOOL_MODE_COUNT - 1)) % TOOL_MODE_COUNT];
-        } else if (IS_UP_DOWN_ARROW(eventChar) && (standardModifiers == 
(NSEventModifierFlagOption | NSEventModifierFlagCommand))) {
-            [self setAnnotationMode:(annotationMode + (eventChar == 
NSDownArrowFunctionKey ? 1 : ANNOTATION_MODE_COUNT - 1)) % 
ANNOTATION_MODE_COUNT];
-        } else if ([currentAnnotation isMovable] && IS_ARROW(eventChar) && 
((standardModifiers & ~NSEventModifierFlagShift) == 0)) {
-            [self doMoveCurrentAnnotationForKey:eventChar byAmount:(modifiers 
& NSEventModifierFlagShift) ? 10.0 : 1.0];
-        } else if ([currentAnnotation isResizable] && IS_ARROW(eventChar) && 
(standardModifiers == (NSEventModifierFlagOption | NSEventModifierFlagControl) 
|| standardModifiers == (NSEventModifierFlagShift | 
NSEventModifierFlagControl))) {
-            [self doResizeCurrentAnnotationForKey:eventChar 
byAmount:(modifiers & NSEventModifierFlagShift) ? 10.0 : 1.0];
-        // with some keyboard layouts, e.g. Japanese, the '=' character 
requires Shift
-        } else if ([currentAnnotation isResizable] && [currentAnnotation 
isLine] == NO && [currentAnnotation isInk] == NO && (eventChar == '=') && 
((modifiers & ~(NSEventModifierFlagOption | NSEventModifierFlagShift)) == 
NSEventModifierFlagControl)) {
-            [self doAutoSizeActiveNoteIgnoringWidth:(modifiers & 
NSEventModifierFlagOption) != 0];
-        } else if ([self toolMode] == SKToolModeNote && (eventChar == 't') && 
(modifiers == 0)) {
-            [self setAnnotationMode:SKNoteTypeFreeText];
-        } else if ([self toolMode] == SKToolModeNote && (eventChar == 'n') && 
(modifiers == 0)) {
-            [self setAnnotationMode:SKNoteTypeAnchored];
-        } else if ([self toolMode] == SKToolModeNote && (eventChar == 'c') && 
(modifiers == 0)) {
-            [self setAnnotationMode:SKNoteTypeCircle];
-        } else if ([self toolMode] == SKToolModeNote && (eventChar == 'b') && 
(modifiers == 0)) {
-            [self setAnnotationMode:SKNoteTypeSquare];
-        } else if ([self toolMode] == SKToolModeNote && (eventChar == 'h') && 
(modifiers == 0)) {
-            [self setAnnotationMode:SKNoteTypeHighlight];
-        } else if ([self toolMode] == SKToolModeNote && (eventChar == 'u') && 
(modifiers == 0)) {
-            [self setAnnotationMode:SKNoteTypeUnderline];
-        } else if ([self toolMode] == SKToolModeNote && (eventChar == 's') && 
(modifiers == 0)) {
-            [self setAnnotationMode:SKNoteTypeStrikeOut];
-        } else if ([self toolMode] == SKToolModeNote && (eventChar == 'l') && 
(modifiers == 0)) {
-            [self setAnnotationMode:SKNoteTypeLine];
-        } else if ([self toolMode] == SKToolModeNote && (eventChar == 'f') && 
(modifiers == 0)) {
-            [self setAnnotationMode:SKNoteTypeInk];
-        } else if ((eventChar == '?') && ((modifiers & 
~NSEventModifierFlagShift) == 0)) {
-            [self showHelpMenu];
-        } else if ([typeSelectHelper handleEvent:theEvent] == NO) {
-            [super keyDown:theEvent];
-        }
-        
+    // Normal or fullscreen mode
+    if ((eventChar == NSDeleteCharacter || eventChar == NSDeleteFunctionKey) &&
+        (standardModifiers == 0)) {
+        [self delete:self];
+    } else if (([self toolMode] == SKToolModeText || [self toolMode] == 
SKToolModeNote) && currentAnnotation && editor == nil && IS_ENTER(eventChar) && 
(standardModifiers == 0)) {
+        [self editCurrentAnnotation:self];
+    } else if (([self toolMode] == SKToolModeText || [self toolMode] == 
SKToolModeNote) &&
+               (eventChar == SKEscapeCharacter) && (standardModifiers == 
NSEventModifierFlagOption)) {
+        [self setCurrentAnnotation:nil];
+    } else if (([self toolMode] == SKToolModeText || [self toolMode] == 
SKToolModeNote) &&
+               (eventChar == NSTabCharacter) && (standardModifiers == 
NSEventModifierFlagOption)) {
+        [self selectNextCurrentAnnotation:self];
+    // backtab is a bit inconsistent, it seems Shift+Tab gives a Shift-BackTab 
key event, I would have expected either Shift-Tab (as for the raw event) or 
BackTab (as for most shift-modified keys)
+    } else if (([self toolMode] == SKToolModeText || [self toolMode] == 
SKToolModeNote) &&
+               (((eventChar == NSBackTabCharacter) && ((standardModifiers & 
~NSEventModifierFlagShift) == NSEventModifierFlagOption)) ||
+                ((eventChar == NSTabCharacter) && (standardModifiers == 
(NSEventModifierFlagOption | NSEventModifierFlagShift))))) {
+        [self selectPreviousCurrentAnnotation:self];
+    } else if ([self hasReadingBar] && IS_ARROW(eventChar) && 
(standardModifiers == moveReadingBarModifiers)) {
+        [self doMoveReadingBarForKey:eventChar];
+    } else if ([self hasReadingBar] && IS_UP_DOWN_ARROW(eventChar) && 
(standardModifiers == resizeReadingBarModifiers)) {
+        [self doResizeReadingBarForKey:eventChar];
+    } else if (IS_LEFT_RIGHT_ARROW(eventChar) && (standardModifiers == 
(NSEventModifierFlagOption | NSEventModifierFlagCommand))) {
+        [self setToolMode:(toolMode + (eventChar == NSRightArrowFunctionKey ? 
1 : TOOL_MODE_COUNT - 1)) % TOOL_MODE_COUNT];
+    } else if (IS_UP_DOWN_ARROW(eventChar) && (standardModifiers == 
(NSEventModifierFlagOption | NSEventModifierFlagCommand))) {
+        [self setAnnotationMode:(annotationMode + (eventChar == 
NSDownArrowFunctionKey ? 1 : ANNOTATION_MODE_COUNT - 1)) % 
ANNOTATION_MODE_COUNT];
+    } else if ([currentAnnotation isMovable] && IS_ARROW(eventChar) && 
((standardModifiers & ~NSEventModifierFlagShift) == 0)) {
+        [self doMoveCurrentAnnotationForKey:eventChar byAmount:(modifiers & 
NSEventModifierFlagShift) ? 10.0 : 1.0];
+    } else if ([currentAnnotation isResizable] && IS_ARROW(eventChar) && 
(standardModifiers == (NSEventModifierFlagOption | NSEventModifierFlagControl) 
|| standardModifiers == (NSEventModifierFlagShift | 
NSEventModifierFlagControl))) {
+        [self doResizeCurrentAnnotationForKey:eventChar byAmount:(modifiers & 
NSEventModifierFlagShift) ? 10.0 : 1.0];
+    // with some keyboard layouts, e.g. Japanese, the '=' character requires 
Shift
+    } else if ([currentAnnotation isResizable] && [currentAnnotation isLine] 
== NO && [currentAnnotation isInk] == NO && (eventChar == '=') && ((modifiers & 
~(NSEventModifierFlagOption | NSEventModifierFlagShift)) == 
NSEventModifierFlagControl)) {
+        [self doAutoSizeActiveNoteIgnoringWidth:(modifiers & 
NSEventModifierFlagOption) != 0];
+    } else if ([self toolMode] == SKToolModeNote && (eventChar == 't') && 
(modifiers == 0)) {
+        [self setAnnotationMode:SKNoteTypeFreeText];
+    } else if ([self toolMode] == SKToolModeNote && (eventChar == 'n') && 
(modifiers == 0)) {
+        [self setAnnotationMode:SKNoteTypeAnchored];
+    } else if ([self toolMode] == SKToolModeNote && (eventChar == 'c') && 
(modifiers == 0)) {
+        [self setAnnotationMode:SKNoteTypeCircle];
+    } else if ([self toolMode] == SKToolModeNote && (eventChar == 'b') && 
(modifiers == 0)) {
+        [self setAnnotationMode:SKNoteTypeSquare];
+    } else if ([self toolMode] == SKToolModeNote && (eventChar == 'h') && 
(modifiers == 0)) {
+        [self setAnnotationMode:SKNoteTypeHighlight];
+    } else if ([self toolMode] == SKToolModeNote && (eventChar == 'u') && 
(modifiers == 0)) {
+        [self setAnnotationMode:SKNoteTypeUnderline];
+    } else if ([self toolMode] == SKToolModeNote && (eventChar == 's') && 
(modifiers == 0)) {
+        [self setAnnotationMode:SKNoteTypeStrikeOut];
+    } else if ([self toolMode] == SKToolModeNote && (eventChar == 'l') && 
(modifiers == 0)) {
+        [self setAnnotationMode:SKNoteTypeLine];
+    } else if ([self toolMode] == SKToolModeNote && (eventChar == 'f') && 
(modifiers == 0)) {
+        [self setAnnotationMode:SKNoteTypeInk];
+    } else if ((eventChar == '?') && ((modifiers & ~NSEventModifierFlagShift) 
== 0)) {
+        [self showHelpMenu];
+    } else if ([typeSelectHelper handleEvent:theEvent] == NO) {
+        [super keyDown:theEvent];
     }
 }
 
@@ -1887,34 +1662,6 @@
     if ([[self document] isLocked]) {
         [self setTemporaryToolMode:SKToolModeNone];
         [super mouseDown:theEvent];
-    } else if (pdfvFlags.presentationMode) {
-        [self setTemporaryToolMode:SKToolModeNone];
-        BOOL didHideMouse = pdfvFlags.cursorHidden;
-        if ([NSApp willDragMouse] == NO) {
-            if ((area & kPDFLinkArea)) {
-                [super mouseDown:theEvent];
-            } else {
-                [self goToNextPage:self];
-                // Eat up drag events because we don't want to select
-                [self doDragMouseWithEvent:theEvent];
-            }
-        } else if (IS_TABLET_EVENT(theEvent, NSPointingDeviceTypePen) == NO && 
([[self window] styleMask] & NSWindowStyleMaskResizable) != 0 && 
NSEqualRects([[self window] frame], [[[self window] screen] frame]) == NO) {
-            [[NSCursor closedHandCursor] set];
-            [self doDragWindowWithEvent:theEvent];
-        } else if (pdfvFlags.drawInPresentation || IS_TABLET_EVENT(theEvent, 
NSPointingDeviceTypePen)) {
-            [[NSCursor arrowCursor] set];
-            [self doDrawFreehandNoteWithEvent:theEvent];
-            [self setCurrentAnnotation:nil];
-        } else {
-            // Eat up drag events because we don't want to select
-            [self doDragMouseWithEvent:theEvent];
-        }
-        if (didHideMouse) {
-            [self doAutoHideCursor];
-        } else {
-            [self updateCursorForMouse:nil];
-            [self performSelectorOnce:@selector(doAutoHideCursor) 
afterDelay:AUTO_HIDE_DELAY];
-        }
     } else if (modifiers == NSEventModifierFlagCommand) {
         BOOL wantsLoupe = [loupeController hide];
         [self doSelectSnapshotWithEvent:theEvent];
@@ -1982,7 +1729,7 @@
     } else if (toolMode == SKToolModeMagnify) {
         [self setCurrentSelection:nil];
         [self doMagnifyWithEvent:theEvent];
-    } else if (pdfvFlags.hideNotes == NO && [[self document] allowsNotes] && 
IS_TABLET_EVENT(theEvent, NSPointingDeviceTypeEraser)) {
+    } else if (hideNotes == NO && [[self document] allowsNotes] && 
IS_TABLET_EVENT(theEvent, NSPointingDeviceTypeEraser)) {
         [self doEraseAnnotationsWithEvent:theEvent];
     } else if ([self doSelectAnnotationWithEvent:theEvent]) {
         if ([currentAnnotation isLink]) {
@@ -1997,7 +1744,7 @@
         } else {
             [self doDragMouseWithEvent:theEvent];
         }
-    } else if (toolMode == SKToolModeNote && pdfvFlags.hideNotes == NO && 
[[self document] allowsNotes] && IS_MARKUP(annotationMode) == NO) {
+    } else if (toolMode == SKToolModeNote && hideNotes == NO && [[self 
document] allowsNotes] && IS_MARKUP(annotationMode) == NO) {
         if ((area & kPDFLinkArea) != 0 && [NSApp willDragMouse] == NO) {
             [super mouseDown:theEvent];
         } else if (annotationMode == SKNoteTypeInk) {
@@ -2012,7 +1759,7 @@
     } else if ([self doDragTextWithEvent:theEvent] == NO) {
         [self setCurrentAnnotation:nil];
         [super mouseDown:theEvent];
-        if ((toolMode == SKToolModeNote && pdfvFlags.hideNotes == NO && [[self 
document] allowsNotes] && IS_MARKUP(annotationMode)) && [[self 
currentSelection] hasCharacters]) {
+        if ((toolMode == SKToolModeNote && hideNotes == NO && [[self document] 
allowsNotes] && IS_MARKUP(annotationMode)) && [[self currentSelection] 
hasCharacters]) {
             [self addAnnotationWithType:annotationMode];
             [self setCurrentSelection:nil];
         }
@@ -2020,11 +1767,8 @@
 }
 
 - (void)mouseMoved:(NSEvent *)theEvent {
-    pdfvFlags.cursorHidden = NO;
+    [super mouseMoved:theEvent];
     
-    if (pdfvFlags.presentationMode == 0)
-        [super mouseMoved:theEvent];
-    
     if (toolMode == SKToolModeMagnify && loupeController) {
         [loupeController update];
     } else {
@@ -2037,19 +1781,6 @@
             [self setCurrentAnnotation:nil];
         }
     }
-    
-    if (navigationMode != SKNavigationNone && [navWindow isVisible] == NO) {
-        if (navigationMode == SKNavigationEverywhere && [cursorWindow 
isVisible] == NO && NSPointInRect([theEvent locationInWindow], [[[self window] 
contentView] frame])) {
-            if (navWindow == nil)
-                navWindow = [[SKNavigationWindow alloc] initWithPDFView:self];
-            [navWindow showForWindow:[self window]];
-            
NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self
 documentView]), NSAccessibilityLayoutChangedNotification, [NSDictionary 
dictionaryWithObjectsAndKeys:NSAccessibilityUnignoredChildrenForOnlyChild(navWindow),
 NSAccessibilityUIElementsKey, nil]);
-        } else if (navigationMode == SKNavigationBottom && 
NSPointInRect([theEvent locationInWindow], SKSliceRect([[[self window] 
contentView] frame], NAVIGATION_BOTTOM_EDGE_HEIGHT, NSMinYEdge))) {
-            [self performSelectorOnce:@selector(showNavWindow) 
afterDelay:SHOW_NAV_DELAY];
-        }
-    }
-    if (navigationMode != SKNavigationNone || pdfvFlags.presentationMode)
-        [self performSelectorOnce:@selector(doAutoHide) 
afterDelay:AUTO_HIDE_DELAY];
 }
 
 - (void)flagsChanged:(NSEvent *)theEvent {
@@ -2081,7 +1812,7 @@
     }
     
     // On Leopard the selection is automatically set. In some cases we never 
want a selection though.
-    if (pdfvFlags.presentationMode || (toolMode != SKToolModeText && [[self 
currentSelection] hasCharacters])) {
+    if (toolMode != SKToolModeText && [[self currentSelection] hasCharacters]) 
{
         static NSSet *selectionActions = nil;
         if (selectionActions == nil)
             selectionActions = [[NSSet alloc] 
initWithObjects:@"_searchInSpotlight:", @"_searchInGoogle:", 
@"_searchInDictionary:", @"_revealSelection:", nil];
@@ -2105,9 +1836,6 @@
         }
     }
     
-    if (pdfvFlags.presentationMode)
-        return menu;
-    
     NSValue *pointValue = [NSValue valueWithPoint:[theEvent 
locationInView:self]];
     
     i = [menu indexOfItemWithTarget:self andAction:@selector(copy:)];
@@ -2348,8 +2076,6 @@
 }
 
 - (void)rotateWithEvent:(NSEvent *)theEvent {
-    if (pdfvFlags.presentationMode)
-        return;
     if ([theEvent phase] == NSEventPhaseBegan) {
         PDFPage *page = [self pageAndPoint:NULL forEvent:theEvent nearest:YES];
         gestureRotation = 0.0;
@@ -2373,24 +2099,10 @@
 }
 
 - (void)magnifyWithEvent:(NSEvent *)theEvent {
-    if ([[NSUserDefaults standardUserDefaults] 
boolForKey:SKDisablePinchZoomKey] == NO && pdfvFlags.presentationMode == 0)
+    if ([[NSUserDefaults standardUserDefaults] 
boolForKey:SKDisablePinchZoomKey] == NO)
         [super magnifyWithEvent:theEvent];
 }
 
-- (void)swipeWithEvent:(NSEvent *)theEvent {
-    if (pdfvFlags.presentationMode && [transitionController hasTransition]) {
-        if ([theEvent deltaX] < 0.0 || [theEvent deltaY] < 0.0) {
-            if ([self canGoToNextPage])
-                [self goToNextPage:nil];
-        } else if ([theEvent deltaX] > 0.0 || [theEvent deltaY] > 0.0) {
-            if ([self canGoToPreviousPage])
-                [self goToPreviousPage:nil];
-        }
-    } else {
-        [super swipeWithEvent:theEvent];
-    }
-}
-
 #pragma mark NSDraggingDestination protocol
 
 - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
@@ -2873,7 +2585,7 @@
             [[NSWorkspace sharedWorkspace] openURL:url];
         [self setCurrentAnnotation:nil];
         
-    } else if (pdfvFlags.hideNotes == NO && [currentAnnotation isEditable]) {
+    } else if (hideNotes == NO && [currentAnnotation isEditable]) {
         
         if ([currentAnnotation isText] == NO) {
             
@@ -2929,7 +2641,7 @@
         NSInteger level = [undoManager groupingLevel];
         success = [editor commitEditing];
         if ([undoManager groupingLevel] > level)
-            pdfvFlags.wantsNewUndoGroup = YES;
+            wantsNewUndoGroup = YES;
     }
     return success;
 }
@@ -2937,7 +2649,7 @@
 - (void)beginNewUndoGroupIfNeededWithCommit:(BOOL)commit {
     if (commit)
         [self commitEditing];
-    if (pdfvFlags.wantsNewUndoGroup) {
+    if (wantsNewUndoGroup) {
         NSUndoManager *undoManger = [self undoManager];
         if ([undoManger groupingLevel] > 0) {
             [undoManger endUndoGrouping];
@@ -3088,30 +2800,28 @@
         if (wasPageDisplayed == NO)
             [self goToCurrentPage:page];
         
-        if (pdfvFlags.presentationMode == 0) {
-            if (showBar) {
-                if ([self hasReadingBar] == NO || [syncDot 
shouldHideReadingBar])
-                    shouldHideReadingBar = YES;
-                [self stopPacer];
-                BOOL invert = [[NSUserDefaults standardUserDefaults] 
boolForKey:SKReadingBarInvertKey];
-                NSInteger line = [page indexOfLineRectAtPoint:point lower:YES];
-                if ([self hasReadingBar] == NO) {
-                    SKReadingBar *aReadingBar = [[SKReadingBar alloc] 
initWithPage:page line:line delegate:self];
-                    [self setReadingBar:aReadingBar];
-                    if (invert)
-                        [self requiresDisplay];
-                    else
-                        [self setNeedsDisplayForReadingBarBounds:[readingBar 
currentBounds] onPage:[readingBar page]];
-                    NSDictionary *userInfo = [NSDictionary 
dictionaryWithObjectsAndKeys:[readingBar page], SKPDFViewNewPageKey, nil];
-                    [[NSNotificationCenter defaultCenter] 
postNotificationName:SKPDFViewReadingBarDidChangeNotification object:self 
userInfo:userInfo];
-                } else {
-                    [readingBar goToLine:line onPage:page];
-                }
+        if (showBar) {
+            if ([self hasReadingBar] == NO || [syncDot shouldHideReadingBar])
+                shouldHideReadingBar = YES;
+            [self stopPacer];
+            BOOL invert = [[NSUserDefaults standardUserDefaults] 
boolForKey:SKReadingBarInvertKey];
+            NSInteger line = [page indexOfLineRectAtPoint:point lower:YES];
+            if ([self hasReadingBar] == NO) {
+                SKReadingBar *aReadingBar = [[SKReadingBar alloc] 
initWithPage:page line:line delegate:self];
+                [self setReadingBar:aReadingBar];
+                if (invert)
+                    [self requiresDisplay];
+                else
+                    [self setNeedsDisplayForReadingBarBounds:[readingBar 
currentBounds] onPage:[readingBar page]];
+                NSDictionary *userInfo = [NSDictionary 
dictionaryWithObjectsAndKeys:[readingBar page], SKPDFViewNewPageKey, nil];
+                [[NSNotificationCenter defaultCenter] 
postNotificationName:SKPDFViewReadingBarDidChangeNotification object:self 
userInfo:userInfo];
+            } else {
+                [readingBar goToLine:line onPage:page];
             }
-            if (select && [sel hasCharacters] && [self toolMode] == 
SKToolModeText) {
-                [self setCurrentSelection:sel];
-            }
         }
+        if (select && [sel hasCharacters] && [self toolMode] == 
SKToolModeText) {
+            [self setCurrentSelection:sel];
+        }
         
         visibleRect = [self convertRect:[self visibleContentRect] toPage:page];
         
@@ -3305,8 +3015,6 @@
 - (void)handleScaleChangedNotification:(NSNotification *)notification {
     [self resetPDFToolTipRects];
     [self updatePacer];
-    if (pdfvFlags.presentationMode && [self autoScales] == NO && fabs([self 
scaleFactor] - 1.0) > 0.0)
-        [self setAutoScales:YES];
 }
 
 - (void)handleKeyStateChangedNotification:(NSNotification *)notification {
@@ -3322,15 +3030,8 @@
     }
     if ([[notification name] 
isEqualToString:NSWindowDidResignKeyNotification]) {
         [self setTemporaryToolMode:SKToolModeNone];
-        if (pdfvFlags.presentationMode) {
-            [[self class] cancelPreviousPerformRequestsWithTarget:self 
selector:@selector(showNavWindow) object:nil];
-            [[self class] cancelPreviousPerformRequestsWithTarget:self 
selector:@selector(doAutoHide) object:nil];
-            [[self class] cancelPreviousPerformRequestsWithTarget:self 
selector:@selector(doAutoHideCursor) object:nil];
-            pdfvFlags.cursorHidden = 0;
-            [self setCursorForMouse:nil];
-        } else if (toolMode == SKToolModeMagnify) {
+        if (toolMode == SKToolModeMagnify)
             [loupeController hide];
-        }
     }
 }
 
@@ -3339,7 +3040,7 @@
 }
 
 - (void)undoManagerDidOpenOrCloseUndoGroup {
-    pdfvFlags.wantsNewUndoGroup = NO;
+    wantsNewUndoGroup = NO;
 }
 
 #pragma mark Key and window changes
@@ -3352,12 +3053,6 @@
     
     [self stopPacer];
     
-    if (pdfvFlags.presentationMode) {
-        [[self class] cancelPreviousPerformRequestsWithTarget:self 
selector:@selector(showNavWindow) object:nil];
-        [[self class] cancelPreviousPerformRequestsWithTarget:self 
selector:@selector(doAutoHide) object:nil];
-        [[self class] cancelPreviousPerformRequestsWithTarget:self 
selector:@selector(doAutoHideCursor) object:nil];
-    }
-    
     [self setTemporaryToolMode:SKToolModeNone];
     
     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
@@ -3453,8 +3148,6 @@
         return toolMode == SKToolModeNote;
     } else if (action == @selector(moveReadingBar:) || action == 
@selector(resizeReadingBar:)) {
         return [self hasReadingBar];
-    } else if (action == @selector(nextLaserPointerColor:) || action == 
@selector(previousLaserPointerColor:)) {
-        return pdfvFlags.useArrowCursorInPresentation == 0;
     } else {
         return [super validateMenuItem:menuItem];
     }
@@ -3480,97 +3173,6 @@
     }
 }
 
-#pragma mark FullScreen navigation and autohide
-
-- (void)enableNavigation {
-    navigationMode = [[NSUserDefaults standardUserDefaults] 
integerForKey:SKPresentationNavigationOptionKey];
-    [self performSelectorOnce:@selector(doAutoHide) 
afterDelay:AUTO_HIDE_DELAY];
-}
-
-- (void)disableNavigation {
-    navigationMode = SKNavigationNone;
-    
-    [[self class] cancelPreviousPerformRequestsWithTarget:self 
selector:@selector(showNavWindow) object:nil];
-    [[self class] cancelPreviousPerformRequestsWithTarget:self 
selector:@selector(doAutoHide) object:nil];
-    [[self class] cancelPreviousPerformRequestsWithTarget:self 
selector:@selector(doAutoHideCursor) object:nil];
-    if (navWindow) {
-        [navWindow remove];
-        navWindow = nil;
-    }
-    if (cursorWindow) {
-        [cursorWindow remove];
-        cursorWindow = nil;
-    }
-}
-
-- (void)doAutoHide {
-    if (pdfvFlags.presentationMode && ([navWindow isVisible] == NO || 
NSPointInRect([NSEvent mouseLocation], [navWindow frame]) == NO)) {
-        [self doAutoHideCursor];
-        if ([navWindow isVisible]) {
-            [navWindow fadeOut];
-            
NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self
 documentView]), NSAccessibilityLayoutChangedNotification, nil);
-        }
-    }
-}
-
-- (void)showNavWindow {
-    if ([navWindow isVisible] == NO && NSPointInRect([[self window] 
mouseLocationOutsideOfEventStream], SKSliceRect([[[self window] contentView] 
frame], NAVIGATION_BOTTOM_EDGE_HEIGHT, NSMinYEdge))) {
-        if (navWindow == nil)
-            navWindow = [[SKNavigationWindow alloc] initWithPDFView:self];
-        [navWindow showForWindow:[self window]];
-        
NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self
 documentView]), NSAccessibilityLayoutChangedNotification, [NSDictionary 
dictionaryWithObjectsAndKeys:NSAccessibilityUnignoredChildrenForOnlyChild(navWindow),
 NSAccessibilityUIElementsKey, nil]);
-    }
-}
-
-- (void)showCursorStyleWindow:(id)sender {
-    [navWindow fadeOut];
-    if ([cursorWindow isVisible] == NO) {
-        if (cursorWindow == nil)
-            cursorWindow = [[SKCursorStyleWindow alloc] initWithPDFView:self];
-        [cursorWindow showForWindow:[self window]];
-        
NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self
 documentView]), NSAccessibilityLayoutChangedNotification, [NSDictionary 
dictionaryWithObjectsAndKeys:NSAccessibilityUnignoredChildrenForOnlyChild(cursorWindow),
 NSAccessibilityUIElementsKey, nil]);
-    }
-}
-
-- (void)closeCursorStyleWindow:(id)sender {
-    [cursorWindow fadeOut];
-}
-
-- (NSInteger)cursorStyle {
-    return pdfvFlags.useArrowCursorInPresentation ? -1 : laserPointerColor;
-}
-
-- (void)changeCursorStyle:(id)sender {
-    NSInteger style = [sender selectedTag];
-    if (style < 0) {
-        pdfvFlags.useArrowCursorInPresentation = 1;
-        [[NSUserDefaults standardUserDefaults] setBool:YES 
forKey:SKUseArrowCursorInPresentationKey];
-    } else {
-        pdfvFlags.useArrowCursorInPresentation = 0;
-        laserPointerColor = style % 7;
-        [[NSUserDefaults standardUserDefaults] setBool:NO 
forKey:SKUseArrowCursorInPresentationKey];
-        [[NSUserDefaults standardUserDefaults] setInteger:laserPointerColor 
forKey:SKLaserPointerColorKey];
-    }
-}
-
-- (BOOL)removeCursorShadow {
-    return pdfvFlags.removeLaserPointerShadow;
-}
-
-- (void)toggleRemoveCursorShadow:(id)sender {
-    pdfvFlags.removeLaserPointerShadow = pdfvFlags.removeLaserPointerShadow == 
NO;
-    [[NSUserDefaults standardUserDefaults] 
setBool:pdfvFlags.removeLaserPointerShadow 
forKey:SKRemoveLaserPointerShadowKey];
-}
-
-- (BOOL)drawInPresentation {
-    return pdfvFlags.drawInPresentation;
-}
-
-- (void)toggleDrawInPresentation:(id)sender {
-    pdfvFlags.drawInPresentation = pdfvFlags.drawInPresentation == NO;
-    [[NSUserDefaults standardUserDefaults] setBool:NO == 
pdfvFlags.drawInPresentation forKey:SKDisableDrawingInPresentationKey];
-}
-
 #pragma mark Event handling
 
 - (void)doMoveCurrentAnnotationForKey:(unichar)eventChar 
byAmount:(CGFloat)delta {
@@ -4388,7 +3990,7 @@
             newCurrentAnnotation = linkAnnotation;
     }
     
-    if (pdfvFlags.hideNotes == NO && [[self document] allowsNotes] && page != 
nil && newCurrentAnnotation != nil) {
+    if (hideNotes == NO && [[self document] allowsNotes] && page != nil && 
newCurrentAnnotation != nil) {
         BOOL isInk = toolMode == SKToolModeNote && annotationMode == 
SKNoteTypeInk;
         NSUInteger modifiers = [theEvent modifierFlags];
         if ((modifiers & NSEventModifierFlagOption) && [newCurrentAnnotation 
isMovable] &&
@@ -4467,7 +4069,6 @@
     CAShapeLayer *layer = nil;
     NSRect boxBounds = NSIntersectionRect([page boundsForBox:[self 
displayBox]], [self convertRect:[self visibleContentRect] toPage:page]);
     CGAffineTransform t = CGAffineTransformMakeRotation(-M_PI_2 * [page 
rotation] / 90.0);
-    NSColor *tmpColor = pdfvFlags.presentationMode ? [[NSUserDefaults 
standardUserDefaults] colorForKey:SKPresentationInkNoteColorKey] : nil;
     layer = [CAShapeLayer layer];
     // transform and place so that the path is in scaled page coordinates
     [layer setBounds:CGRectMake(scale * NSMinX(boxBounds), scale * 
NSMinY(boxBounds), scale * NSWidth(boxBounds), scale * NSHeight(boxBounds))];
@@ -4493,7 +4094,7 @@
     } else {
         [self setCurrentAnnotation:nil];
         NSUserDefaults *sud = [NSUserDefaults standardUserDefaults];
-        [layer setStrokeColor:[tmpColor ?: [sud colorForKey:SKInkNoteColorKey] 
CGColor]];
+        [layer setStrokeColor:[[sud colorForKey:SKInkNoteColorKey] CGColor]];
         [layer setLineWidth:[sud floatForKey:SKInkNoteLineWidthKey] * scale];
         if ((PDFBorderStyle)[sud integerForKey:SKInkNoteLineStyleKey] == 
kPDFBorderStyleDashed) {
             [layer setLineDashPattern:scaledDashPattern([sud 
arrayForKey:SKInkNoteDashPatternKey], scale)];
@@ -4575,20 +4176,15 @@
             [annotation setBorder:[currentAnnotation border]];
             [annotation setString:[currentAnnotation string]];
         }
-        if (pdfvFlags.presentationMode == 0) {
-            [annotation registerUserName];
-            [self beginNewUndoGroupIfNeededWithCommit:NO];
-        } else if (tmpColor) {
-            [annotation setColor:tmpColor];
-        }
+        [annotation registerUserName];
+        [self beginNewUndoGroupIfNeededWithCommit:NO];

@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to