From 731384ca1e92795f881f43dedb806cc4fbc713ef Mon Sep 17 00:00:00 2001 From: michael starke Date: Tue, 4 Aug 2015 17:18:08 +0200 Subject: [PATCH] Moder Objective-C. Adoping changed KeePassKit API Signed-off-by: michael starke --- MacPass.xcodeproj/project.pbxproj | 4 + MacPass/MPDatabaseSettingsWindowController.m | 22 ++-- MacPass/MPDocument.m | 8 +- MacPass/MPEntryViewController.m | 10 +- MacPass/MPGroupInspectorViewController.m | 2 +- MacPass/MPInspectorViewController.m | 7 +- MacPass/MPOutlineDataSource.m | 4 +- MacPass/MPOutlineViewController.m | 4 +- MacPassTests/KPKTestNSCoding.m | 4 +- MacPassTests/KPKTestReference.m | 2 +- MacPassTests/KPKTestUndo.m | 100 +++++++++++++++++++ 11 files changed, 133 insertions(+), 34 deletions(-) create mode 100644 MacPassTests/KPKTestUndo.m diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index de3f6c72..c09eb7a7 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -256,6 +256,7 @@ 4C80BB6F176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C80BB6E176DE06F00E5E248 /* HNHScrollDocumentViewAdapter.m */; }; 4C811C8316ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */; }; 4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C83814115BF4677001AE468 /* MPDocumentWindowController.m */; }; + 4C8775201B70CA4B00069609 /* KPKTestUndo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C87751F1B70CA4B00069609 /* KPKTestUndo.m */; }; 4C888C9016EB6C91003D34A1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C888C8E16EB6C91003D34A1 /* Localizable.strings */; }; 4C888C9316EB6F5E003D34A1 /* MPToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */; }; 4C888C9716EB754B003D34A1 /* MPActionHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C888C9616EB754B003D34A1 /* MPActionHelper.m */; }; @@ -854,6 +855,7 @@ 4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPKeyfilePathControlDelegate.m; sourceTree = ""; }; 4C83814015BF4677001AE468 /* MPDocumentWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDocumentWindowController.h; sourceTree = ""; }; 4C83814115BF4677001AE468 /* MPDocumentWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDocumentWindowController.m; sourceTree = ""; }; + 4C87751F1B70CA4B00069609 /* KPKTestUndo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KPKTestUndo.m; sourceTree = ""; }; 4C888C8F16EB6C91003D34A1 /* en */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; }; 4C888C9116EB6F5E003D34A1 /* MPToolbarItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPToolbarItem.h; sourceTree = ""; }; 4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToolbarItem.m; sourceTree = ""; }; @@ -1602,6 +1604,7 @@ 4C59745018B3CE7200C8EBD1 /* KPKTestAutotype.m */, 4C3F25201A3B0C95007DD98B /* KPKTextXMLUtilities.m */, 4C4B6E3D1B5E56600082EEF2 /* KPKTestEntryLookup.m */, + 4C87751F1B70CA4B00069609 /* KPKTestUndo.m */, ); name = KeePassKit; sourceTree = ""; @@ -2534,6 +2537,7 @@ 4C19E503178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m in Sources */, 4C305F3C179A19F90082334F /* KPKIconLoading.m in Sources */, 4C1842B8179B348600E2F5BC /* KPKTestLegacyLoading.m in Sources */, + 4C8775201B70CA4B00069609 /* KPKTestUndo.m in Sources */, 4C6BC6601A36717E00BDDF3D /* MPDatabaseSearch.m in Sources */, 4CFC8743179DFD3E000DFC03 /* KPKTestXmlLoading.m in Sources */, 4C79E80617A9400500AC6CD2 /* KPKTestNSCoding.m in Sources */, diff --git a/MacPass/MPDatabaseSettingsWindowController.m b/MacPass/MPDatabaseSettingsWindowController.m index 27e7287d..b5fbc35d 100644 --- a/MacPass/MPDatabaseSettingsWindowController.m +++ b/MacPass/MPDatabaseSettingsWindowController.m @@ -253,12 +253,12 @@ - (void)_updateTrashFolders:(KPKTree *)tree { NSMenu *menu = [self _buildTrashTreeMenu:tree]; - [self.selectTrashGoupPopUpButton setMenu:menu]; + self.selectTrashGoupPopUpButton.menu = menu; } - (void)_updateTemplateGroup:(KPKTree *)tree { NSMenu *menu = [self _buildTemplateTreeMenu:tree]; - [self.templateGroupPopUpButton setMenu:menu]; + self.templateGroupPopUpButton.menu = menu; } - (NSMenu *)_buildTrashTreeMenu:(KPKTree *)tree { @@ -267,7 +267,7 @@ NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOCREATE_TRASH_FOLDER", @"Menu item for automatic trash creation") action:NULL keyEquivalent:@""]; - [selectItem setEnabled:YES]; + selectItem.enabled = YES; [menu insertItem:selectItem atIndex:0]; return menu; @@ -279,7 +279,7 @@ NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"NO_TEMPLATE_GROUP", @"Menu item to reset the template groups") action:NULL keyEquivalent:@""]; - [selectItem setEnabled:YES]; + selectItem.enabled = YES; [menu insertItem:selectItem atIndex:0]; return menu; @@ -288,7 +288,7 @@ - (NSMenu *)_buildTreeMenu:(KPKTree *)tree preselect:(NSUUID *)uuid { NSMenu *menu = [[NSMenu alloc] init]; - [menu setAutoenablesItems:NO]; + menu.autoenablesItems = NO; for(KPKGroup *group in tree.root.groups) { [self _insertMenuItemsForGroup:group atLevel:0 inMenu:menu preselect:uuid]; } @@ -297,14 +297,14 @@ - (void)_insertMenuItemsForGroup:(KPKGroup *)group atLevel:(NSUInteger)level inMenu:(NSMenu *)menu preselect:(NSUUID *)uuid{ NSMenuItem *groupItem = [[NSMenuItem alloc] init]; - [groupItem setImage:group.iconImage]; - [groupItem setTitle:group.name]; - [groupItem setRepresentedObject:group]; - [groupItem setEnabled:YES]; + groupItem.image = group.iconImage; + groupItem.title = group.title; + groupItem.representedObject = group; + groupItem.enabled = YES; if(uuid && [group.uuid isEqual:uuid]) { - [groupItem setState:NSOnState]; + groupItem.state = NSOnState; } - [groupItem setIndentationLevel:level]; + groupItem.indentationLevel = level; [menu addItem:groupItem]; for(KPKGroup *childGroup in group.groups) { [self _insertMenuItemsForGroup:childGroup atLevel:level + 1 inMenu:menu preselect:uuid]; diff --git a/MacPass/MPDocument.m b/MacPass/MPDocument.m index f8e49275..6e71521c 100644 --- a/MacPass/MPDocument.m +++ b/MacPass/MPDocument.m @@ -476,7 +476,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey return nil; // no new Groups in trash } KPKGroup *newGroup = [self.tree createGroup:parent]; - newGroup.name = NSLocalizedString(@"DEFAULT_GROUP_NAME", @"Title for a newly created group"); + newGroup.title = NSLocalizedString(@"DEFAULT_GROUP_NAME", @"Title for a newly created group"); newGroup.iconId = MPIconFolder; [parent addGroup:newGroup]; NSDictionary *userInfo = @{ MPDocumentGroupKey : newGroup }; @@ -615,7 +615,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey if(entryUUID) { KPKEntry *templateEntry = [self findEntry:entryUUID]; if(templateEntry && self.selectedGroup) { - KPKEntry *copy = [templateEntry copyWithTitle:templateEntry.title]; + KPKEntry *copy = [templateEntry copyWithTitle:templateEntry.title options:kKPKCopyOptionNone]; [self.selectedGroup addEntry:copy]; [self.selectedGroup.undoManager setActionName:NSLocalizedString(@"ADD_TREMPLATE_ENTRY", "")]; } @@ -623,7 +623,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey } - (void)duplicateEntry:(id)sender { - KPKEntry *duplicate = [self.selectedEntry copyWithTitle:nil]; + KPKEntry *duplicate = [self.selectedEntry copyWithTitle:nil options:kKPKCopyOptionNone]; [self.selectedEntry.parent addEntry:duplicate]; [self.undoManager setActionName:NSLocalizedString(@"DUPLICATE_ENTRY", "")]; } @@ -751,7 +751,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey KPKGroup *trash = [self.tree createGroup:self.tree.root]; BOOL wasEnabled = [self.undoManager isUndoRegistrationEnabled]; [self.undoManager disableUndoRegistration]; - trash.name = NSLocalizedString(@"TRASH", @"Name for the trash group"); + trash.title = NSLocalizedString(@"TRASH", @"Name for the trash group"); trash.iconId = MPIconTrash; [self.tree.root addGroup:trash]; if(wasEnabled) { diff --git a/MacPass/MPEntryViewController.m b/MacPass/MPEntryViewController.m index 70a3fc1d..5eedd39b 100644 --- a/MacPass/MPEntryViewController.m +++ b/MacPass/MPEntryViewController.m @@ -169,12 +169,12 @@ NSString *const _MPTableSecurCellView = @"PasswordCell"; self.entryTable.autosaveTableColumns = YES; - NSString *parentNameKeyPath = [[NSString alloc] initWithFormat:@"%@.%@", NSStringFromSelector(@selector(parent)), NSStringFromSelector(@selector(name))]; + NSString *parentTitleKeyPath = [[NSString alloc] initWithFormat:@"%@.%@", NSStringFromSelector(@selector(parent)), NSStringFromSelector(@selector(title))]; titleColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(title))ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; userNameColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(username)) ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; urlColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(url)) ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; - parentColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:parentNameKeyPath ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; + parentColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:parentTitleKeyPath ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; modifiedColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:[MPEntryViewController timeInfoModificationTimeKeyPath] ascending:YES selector:@selector(compare:)]; [parentColumn.headerCell setStringValue:NSLocalizedString(@"GROUP", "")]; @@ -276,15 +276,15 @@ NSString *const _MPTableSecurCellView = @"PasswordCell"; KPKEntry *entry = [self.entryArrayController arrangedObjects][row]; NSAssert(entry.parent != nil, @"Entry needs to have a parent"); - NSString *parentNameKeyPath = [NSString stringWithFormat:@"%@.%@.%@", + NSString *parentTitleKeyPath = [NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(objectValue)), NSStringFromSelector(@selector(parent)), - NSStringFromSelector(@selector(name))]; + NSStringFromSelector(@selector(title))]; NSString *parentIconImageKeyPath = [NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(objectValue)), NSStringFromSelector(@selector(parent)), NSStringFromSelector(@selector(iconImage))]; - [view.textField bind:NSValueBinding toObject:view withKeyPath:parentNameKeyPath options:nil]; + [view.textField bind:NSValueBinding toObject:view withKeyPath:parentTitleKeyPath options:nil]; [view.imageView bind:NSValueBinding toObject:view withKeyPath:parentIconImageKeyPath options:nil]; } } diff --git a/MacPass/MPGroupInspectorViewController.m b/MacPass/MPGroupInspectorViewController.m index f0509776..a4279353 100644 --- a/MacPass/MPGroupInspectorViewController.m +++ b/MacPass/MPGroupInspectorViewController.m @@ -103,7 +103,7 @@ - (void)_updateBindings { if(self.group) { - [self.titleTextField bind:NSValueBinding toObject:self.group withKeyPath:NSStringFromSelector(@selector(name)) options:nil]; + [self.titleTextField bind:NSValueBinding toObject:self.group withKeyPath:NSStringFromSelector(@selector(title)) options:nil]; [self.expiresCheckButton bind:NSValueBinding toObject:self.group.timeInfo withKeyPath:NSStringFromSelector(@selector(expires)) options:nil]; [self.expiresCheckButton bind:NSTitleBinding toObject:self.group.timeInfo withKeyPath:NSStringFromSelector(@selector(expirationDate)) options:@{ NSValueTransformerNameBindingOption:MPExpiryDateValueTransformer }]; [self.autotypePopupButton bind:NSSelectedTagBinding toObject:self.group withKeyPath:NSStringFromSelector(@selector(isAutoTypeEnabled)) options:nil]; diff --git a/MacPass/MPInspectorViewController.m b/MacPass/MPInspectorViewController.m index 434dcc4d..9f993ea3 100644 --- a/MacPass/MPInspectorViewController.m +++ b/MacPass/MPInspectorViewController.m @@ -285,12 +285,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) { [self.itemImageView bind:NSValueBinding toObject:item withKeyPath:NSStringFromSelector(@selector(iconImage)) options:nil]; [[self.notesTextView enclosingScrollView] setHidden:NO]; [self.notesTextView bind:NSValueBinding toObject:item withKeyPath:NSStringFromSelector(@selector(notes)) options:nil]; - if([item respondsToSelector:@selector(title)]) { - [self.itemNameTextField bind:NSValueBinding toObject:item withKeyPath:NSStringFromSelector(@selector(title)) options:nil]; - } - else if( [item respondsToSelector:@selector(name)]) { - [self.itemNameTextField bind:NSValueBinding toObject:item withKeyPath:NSStringFromSelector(@selector(name)) options:nil]; - } + [self.itemNameTextField bind:NSValueBinding toObject:item withKeyPath:NSStringFromSelector(@selector(title)) options:nil]; [self.itemImageView setHidden:NO]; [self.itemNameTextField setHidden:NO]; } diff --git a/MacPass/MPOutlineDataSource.m b/MacPass/MPOutlineDataSource.m index bf346619..5edd63f0 100644 --- a/MacPass/MPOutlineDataSource.m +++ b/MacPass/MPOutlineDataSource.m @@ -143,7 +143,7 @@ KPKGroup *targetGroup = (KPKGroup *)targetItem; if(draggedGroup) { if(copyItem || (nil == self.localDraggedGroup) ) { - draggedGroup = [draggedGroup copyWithName:nil]; + draggedGroup = [draggedGroup copyWithTitle:nil options:kKPKCopyOptionNone]; [targetGroup addGroup:draggedGroup atIndex:index]; [targetGroup.undoManager setActionName:NSLocalizedString(@"COPY_GROUP", "")]; return YES; @@ -159,7 +159,7 @@ } else if(draggedEntry) { if(copyItem || (nil == self.localDraggedEntry)) { - draggedEntry = [draggedEntry copyWithTitle:nil]; + draggedEntry = [draggedEntry copyWithTitle:nil options:kKPKCopyOptionNone]; [targetGroup addEntry:draggedEntry]; [targetGroup.undoManager setActionName:NSLocalizedString(@"COPY_ENTRY", "")]; return YES; diff --git a/MacPass/MPOutlineViewController.m b/MacPass/MPOutlineViewController.m index be4a2cc0..b2b98788 100644 --- a/MacPass/MPOutlineViewController.m +++ b/MacPass/MPOutlineViewController.m @@ -216,9 +216,9 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell"; view = [outlineView makeViewWithIdentifier:_MPOutlineViewDataViewIdentifier owner:self]; NSString *iconImageKeyPath = [NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(iconImage))]; - NSString *nameKeyPath = [NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(name))]; + NSString *titleKeyPath = [NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(title))]; [[view imageView] bind:NSValueBinding toObject:item withKeyPath:iconImageKeyPath options:nil]; - [[view textField] bind:NSValueBinding toObject:item withKeyPath:nameKeyPath options:nil]; + [[view textField] bind:NSValueBinding toObject:item withKeyPath:titleKeyPath options:nil]; NSString *entriesCountKeyPath = [[NSString alloc] initWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(entries)), @"@count"]; diff --git a/MacPassTests/KPKTestNSCoding.m b/MacPassTests/KPKTestNSCoding.m index 30e4a8b5..967d239f 100644 --- a/MacPassTests/KPKTestNSCoding.m +++ b/MacPassTests/KPKTestNSCoding.m @@ -102,7 +102,7 @@ - (void)testGroupCoding { KPKGroup *group = [[KPKGroup alloc] init]; - group.name = @"A Group"; + group.title = @"A Group"; group.iconId = 50; group.notes = @"Some notes"; KPKEntry *entry = [[KPKEntry alloc] init]; @@ -114,7 +114,7 @@ KPKGroup *decodedGroup = [self decode:data ofClass:[KPKGroup class]]; XCTAssertTrue([group.uuid isEqual:decodedGroup.uuid]); - XCTAssertTrue([group.name isEqualToString:decodedGroup.name]); + XCTAssertTrue([group.title isEqualToString:decodedGroup.title]); XCTAssertEqual([group.entries count], [decodedGroup.entries count]); XCTAssertEqual(group.iconId, decodedGroup.iconId); XCTAssertTrue([group.notes isEqualToString:decodedGroup.notes]); diff --git a/MacPassTests/KPKTestReference.m b/MacPassTests/KPKTestReference.m index d0bc0332..e938c293 100644 --- a/MacPassTests/KPKTestReference.m +++ b/MacPassTests/KPKTestReference.m @@ -28,7 +28,7 @@ self.tree = [[KPKTree alloc] init]; self.tree.root = [[KPKGroup alloc] init]; - self.tree.root.name = @"Root"; + self.tree.root.title = @"Root"; KPKEntry *entry1 = [self.tree createEntry:self.tree.root]; KPKEntry *entry2 = [self.tree createEntry:self.tree.root]; diff --git a/MacPassTests/KPKTestUndo.m b/MacPassTests/KPKTestUndo.m new file mode 100644 index 00000000..14a31312 --- /dev/null +++ b/MacPassTests/KPKTestUndo.m @@ -0,0 +1,100 @@ +// +// KPKUndo.m +// MacPass +// +// Created by Michael Starke on 04/08/15. +// Copyright (c) 2015 HicknHack Software GmbH. All rights reserved. +// + +#import +#import + +#import "KPKTree.h" +#import "KPKGroup.h" +#import "KPKEntry.h" + +@interface KPKTestUndo : XCTestCase { + NSUndoManager *_undoManager; + KPKTree *_tree; + KPKGroup *_groupA, *_groupB; + KPKEntry *_entryA, *_entryB; +} +@end + +@implementation KPKTestUndo + +- (NSUndoManager *)undoManagerForTree:(KPKTree *)tree { + return _undoManager; +} + +- (void)setUp { + [super setUp]; + _undoManager = [[NSUndoManager alloc] init]; + _tree = [[KPKTree alloc] init]; + _tree.delegate = self; + + _groupA = [[KPKGroup alloc] init]; + _groupB = [[KPKGroup alloc] init]; + _entryA = [[KPKEntry alloc] init]; + _entryB = [[KPKEntry alloc] init]; + + [_undoManager disableUndoRegistration]; + [_undoManager enableUndoRegistration]; +} + +- (void)tearDown { + _undoManager = nil; + [super tearDown]; +} + +- (void)testUndoRedoCreateEntry { + XCTFail(@"Missing Test"); +} + +- (void)testUndoRedoCreateGroup { + XCTFail(@"Missing Test"); +} + +- (void)testUndoRedoCopyEntry { + XCTFail(@"Missing Test"); +} + +- (void)testUndoRedoCopyGroup { + XCTFail(@"Missing Test"); +} + +- (void)testUndoRedoMoveEntry { + XCTFail(@"Missing Test"); +} + +- (void)testUndoRedoMoveGroup { + XCTFail(@"Missing Test"); +} + +- (void)testUndoRedoDeleteGroupWithoutTrash { + XCTFail(@"Missing Test"); +} + +- (void)testUndoRedoDeleteEntryWithoutTrash { + XCTFail(@"Missing Test"); +} + +- (void)testUndoRedoDeleteGroupWithTrash { + XCTFail(@"Missing Test"); +} + +- (void)testUndoRedoDeleteEntryWithTrash { + XCTFail(@"Missing Test"); +} + +- (void)testUndoRedoEditEntry { + XCTFail(@"Missing Test"); +} + +- (void)testUndoRedoEditGroup { + XCTFail(@"Missing Test"); +} + + + +@end