From 5547aad7c3ae0eacd971d65d7937f4e781a5b875 Mon Sep 17 00:00:00 2001 From: Michael Starke Date: Tue, 15 Mar 2022 15:21:45 +0100 Subject: [PATCH] Added better handling of responder chain in NSSplitViewController. This allows for the removal of a lot of redirection in the MPDocumentWindowController --- MacPass.xcodeproj/project.pbxproj | 10 +++++++ MacPass/Base.lproj/EntryInspectorView.xib | 20 +++---------- MacPass/MPDocumentSplitViewController.m | 21 +++++++++++++ MacPass/MPDocumentWindowController.m | 36 ----------------------- MacPass/MPEntryAttributeViewController.m | 4 +++ MacPass/MPInspectorViewController.m | 21 +++++++++++++ MacPass/MPNodeIconViewController.m | 1 + MacPass/MPNodeIconViewController.xib | 19 ++++++++++-- MacPass/MPNodeTagViewController.h | 17 +++++++++++ MacPass/MPNodeTagViewController.m | 22 ++++++++++++++ MacPass/MPNodeTagViewController.xib | 19 ++++++++++++ 11 files changed, 135 insertions(+), 55 deletions(-) create mode 100644 MacPass/MPNodeTagViewController.h create mode 100644 MacPass/MPNodeTagViewController.m create mode 100644 MacPass/MPNodeTagViewController.xib diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index f0544504..6b54122f 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -307,6 +307,8 @@ 4CE88B9717BA651C0042E078 /* contextTriangleTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CE88B9617BA651C0042E078 /* contextTriangleTemplate.pdf */; }; 4CEE46DD181C301D006BF1E5 /* MPAutotypeDaemon.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE46DC181C301D006BF1E5 /* MPAutotypeDaemon.m */; }; 4CEED1C617D7BD0E007180F1 /* NSError+Messages.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEED1C517D7BD0E007180F1 /* NSError+Messages.m */; }; + 4CF13A9727E0D5D800E3297A /* MPNodeTagViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF13A9527E0D5D800E3297A /* MPNodeTagViewController.m */; }; + 4CF13A9827E0D5D800E3297A /* MPNodeTagViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CF13A9627E0D5D800E3297A /* MPNodeTagViewController.xib */; }; 4CF29BF417879D0000851B60 /* 26_FileSaveTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */; }; 4CF5BE6D1BF33E3000048505 /* NSApplication+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF5BE6C1BF33E3000048505 /* NSApplication+MPAdditions.m */; }; 4CF6653820E67A140008A25C /* PluginDataView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CF6653A20E67A140008A25C /* PluginDataView.xib */; }; @@ -939,6 +941,9 @@ 4CEE46DC181C301D006BF1E5 /* MPAutotypeDaemon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAutotypeDaemon.m; sourceTree = ""; }; 4CEED1C417D7BD0E007180F1 /* NSError+Messages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+Messages.h"; sourceTree = ""; }; 4CEED1C517D7BD0E007180F1 /* NSError+Messages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+Messages.m"; sourceTree = ""; }; + 4CF13A9427E0D5D800E3297A /* MPNodeTagViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPNodeTagViewController.h; sourceTree = ""; }; + 4CF13A9527E0D5D800E3297A /* MPNodeTagViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPNodeTagViewController.m; sourceTree = ""; }; + 4CF13A9627E0D5D800E3297A /* MPNodeTagViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MPNodeTagViewController.xib; sourceTree = ""; }; 4CF14962224B623700D1CE1C /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Base; path = Base.lproj/Credits.rtf; sourceTree = ""; }; 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 26_FileSaveTemplate.pdf; sourceTree = ""; }; 4CF5BE6B1BF33E3000048505 /* NSApplication+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+MPAdditions.h"; sourceTree = ""; }; @@ -1547,6 +1552,9 @@ 4C98A6C927CFAB1800CD912F /* MPNodeIconViewController.h */, 4C98A6CA27CFAB1900CD912F /* MPNodeIconViewController.m */, 4C98A6CB27CFAB1900CD912F /* MPNodeIconViewController.xib */, + 4CF13A9427E0D5D800E3297A /* MPNodeTagViewController.h */, + 4CF13A9527E0D5D800E3297A /* MPNodeTagViewController.m */, + 4CF13A9627E0D5D800E3297A /* MPNodeTagViewController.xib */, ); name = Inspector; sourceTree = ""; @@ -2253,6 +2261,7 @@ 4C52A88E1788628B00868229 /* 06_BlockDeviceTemplate.pdf in Resources */, 4C52A88F1788628B00868229 /* 13_KeysTemplate.pdf in Resources */, 4C3826C61AD04D8E007D7D67 /* 59_DevelopmentTemplate.pdf in Resources */, + 4CF13A9827E0D5D800E3297A /* MPNodeTagViewController.xib in Resources */, 4C52A8901788628B00868229 /* 18_DisplayTemplate.pdf in Resources */, 4C52A892178863B000868229 /* 68_PhoneTemplate.pdf in Resources */, 6021FE7718E15FF300C3BC51 /* DatePickingView.xib in Resources */, @@ -2403,6 +2412,7 @@ 4C569DA117652BFE00595B62 /* MPEntryTableDataSource.m in Sources */, 4CD034AA1BFE113B003C002C /* MPPlugin.m in Sources */, 4CA2335A176DBFE100F0B6AC /* MPLockDaemon.m in Sources */, + 4CF13A9727E0D5D800E3297A /* MPNodeTagViewController.m in Sources */, 4C77C84118E240E000D1C42B /* DDHotKey+MacPassAdditions.m in Sources */, 4C89B71019B4B4A300DC0A6A /* MPTreeDelegate.m in Sources */, 4C88C66918D9F8D600F43852 /* MPTemporaryFileStorageCenter.m in Sources */, diff --git a/MacPass/Base.lproj/EntryInspectorView.xib b/MacPass/Base.lproj/EntryInspectorView.xib index 1d83c0fe..17d798b4 100644 --- a/MacPass/Base.lproj/EntryInspectorView.xib +++ b/MacPass/Base.lproj/EntryInspectorView.xib @@ -50,12 +50,12 @@ - + - + @@ -240,16 +240,6 @@ - @@ -258,9 +248,7 @@ - - - + @@ -277,7 +265,7 @@ - + diff --git a/MacPass/MPDocumentSplitViewController.m b/MacPass/MPDocumentSplitViewController.m index dfffa177..1474dc28 100644 --- a/MacPass/MPDocumentSplitViewController.m +++ b/MacPass/MPDocumentSplitViewController.m @@ -106,4 +106,25 @@ [NSUserDefaults.standardUserDefaults setBool:!inspector.collapsed forKey:kMPSettingsKeyShowInspector]; } +- (id)supplementalTargetForAction:(SEL)action sender:(id)sender { + NSLog(@"First Responder:%@",self.view.window.firstResponder); + NSLog(@"Looking for target for action:%@", NSStringFromSelector(action)); + for(NSViewController *childViewController in self.childViewControllers) { + if([childViewController respondsToSelector:action]) { + NSLog(@"Found target:%@ for action:%@", childViewController, NSStringFromSelector(action)); + return childViewController; + } + else { + id target = [childViewController supplementalTargetForAction:action sender:sender]; + if(!target) { + NSLog(@"No target for action:%@", NSStringFromSelector(action)); + continue; + } + NSLog(@"Found supplemental target:%@ for action:%@", target, NSStringFromSelector(action)); + return target; + } + } + return [super supplementalTargetForAction:action sender:sender]; +} + @end diff --git a/MacPass/MPDocumentWindowController.m b/MacPass/MPDocumentWindowController.m index 625f521e..ce6dc58d 100644 --- a/MacPass/MPDocumentWindowController.m +++ b/MacPass/MPDocumentWindowController.m @@ -441,16 +441,6 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword); }]; } -- (void)pickExpiryDate:(id)sender { - // FIXME: use propert responder chain - [self.splitViewController.inspectorViewController pickExpiryDate:sender]; -} - -- (void)showPluginData:(id)sender { - // FIXME: use propert responder chain - [self.splitViewController.inspectorViewController showPluginData:sender]; -} - - (void)toggleInspector:(id)sender { [self.splitViewController toggleInspector:sender]; } @@ -497,32 +487,6 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword); [self.splitViewController.outlineViewController selectGroup:targetEntries.lastObject.parent]; } -#pragma mark - -#pragma mark Actions forwarded to MPEntryViewController -- (void)copyUsername:(id)sender { - [self.splitViewController.entryViewController copyUsername:sender]; -} - -- (void)copyPassword:(id)sender { - [self.splitViewController.entryViewController copyPassword:sender]; -} - -- (void)copyCustomAttribute:(id)sender { - [self.splitViewController.entryViewController copyCustomAttribute:sender]; -} - -- (void)copyAsReference:(id)sender { - [self.splitViewController.entryViewController copyAsReference:sender]; -} - -- (void)copyURL:(id)sender { - [self.splitViewController.entryViewController copyURL:sender]; -} - -- (void)openURL:(id)sender { - [self.splitViewController.entryViewController openURL:sender]; -} - #pragma mark Validation - (BOOL)validateMenuItem:(NSMenuItem *)menuItem { return ([self.document validateMenuItem:menuItem]); diff --git a/MacPass/MPEntryAttributeViewController.m b/MacPass/MPEntryAttributeViewController.m index ce963fef..b7242116 100644 --- a/MacPass/MPEntryAttributeViewController.m +++ b/MacPass/MPEntryAttributeViewController.m @@ -235,5 +235,9 @@ NSString *nameForDefaultKey(NSString *key) { [super objectDidEndEditing:editor]; } +- (void)commitEditingWithDelegate:(nullable id)delegate didCommitSelector:(nullable SEL)didCommitSelector contextInfo:(nullable void *)contextInfo { + [super commitEditingWithDelegate:delegate didCommitSelector:didCommitSelector contextInfo:contextInfo]; +} + @end diff --git a/MacPass/MPInspectorViewController.m b/MacPass/MPInspectorViewController.m index 2f651aa9..d5361f62 100644 --- a/MacPass/MPInspectorViewController.m +++ b/MacPass/MPInspectorViewController.m @@ -81,6 +81,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) { } - (void)awakeFromNib { + // TODO: Convert to NSTabViewController? self.noSelectionInfo.cell.backgroundStyle = NSBackgroundStyleRaised; self.itemImageView.cell.backgroundStyle = NSBackgroundStyleRaised; [self.tabView bind:NSSelectedIndexBinding toObject:self withKeyPath:NSStringFromSelector(@selector(activeTab)) options:nil]; @@ -105,6 +106,10 @@ typedef NS_ENUM(NSUInteger, MPContentTab) { [groupTabView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[groupView]|" options:0 metrics:nil views:views]]; groupTabItem.initialFirstResponder = groupView; + + [self addChildViewController:self.entryViewController]; + [self addChildViewController:self.groupViewController]; + [self.view layout];} - (void)registerNotificationsForDocument:(MPDocument *)document { @@ -217,4 +222,20 @@ typedef NS_ENUM(NSUInteger, MPContentTab) { } +- (id)supplementalTargetForAction:(SEL)action sender:(id)sender { + for(NSViewController *childViewController in self.childViewControllers) { + if([childViewController respondsToSelector:action]) { + return childViewController; + } + else { + id target = [childViewController supplementalTargetForAction:action sender:sender]; + if(!target) { + continue; + } + return target; + } + } + return [super supplementalTargetForAction:action sender:sender]; +} + @end diff --git a/MacPass/MPNodeIconViewController.m b/MacPass/MPNodeIconViewController.m index b5f20cce..7a330fb8 100644 --- a/MacPass/MPNodeIconViewController.m +++ b/MacPass/MPNodeIconViewController.m @@ -8,6 +8,7 @@ #import "MPNodeIconViewController.h" #import +#import "MPEntryInspectorViewController.h" #import "KPKNode+IconImage.h" diff --git a/MacPass/MPNodeIconViewController.xib b/MacPass/MPNodeIconViewController.xib index b7f75307..5f5f01df 100644 --- a/MacPass/MPNodeIconViewController.xib +++ b/MacPass/MPNodeIconViewController.xib @@ -10,6 +10,7 @@ + @@ -27,22 +28,34 @@ - - + + + + + + - diff --git a/MacPass/MPNodeTagViewController.h b/MacPass/MPNodeTagViewController.h new file mode 100644 index 00000000..210f8a71 --- /dev/null +++ b/MacPass/MPNodeTagViewController.h @@ -0,0 +1,17 @@ +// +// MPNodeTagViewController.h +// MacPass +// +// Created by Michael Starke on 15.03.22. +// Copyright © 2022 HicknHack Software GmbH. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface MPNodeTagViewController : NSViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/MacPass/MPNodeTagViewController.m b/MacPass/MPNodeTagViewController.m new file mode 100644 index 00000000..b7ec2eb6 --- /dev/null +++ b/MacPass/MPNodeTagViewController.m @@ -0,0 +1,22 @@ +// +// MPNodeTagViewController.m +// MacPass +// +// Created by Michael Starke on 15.03.22. +// Copyright © 2022 HicknHack Software GmbH. All rights reserved. +// + +#import "MPNodeTagViewController.h" + +@interface MPNodeTagViewController () + +@end + +@implementation MPNodeTagViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do view setup here. +} + +@end diff --git a/MacPass/MPNodeTagViewController.xib b/MacPass/MPNodeTagViewController.xib new file mode 100644 index 00000000..e32840e3 --- /dev/null +++ b/MacPass/MPNodeTagViewController.xib @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + +