Revision: 29615
          http://sourceforge.net/p/bibdesk/svn/29615
Author:   hofman
Date:     2025-09-20 17:01:49 +0000 (Sat, 20 Sep 2025)
Log Message:
-----------
replace navigation delegate by KVO compliant properties

Modified Paths:
--------------
    trunk/bibdesk/BDSKWebGroupViewController.h
    trunk/bibdesk/BDSKWebGroupViewController.m
    trunk/bibdesk/BDSKWebView.h
    trunk/bibdesk/BDSKWebView.m

Modified: trunk/bibdesk/BDSKWebGroupViewController.h
===================================================================
--- trunk/bibdesk/BDSKWebGroupViewController.h  2025-09-20 16:12:17 UTC (rev 
29614)
+++ trunk/bibdesk/BDSKWebGroupViewController.h  2025-09-20 17:01:49 UTC (rev 
29615)
@@ -38,13 +38,12 @@
  */
 
 #import <Cocoa/Cocoa.h>
-#import "BDSKWebView.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
-@class BDSKEdgeView, BDSKAddressTextField, BDSKFieldEditor;
+@class BDSKWebView, BDSKEdgeView, BDSKAddressTextField, BDSKFieldEditor;
 
-@interface BDSKWebGroupViewController : NSViewController <NSMenuDelegate, 
BDSKWebViewNavigationDelegate> {
+@interface BDSKWebGroupViewController : NSViewController <NSMenuDelegate> {
     BDSKAddressTextField *urlField;
     NSSegmentedControl *backForwardButton;
     BDSKFieldEditor *fieldEditor;

Modified: trunk/bibdesk/BDSKWebGroupViewController.m
===================================================================
--- trunk/bibdesk/BDSKWebGroupViewController.m  2025-09-20 16:12:17 UTC (rev 
29614)
+++ trunk/bibdesk/BDSKWebGroupViewController.m  2025-09-20 17:01:49 UTC (rev 
29615)
@@ -39,6 +39,7 @@
 
 #import "BDSKWebGroupViewController.h"
 #import <WebKit/WebKit.h>
+#import "BDSKWebView.h"
 #import "BDSKEdgeView.h"
 #import "BDSKAddressTextField.h"
 #import "BDSKAddressTextFieldCell.h"
@@ -53,6 +54,8 @@
 #import "NSPasteboard_BDSKExtensions.h"
 #import "BDSKWebIconDatabase.h"
 
+static char BDSKWebViewObservationContext;
+
 #define MAX_HISTORY 50
 #define BACK_SEGMENT_INDEX 0
 #define FORWARD_SEGMENT_INDEX 1
@@ -71,6 +74,22 @@
     [urlField setDelegate:nil];
 }
 
+- (void)updateNavigationButtons {
+    BDSKWebView *webView = [self webView];
+    [backForwardButton setEnabled:[webView canGoBack] 
forSegment:BACK_SEGMENT_INDEX];
+    [backForwardButton setEnabled:[webView canGoForward] 
forSegment:FORWARD_SEGMENT_INDEX];
+    [[urlField button] setEnabled:YES];
+    if ([webView isLoading]) {
+        [[urlField button] setImage:[NSImage 
imageNamed:NSImageNameStopProgressTemplate]];
+        [[urlField button] setToolTip:NSLocalizedString(@"Cancel download", 
@"Tool tip message")];
+        [[urlField button] setKeyEquivalent:@"."];
+    } else {
+        [[urlField button] setImage:[NSImage 
imageNamed:NSImageNameRefreshTemplate]];
+        [[urlField button] setToolTip:NSLocalizedString(@"Reload page", @"Tool 
tip message")];
+        [[urlField button] setKeyEquivalent:@"r"];
+    }
+}
+
 - (void)viewDidLoad {
     [super viewDidLoad];
     
@@ -87,8 +106,8 @@
     [menu setDelegate:self];
     [backForwardButton setMenu:menu forSegment:FORWARD_SEGMENT_INDEX];
     
-    // update the buttons, we should not be retrieving at this point
-    [self webView:[self representedObject] setLoading:NO];
+    // update the buttons, we should not be loading at this point
+    [self updateNavigationButtons];
     
     [urlField registerForDraggedTypes:@[(__bridge NSString *)kUTTypeURL, 
(__bridge NSString *)kUTTypeFileURL, NSURLPboardType, NSFilenamesPboardType]];
     
@@ -107,14 +126,18 @@
     BDSKWebView *oldWebView = [self representedObject];
     if (oldWebView != newWebView) {
         if (oldWebView) {
-            [oldWebView setNavigationDelegate:nil];
+            @try {
+                [oldWebView removeObserver:self forKeyPath:@"URL" 
context:&BDSKWebViewObservationContext];
+                [oldWebView removeObserver:self forKeyPath:@"mainFrameIcon" 
context:&BDSKWebViewObservationContext];
+                [oldWebView removeObserver:self forKeyPath:@"loading" 
context:&BDSKWebViewObservationContext];
+            }
+            @catch (id e) {}
         }
         [self setRepresentedObject:newWebView];
         if (newWebView) {
-            [self webView:newWebView setURL:[newWebView URL]];
-            [self webView:newWebView setIcon:[newWebView mainFrameIcon]];
-            [self webView:newWebView setLoading:[newWebView isLoading]];
-            [newWebView setNavigationDelegate:self];
+            [newWebView addObserver:self forKeyPath:@"URL" 
options:NSKeyValueObservingOptionInitial 
context:&BDSKWebViewObservationContext];
+            [newWebView addObserver:self forKeyPath:@"mainFrameIcon" 
options:NSKeyValueObservingOptionInitial 
context:&BDSKWebViewObservationContext];
+            [newWebView addObserver:self forKeyPath:@"loading" 
options:NSKeyValueObservingOptionInitial 
context:&BDSKWebViewObservationContext];
         }
     }
 }
@@ -158,29 +181,19 @@
         [[self webView] goToBackForwardItem:item];
 }
 
-#pragma mark BDSKWebViewNavigationDelegate protocol
+#pragma mark KVO
 
-- (void)webView:(WebView *)sender setIcon:(NSImage *)icon {
-    [[urlField imageView] setImage:icon ?: [NSImage imageNamed:@"Bookmark"]];
-}
-
-- (void)webView:(WebView *)sender setURL:(NSURL *)aURL {
-    [urlField setURL:aURL];
-}
-
-- (void)webView:(WebView *)sender setLoading:(BOOL)loading {
-    WebView *webView = [self webView];
-    [backForwardButton setEnabled:[webView canGoBack] 
forSegment:BACK_SEGMENT_INDEX];
-    [backForwardButton setEnabled:[webView canGoForward] 
forSegment:FORWARD_SEGMENT_INDEX];
-    [[urlField button] setEnabled:YES];
-    if (loading) {
-        [[urlField button] setImage:[NSImage 
imageNamed:NSImageNameStopProgressTemplate]];
-        [[urlField button] setToolTip:NSLocalizedString(@"Cancel download", 
@"Tool tip message")];
-        [[urlField button] setKeyEquivalent:@"."];
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
+    if (context == &BDSKWebViewObservationContext) {
+        BDSKWebView *webView = [self webView];
+        if ([keyPath isEqualToString:@"URL"])
+            [urlField setURL:[webView URL]];
+        else if ([keyPath isEqualToString:@"mainFrameIcon"])
+            [[urlField imageView] setImage:[webView mainFrameIcon] ?: [NSImage 
imageNamed:@"Bookmark"]];
+        else if ([keyPath isEqualToString:@"loading"])
+            [self updateNavigationButtons];
     } else {
-        [[urlField button] setImage:[NSImage 
imageNamed:NSImageNameRefreshTemplate]];
-        [[urlField button] setToolTip:NSLocalizedString(@"Reload page", @"Tool 
tip message")];
-        [[urlField button] setKeyEquivalent:@"r"];
+        [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];
     }
 }
 

Modified: trunk/bibdesk/BDSKWebView.h
===================================================================
--- trunk/bibdesk/BDSKWebView.h 2025-09-20 16:12:17 UTC (rev 29614)
+++ trunk/bibdesk/BDSKWebView.h 2025-09-20 17:01:49 UTC (rev 29615)
@@ -52,7 +52,7 @@
 };
 
 @class BDSKWebDelegate;
-@protocol BDSKWebViewDelegate, BDSKWebViewNavigationDelegate;
+@protocol BDSKWebViewDelegate;
 
 @interface BDSKWebView : WebView {
     BDSKWebDelegate *webDelegate;
@@ -64,7 +64,6 @@
 }
 
 @property (nonatomic, nullable, weak) id<BDSKWebViewDelegate> delegate;
-@property (nonatomic, nullable, weak) id<BDSKWebViewNavigationDelegate> 
navigationDelegate;
 
 @property (nonatomic, nullable, strong) NSURL *URL;
 
@@ -101,15 +100,4 @@
 
 @end
 
-#pragma mark -
-
-@protocol BDSKWebViewNavigationDelegate <NSObject>
-@optional
-
-- (void)webView:(WebView *)sender setURL:(NSURL *)aURL;
-- (void)webView:(WebView *)sender setIcon:(nullable NSImage *)icon;
-- (void)webView:(WebView *)sender setLoading:(BOOL)loading;
-
-@end
-
 NS_ASSUME_NONNULL_END

Modified: trunk/bibdesk/BDSKWebView.m
===================================================================
--- trunk/bibdesk/BDSKWebView.m 2025-09-20 16:12:17 UTC (rev 29614)
+++ trunk/bibdesk/BDSKWebView.m 2025-09-20 17:01:49 UTC (rev 29615)
@@ -54,12 +54,10 @@
 
 @interface BDSKWebDelegate : NSObject <WebFrameLoadDelegate, 
WebPolicyDelegate, WebUIDelegate, WebEditingDelegate> {
     __weak id <BDSKWebViewDelegate> delegate;
-    __weak id <BDSKWebViewNavigationDelegate> navigationDelegate;
     NSUndoManager *undoManager;
 }
 
 @property (nonatomic, nullable, weak) id<BDSKWebViewDelegate> delegate;
-@property (nonatomic, nullable, weak) id<BDSKWebViewNavigationDelegate> 
navigationDelegate;
 
 @end
 
@@ -81,7 +79,7 @@
 
 @implementation BDSKWebView
 
-@dynamic delegate, navigationDelegate, URL;
+@dynamic delegate, URL;
 
 - (instancetype)initWithFrame:(NSRect)frameRect frameName:(NSString 
*)frameName groupName:(NSString *)groupName {
     self = [super initWithFrame:frameRect frameName:frameName 
groupName:@"BibDeskWebGroup"];
@@ -103,7 +101,6 @@
     urlTimer = nil;
     [faviconDownload cancel];
     [webDelegate setDelegate:nil];
-    [webDelegate setNavigationDelegate:nil];
     [self setFrameLoadDelegate:nil];
     [self setPolicyDelegate:nil];
     [self setUIDelegate:nil];
@@ -130,10 +127,6 @@
 
 - (void)setDelegate:(id<BDSKWebViewDelegate>)newDelegate { [webDelegate 
setDelegate:newDelegate]; }
 
-- (id<BDSKWebViewNavigationDelegate>)navigationDelegate { return [webDelegate 
navigationDelegate]; }
-
-- (void)setNavigationDelegate:(id<BDSKWebViewNavigationDelegate>)newDelegate { 
[webDelegate setNavigationDelegate:newDelegate]; }
-
 #pragma mark Actions
 
 - (IBAction)reload:(id)sender {
@@ -251,9 +244,11 @@
 // mainFrameIcon is not functional, it always returns the default icon
 
 - (void)setFavicon:(NSImage *)icon {
+    [self willChangeValueForKey:@"mainFrameIcon"];
     if (icon != favicon) {
         favicon = icon;
     }
+    [self didChangeValueForKey:@"mainFrameIcon"];
     if ([[self frameLoadDelegate] 
respondsToSelector:@selector(webView:didReceiveIcon:forFrame:)])
         [[self frameLoadDelegate] webView:self didReceiveIcon:favicon 
forFrame:nil];
 }
@@ -424,7 +419,7 @@
 
 @implementation BDSKWebDelegate
 
-@synthesize delegate, navigationDelegate;
+@synthesize delegate;
 
 - (BOOL)respondsToSelector:(SEL)aSelector {
     if (aSelector == @selector(webView:setStatusText:) ||
@@ -434,8 +429,6 @@
         aSelector == @selector(webView:setFrame:) ||
         aSelector == @selector(webView:setStatusBarVisible:))
         return [delegate respondsToSelector:aSelector];
-    else if (aSelector == @selector(webView:didReceiveIcon:forFrame:))
-        return [navigationDelegate 
respondsToSelector:@selector(webView:setIcon:)];
     else if (aSelector == @selector(webView:didReceiveTitle:forFrame:))
         return [delegate respondsToSelector:@selector(webView:setTitle:)];
     else if (aSelector == 
@selector(webView:mouseDidMoveOverElement:modifierFlags:))
@@ -446,16 +439,6 @@
 
 #pragma mark Delegate forward
 
-- (void)webView:(WebView *)sender setIcon:(NSImage *)icon {
-    if ([navigationDelegate respondsToSelector:@selector(webView:setIcon:)])
-        [navigationDelegate webView:sender setIcon:icon];
-}
-
-- (void)webView:(WebView *)sender setLoading:(BOOL)loading {
-    if ([navigationDelegate respondsToSelector:@selector(webView:setLoading:)])
-        [navigationDelegate webView:sender setLoading:loading];
-}
-
 - (void)webView:(WebView *)sender setTitle:(NSString *)title {
     if ([delegate respondsToSelector:@selector(webView:setTitle:)])
         [delegate webView:sender setTitle:title ?: @""];
@@ -468,11 +451,11 @@
         if ([sender respondsToSelector:@selector(didStartLoadForMainFrame)]) {
             [(BDSKWebView *)sender didStartLoadForMainFrame];
         } else {
-            [self webView:sender setIcon:nil];
             [self webView:sender setTitle:[NSLocalizedString(@"Loading", 
@"Placeholder web group label") stringByAppendingEllipsis]];
         }
     }
-    [self webView:sender setLoading:[sender isLoading]];
+    [sender willChangeValueForKey:@"loading"];
+    [sender didChangeValueForKey:@"loading"];
     
     if ([delegate respondsToSelector:@selector(webView:didStartLoadForFrame:)])
         [delegate webView:sender didStartLoadForFrame:frame];
@@ -479,8 +462,10 @@
 }
 
 - (void)webView:(WebView *)sender didCommitLoadForFrame:(WebFrame *)frame {
-    if (frame == [sender mainFrame] && [navigationDelegate 
respondsToSelector:@selector(webView:setURL:)])
-        [navigationDelegate webView:sender setURL:[[[[sender mainFrame] 
dataSource] request] URL]];
+    if (frame == [sender mainFrame] && [sender respondsToSelector: 
@selector(URL)]) {
+        [sender willChangeValueForKey:@"URL"];
+        [sender didChangeValueForKey:@"URL"];
+    }
 }
 
 - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame{
@@ -489,11 +474,11 @@
         if ([sender respondsToSelector:@selector(didFinishLoadForMainFrame)]) {
              [(BDSKWebView *)sender didFinishLoadForMainFrame];
         } else {
-            [self webView:sender setIcon:[sender mainFrameIcon]];
             [self webView:sender setTitle:[sender mainFrameTitle]];
         }
     }
-    [self webView:sender setLoading:[sender isLoading]];
+    [sender willChangeValueForKey:@"loading"];
+    [sender didChangeValueForKey:@"loading"];
     
     if ([delegate 
respondsToSelector:@selector(webView:didFinishLoadForFrame:)])
         [delegate webView:sender didFinishLoadForFrame:frame];
@@ -507,7 +492,8 @@
             [self webView:sender setTitle:NSLocalizedString(@"Error", 
@"Placeholder web group label")];
         }
     }
-    [self webView:sender setLoading:[sender isLoading]];
+    [sender willChangeValueForKey:@"loading"];
+    [sender didChangeValueForKey:@"loading"];
     
     if ([delegate respondsToSelector:@selector(webView:didFailLoadForFrame:)])
         [delegate webView:sender didFailLoadForFrame:frame];
@@ -529,11 +515,6 @@
     [self webView:sender didFailLoadWithError:error forFrame:frame];
 }
 
-- (void)webView:(WebView *)sender didReceiveIcon:(NSImage *)image 
forFrame:(WebFrame *)frame{
-    if (frame == nil)
-        [self webView:sender setIcon:image];
-}
-
 - (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title 
forFrame:(WebFrame *)frame {
     if (frame == [sender mainFrame] || frame == nil)
         [self webView:sender setTitle:title];

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



_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to