From bd3eb7950c7916505c0a1516a0bd5023ffaa2192 Mon Sep 17 00:00:00 2001 From: michael starke Date: Sat, 27 Aug 2016 13:53:27 +0200 Subject: [PATCH] Mingling on detecting UI introduces model changes --- MacPass.xcodeproj/project.pbxproj | 14 +++++++++++ MacPass/MPArrayController.h | 13 ++++++++++ MacPass/MPArrayController.m | 18 ++++++++++++++ MacPass/MPCustomFieldTableCellView.m | 5 ++++ MacPass/MPEntryInspectorViewController.m | 8 +++--- MacPass/MPModelChangeObserving.h | 27 +++++++++++++++++++++ MacPass/MPModelChangeObservingHelper.h | 22 +++++++++++++++++ MacPass/MPModelChangeObservingHelper.m | 28 +++++++++++++++++++++ MacPass/MPObjectController.h | 3 ++- MacPass/MPObjectController.m | 31 +++++++++++++++++++++++- MacPass/MPViewController.m | 8 +++--- 11 files changed, 168 insertions(+), 9 deletions(-) create mode 100644 MacPass/MPArrayController.h create mode 100644 MacPass/MPArrayController.m create mode 100644 MacPass/MPModelChangeObserving.h create mode 100644 MacPass/MPModelChangeObservingHelper.h create mode 100644 MacPass/MPModelChangeObservingHelper.m diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index f29367c7..b492c3ae 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -195,6 +195,8 @@ 4CAD748E15B88AC100104512 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CAD748D15B88AC100104512 /* libz.dylib */; }; 4CB915941A0159A20089CE5B /* DuplicateEntryOptionsWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CB915931A0159A20089CE5B /* DuplicateEntryOptionsWindow.xib */; }; 4CB9339916D3A0DD00A13B5D /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 4CB9339716D3A0DD00A13B5D /* Credits.rtf */; }; + 4CB9D77F1D70CE6B00F43F76 /* MPModelChangeObservingHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CB9D77E1D70CE6B00F43F76 /* MPModelChangeObservingHelper.m */; }; + 4CB9D7821D71AFBE00F43F76 /* MPArrayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CB9D7811D71AFBE00F43F76 /* MPArrayController.m */; }; 4CBA2ABA17074C07006D8139 /* MPSettingsHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBA2AB917074C07006D8139 /* MPSettingsHelper.m */; }; 4CC0D2CE17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0D2CD17974A47000B4BDA /* MPCustomFieldTableViewDelegate.m */; }; 4CC0D2D117974A5A000B4BDA /* MPAttachmentTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0D2D017974A5A000B4BDA /* MPAttachmentTableViewDelegate.m */; }; @@ -589,6 +591,11 @@ 4CB63A6018986530002DEC4C /* MPFlagsHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPFlagsHelper.h; sourceTree = ""; }; 4CB915931A0159A20089CE5B /* DuplicateEntryOptionsWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DuplicateEntryOptionsWindow.xib; sourceTree = ""; }; 4CB9339816D3A0DD00A13B5D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + 4CB9D77C1D70CBCE00F43F76 /* MPModelChangeObserving.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPModelChangeObserving.h; sourceTree = ""; }; + 4CB9D77D1D70CE6B00F43F76 /* MPModelChangeObservingHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPModelChangeObservingHelper.h; sourceTree = ""; }; + 4CB9D77E1D70CE6B00F43F76 /* MPModelChangeObservingHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPModelChangeObservingHelper.m; sourceTree = ""; }; + 4CB9D7801D71AFBE00F43F76 /* MPArrayController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPArrayController.h; sourceTree = ""; }; + 4CB9D7811D71AFBE00F43F76 /* MPArrayController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPArrayController.m; sourceTree = ""; }; 4CBA2AB617074B59006D8139 /* MPSettingsHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSettingsHelper.h; sourceTree = ""; }; 4CBA2AB917074C07006D8139 /* MPSettingsHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSettingsHelper.m; sourceTree = ""; }; 4CC0D2CC17974A47000B4BDA /* MPCustomFieldTableViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCustomFieldTableViewDelegate.h; sourceTree = ""; }; @@ -1299,6 +1306,7 @@ children = ( 4CA0B30D15BCB6FD00654E32 /* MPSettingsTab.h */, 4C2B0B7419F66F6400E48913 /* MPTargetNodeResolving.h */, + 4CB9D77C1D70CBCE00F43F76 /* MPModelChangeObserving.h */, ); name = Protocolls; sourceTree = ""; @@ -1364,6 +1372,10 @@ 4C6AEEF81A043E2B00CA2420 /* MPDocumentController.m */, 4CDE7B141D660983008C4160 /* MPObjectController.h */, 4CDE7B151D660983008C4160 /* MPObjectController.m */, + 4CB9D77D1D70CE6B00F43F76 /* MPModelChangeObservingHelper.h */, + 4CB9D77E1D70CE6B00F43F76 /* MPModelChangeObservingHelper.m */, + 4CB9D7801D71AFBE00F43F76 /* MPArrayController.h */, + 4CB9D7811D71AFBE00F43F76 /* MPArrayController.m */, ); name = "Data Controller"; sourceTree = ""; @@ -1695,6 +1707,7 @@ 4C2E382316D1421B00037A9D /* MPIconHelper.m in Sources */, 4C2E382616D1470200037A9D /* MPViewController.m in Sources */, 4C65FAE916D16DDB006E0577 /* MPPasswordInputController.m in Sources */, + 4CB9D7821D71AFBE00F43F76 /* MPArrayController.m in Sources */, 4CDF01A316D1B76700D0AC08 /* MPEntryViewController.m in Sources */, 4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */, 4C7B63731C0CB51F00D7038C /* TTTDataTransformer.m in Sources */, @@ -1705,6 +1718,7 @@ 4CE8246F16E2E93400573141 /* MPOverlayWindowController.m in Sources */, 4CE8247516E2F2B900573141 /* MPOverlayView.m in Sources */, 4C7B63761C0CB51F00D7038C /* TTTJSONTransformer.m in Sources */, + 4CB9D77F1D70CE6B00F43F76 /* MPModelChangeObservingHelper.m in Sources */, 4C77547516E55FE800970E02 /* MPInspectorViewController.m in Sources */, 4C89F524182FB4740069C73C /* MPAutotypeCommand.m in Sources */, 4CFC53BF16E94729007396BE /* MPShadowBox.m in Sources */, diff --git a/MacPass/MPArrayController.h b/MacPass/MPArrayController.h new file mode 100644 index 00000000..cfb419e7 --- /dev/null +++ b/MacPass/MPArrayController.h @@ -0,0 +1,13 @@ +// +// MPArrayController.h +// MacPass +// +// Created by Michael Starke on 27/08/16. +// Copyright © 2016 HicknHack Software GmbH. All rights reserved. +// + +#import + +@interface MPArrayController : NSArrayController + +@end diff --git a/MacPass/MPArrayController.m b/MacPass/MPArrayController.m new file mode 100644 index 00000000..c54f3421 --- /dev/null +++ b/MacPass/MPArrayController.m @@ -0,0 +1,18 @@ +// +// MPArrayController.m +// MacPass +// +// Created by Michael Starke on 27/08/16. +// Copyright © 2016 HicknHack Software GmbH. All rights reserved. +// + +#import "MPArrayController.h" + +@implementation MPArrayController + +- (void)setValue:(id)value forKeyPath:(NSString *)keyPath { + NSLog(@"%@ setValue:forKeyPath:%@", NSStringFromClass([self class]), keyPath); + [super setValue:value forKeyPath:keyPath]; +} + +@end diff --git a/MacPass/MPCustomFieldTableCellView.m b/MacPass/MPCustomFieldTableCellView.m index 1f949a06..bebd358d 100644 --- a/MacPass/MPCustomFieldTableCellView.m +++ b/MacPass/MPCustomFieldTableCellView.m @@ -14,4 +14,9 @@ [super setBackgroundStyle:NSBackgroundStyleLight]; } +- (void)setValue:(id)value forKeyPath:(NSString *)keyPath { + NSLog(@"%@ setValue:forKeyPath:%@", NSStringFromClass([self class]), keyPath); + [super setValue:value forKeyPath:keyPath]; +} + @end diff --git a/MacPass/MPEntryInspectorViewController.m b/MacPass/MPEntryInspectorViewController.m index e3eb063a..c38159aa 100644 --- a/MacPass/MPEntryInspectorViewController.m +++ b/MacPass/MPEntryInspectorViewController.m @@ -26,6 +26,8 @@ #import "KeePassKit/KeePassKit.h" +#import "MPArrayController.h" + #import "HNHUi/HNHUi.h" typedef NS_ENUM(NSUInteger, MPEntryTab) { @@ -68,9 +70,9 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { _showPassword = NO; - _attachmentsController = [[NSArrayController alloc] init]; - _customFieldsController = [[NSArrayController alloc] init]; - _windowAssociationsController = [[NSArrayController alloc] init]; + _attachmentsController = [[MPArrayController alloc] init]; + _customFieldsController = [[MPArrayController alloc] init]; + _windowAssociationsController = [[MPArrayController alloc] init]; _attachmentTableDelegate = [[MPAttachmentTableViewDelegate alloc] init]; _customFieldTableDelegate = [[MPCustomFieldTableViewDelegate alloc] init]; _attachmentDataSource = [[MPAttachmentTableDataSource alloc] init]; diff --git a/MacPass/MPModelChangeObserving.h b/MacPass/MPModelChangeObserving.h new file mode 100644 index 00000000..4ac2789f --- /dev/null +++ b/MacPass/MPModelChangeObserving.h @@ -0,0 +1,27 @@ +// +// MPModelChangeObserving.h +// MacPass +// +// Created by Michael Starke on 26/08/16. +// Copyright © 2016 HicknHack Software GmbH. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol MPModelChangeObserving + +FOUNDATION_EXTERN NSString *const MPWillChangeModelNotification; +FOUNDATION_EXTERN NSString *const MPDidChangreModelNotification; + +FOUNDATION_EXTERN NSString *const MPModelChangeObservingKeyPathKey; + +@required + +- (void)willChangeModel; +- (void)didChangeModel; + +@end + +NS_ASSUME_NONNULL_END \ No newline at end of file diff --git a/MacPass/MPModelChangeObservingHelper.h b/MacPass/MPModelChangeObservingHelper.h new file mode 100644 index 00000000..69d239a6 --- /dev/null +++ b/MacPass/MPModelChangeObservingHelper.h @@ -0,0 +1,22 @@ +// +// MPModelChangeObserver.h +// MacPass +// +// Created by Michael Starke on 26/08/16. +// Copyright © 2016 HicknHack Software GmbH. All rights reserved. +// + +#import + +/** + * This class is usefull to implement modelchangeobserving by just forwarding the protocoll calls to the helper + */ + +@protocol MPModelChangeObserving; + +@interface MPModelChangeObservingHelper : NSObject + ++ (void)willChangeModelKeyPath:(NSString *)keyPath observer:(id)observer; ++ (void)didChangeModelKeyPath:(NSString *)keyPath observer:(id)observer; + +@end diff --git a/MacPass/MPModelChangeObservingHelper.m b/MacPass/MPModelChangeObservingHelper.m new file mode 100644 index 00000000..c4330713 --- /dev/null +++ b/MacPass/MPModelChangeObservingHelper.m @@ -0,0 +1,28 @@ +// +// MPModelChangeObserver.m +// MacPass +// +// Created by Michael Starke on 26/08/16. +// Copyright © 2016 HicknHack Software GmbH. All rights reserved. +// + +#import "MPModelChangeObservingHelper.h" +#import "MPModelChangeObserving.h" + +NSString *const MPWillChangeModelNotification = @"com.hicknhack.macpass.MPWillChangeModelNotification"; +NSString *const MPDidChangreModelNotification = @"com.hicknhack.macpass.MPDidChangeModelNotification"; + +NSString *const MPModelChangeObservingKeyPathKey = @"MPModelChangeObservingKeyPathKey"; + +@implementation MPModelChangeObservingHelper + ++ (void)willChangeModelKeyPath:(NSString *)keyPath observer:(id)observer { + [[NSNotificationCenter defaultCenter] postNotificationName:MPWillChangeModelNotification object:observer userInfo:@{ MPModelChangeObservingKeyPathKey : keyPath }]; +} + ++ (void)didChangeModelKeyPath:(NSString *)keyPath observer:(id)observer { + [[NSNotificationCenter defaultCenter] postNotificationName:MPDidChangreModelNotification object:observer userInfo:@{ MPModelChangeObservingKeyPathKey : keyPath }]; + +} + +@end diff --git a/MacPass/MPObjectController.h b/MacPass/MPObjectController.h index 2556ac4c..5de3e80b 100644 --- a/MacPass/MPObjectController.h +++ b/MacPass/MPObjectController.h @@ -7,8 +7,9 @@ // #import +#import "MPModelChangeObserving.h" -@interface MPObjectController : NSObjectController +@interface MPObjectController : NSObjectController @property (weak) NSDocument *document; diff --git a/MacPass/MPObjectController.m b/MacPass/MPObjectController.m index a0bd95ab..23492aed 100644 --- a/MacPass/MPObjectController.m +++ b/MacPass/MPObjectController.m @@ -8,6 +8,10 @@ #import "MPObjectController.h" +@interface MPObjectController () +@property (strong) NSMutableSet *observedModelKeyPaths; +@end + @implementation MPObjectController - (void)discardEditing { @@ -19,8 +23,33 @@ } - (void)setValue:(id)value forKeyPath:(NSString *)keyPath { - NSLog(@"[%@ setValue:%@ forKeyPath:%@]", NSStringFromClass([self class]), value, keyPath); + BOOL observerd = NO; + for(NSString *observedKeyPath in self.observedModelKeyPaths) { + observerd = ([keyPath hasPrefix:observedKeyPath]); + if(observerd) { + break; + } + } + if(observerd) { + + } [super setValue:value forKeyPath:keyPath]; } +- (void)didChangeModel { + +} + +- (void)willChangeModel { + +} + +- (void)beginObservingModelKeyPath:(NSString *)keyPath { + [self.observedModelKeyPaths addObject:keyPath]; +} + +- (void)endObservingModelKeyPath:(NSString *)keyPath { + [self.observedModelKeyPaths removeObject:keyPath]; +} + @end diff --git a/MacPass/MPViewController.m b/MacPass/MPViewController.m index b084c88f..d9af4dc7 100644 --- a/MacPass/MPViewController.m +++ b/MacPass/MPViewController.m @@ -33,10 +33,10 @@ NSString *const MPViewControllerDidChangeValueForRepresentedObjectKeyPathNotific } - (void)updateResponderChain { - if(self.view && [self.view nextResponder] != self) { - NSResponder *nextResponder = [[self view] nextResponder]; - [[self view] setNextResponder:self]; - [self setNextResponder:nextResponder]; + if(self.view && self.view.nextResponder != self) { + NSResponder *nextResponder = self.view.nextResponder; + self.view.nextResponder = self; + self.nextResponder = nextResponder; } }