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