From 81dc24d9b26f016ef594ba3ebbe9412795612b87 Mon Sep 17 00:00:00 2001 From: michael starke Date: Mon, 24 Feb 2014 12:05:41 +0100 Subject: [PATCH] Broken commit - refactoring search --- MacPass.xcodeproj/project.pbxproj | 12 +-- MacPass/MPContextBarViewController.h | 5 +- MacPass/MPContextBarViewController.m | 101 +----------------- MacPass/MPDocumentSearchService.h | 40 +++++++ ...lterHelper.m => MPDocumentSearchService.m} | 61 +++++++---- MacPass/MPDocumentWindowController.h | 5 +- MacPass/MPDocumentWindowController.m | 5 +- MacPass/MPEntryFilterHelper.h | 27 ----- MacPass/MPEntryViewController.h | 1 + MacPass/MPEntryViewController.m | 8 +- MacPass/MPToolbarDelegate.h | 2 +- MacPass/MPToolbarDelegate.m | 16 ++- 12 files changed, 118 insertions(+), 165 deletions(-) create mode 100644 MacPass/MPDocumentSearchService.h rename MacPass/{MPEntryFilterHelper.m => MPDocumentSearchService.m} (56%) delete mode 100644 MacPass/MPEntryFilterHelper.h diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index a5343370..1c2beded 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -199,7 +199,7 @@ 4C8A173D1790AA41008B5C17 /* NSData+Keyfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8A173C1790AA41008B5C17 /* NSData+Keyfile.m */; }; 4C8B36AB17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8B36AA17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m */; }; 4C8FECC816D57E3200BF26CF /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C8FECC716D57E3200BF26CF /* QuartzCore.framework */; }; - 4C94DFCB1892860400F42F18 /* MPEntryFilterHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C94DFCA1892860400F42F18 /* MPEntryFilterHelper.m */; }; + 4C94DFCB1892860400F42F18 /* MPDocumentSearchService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C94DFCA1892860400F42F18 /* MPDocumentSearchService.m */; }; 4C96D15417A12E4F00D931FA /* 99_CreatedTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C96D15317A12E4F00D931FA /* 99_CreatedTemplate.pdf */; }; 4C9D6AA917615199001C660C /* HNHRoundedSecureTextFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C9D6AA817615199001C660C /* HNHRoundedSecureTextFieldCell.m */; }; 4CA08DA017A831B200A6544B /* MPAddEntryContextMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA08D9F17A831B200A6544B /* MPAddEntryContextMenuDelegate.m */; }; @@ -690,8 +690,8 @@ 4C8B36A917A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineContextMenuDelegate.h; sourceTree = ""; }; 4C8B36AA17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOutlineContextMenuDelegate.m; sourceTree = ""; }; 4C8FECC716D57E3200BF26CF /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 4C94DFC91892860400F42F18 /* MPEntryFilterHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPEntryFilterHelper.h; sourceTree = ""; }; - 4C94DFCA1892860400F42F18 /* MPEntryFilterHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPEntryFilterHelper.m; sourceTree = ""; }; + 4C94DFC91892860400F42F18 /* MPDocumentSearchService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDocumentSearchService.h; sourceTree = ""; }; + 4C94DFCA1892860400F42F18 /* MPDocumentSearchService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDocumentSearchService.m; sourceTree = ""; }; 4C96D15317A12E4F00D931FA /* 99_CreatedTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = 99_CreatedTemplate.pdf; path = Icons/99_CreatedTemplate.pdf; sourceTree = ""; }; 4C9D6AA717615199001C660C /* HNHRoundedSecureTextFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HNHRoundedSecureTextFieldCell.h; sourceTree = ""; }; 4C9D6AA817615199001C660C /* HNHRoundedSecureTextFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HNHRoundedSecureTextFieldCell.m; sourceTree = ""; }; @@ -1166,8 +1166,6 @@ 4C4B7EF717A4B335000234C7 /* MPUniqueCharactersFormatter.m */, 4C224B4017DFCB2300FF6AEE /* MPNumericalInputFormatter.h */, 4C224B4117DFCB2400FF6AEE /* MPNumericalInputFormatter.m */, - 4C94DFC91892860400F42F18 /* MPEntryFilterHelper.h */, - 4C94DFCA1892860400F42F18 /* MPEntryFilterHelper.m */, 4CB63A6018986530002DEC4C /* MPFlagsHelper.h */, ); name = Helper; @@ -1211,6 +1209,8 @@ 4C37A84215B8B495005EF8EE /* Model */ = { isa = PBXGroup; children = ( + 4C94DFC91892860400F42F18 /* MPDocumentSearchService.h */, + 4C94DFCA1892860400F42F18 /* MPDocumentSearchService.m */, 4C37A83E15B8B474005EF8EE /* MPOutlineDataSource.h */, 4C37A83F15B8B474005EF8EE /* MPOutlineDataSource.m */, 4C569D9F17652BFE00595B62 /* MPEntryTableDataSource.h */, @@ -2260,7 +2260,7 @@ 4CC6DB7A17D23719002C6091 /* KPKNode+IconImage.m in Sources */, 4CC6DB7D17D23DCE002C6091 /* KPKUTIs.m in Sources */, 4CEED1C617D7BD0E007180F1 /* NSError+Messages.m in Sources */, - 4C94DFCB1892860400F42F18 /* MPEntryFilterHelper.m in Sources */, + 4C94DFCB1892860400F42F18 /* MPDocumentSearchService.m in Sources */, 4C00E33817D8FA3500F37192 /* DDHotKeyCenter.m in Sources */, 4C224B4217DFCB2400FF6AEE /* MPNumericalInputFormatter.m in Sources */, ); diff --git a/MacPass/MPContextBarViewController.h b/MacPass/MPContextBarViewController.h index 9e4876b1..edb0cd72 100644 --- a/MacPass/MPContextBarViewController.h +++ b/MacPass/MPContextBarViewController.h @@ -7,7 +7,7 @@ // #import "MPViewController.h" -#import "MPEntryFilterHelper.h" +#import "MPDocumentSearchService.h" @protocol MPContextBarDelegate @@ -22,13 +22,10 @@ @interface MPContextBarViewController : MPViewController -@property (nonatomic, assign) MPFilterMode filterMode; @property (nonatomic, readonly) BOOL hasFilter; @property (nonatomic, weak) id delegate; @property (weak) NSView *nextKeyView; -- (NSString *)filterString; - - (IBAction)toggleFilterSpace:(id)sender; - (IBAction)exitFilter:(id)sender; diff --git a/MacPass/MPContextBarViewController.m b/MacPass/MPContextBarViewController.m index 548f8bfd..71c367a5 100644 --- a/MacPass/MPContextBarViewController.m +++ b/MacPass/MPContextBarViewController.m @@ -9,7 +9,7 @@ #import "MPContextBarViewController.h" #import "HNHGradientView.h" #import "KPKEntry.h" -#import "MPEntryFilterHelper.h" +#import "MPDocumentSearchService.h" #import "NSButton+HNHTextColor.h" @@ -34,10 +34,8 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { @property (nonatomic, assign) BOOL hasFilter; /* Filter */ -@property (weak) IBOutlet NSPopUpButton *filterTypePopupButton; @property (weak) IBOutlet NSButton *filterDoneButton; @property (weak) IBOutlet NSTextField *filterLabelTextField; -@property (weak) IBOutlet NSSearchField *filterSearchField; /* History */ @property (weak) IBOutlet HNHGradientView *historyBar; @property (weak) IBOutlet NSTextField *historyLabel; @@ -59,7 +57,6 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { _hasFilter = NO; - _filterMode = MPFilterTitles; _delegateRespondsToDidExitFilter = NO; _delegateRespondsToDidExitHistory = NO; _delegateRespondsToShouldEmptyTrash = NO; @@ -71,10 +68,6 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { - (void)didLoadView { [[self.filterLabelTextField cell] setBackgroundStyle:NSBackgroundStyleRaised]; - [self.filterTypePopupButton setMenu:[self _allocFilterMenu]]; - - [self.filterSearchField setAction:@selector(_didChangeFilter)]; - [[self.filterSearchField cell] setSendsSearchStringImmediately:NO]; self.historyBar.activeGradient = [[NSGradient alloc] initWithStartingColor:[NSColor redColor] endingColor:[NSColor greenColor]]; @@ -96,14 +89,13 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { [self.emptyTrashButton setNextKeyView:self.nextKeyView]; [self.filterDoneButton setNextKeyView:self.nextKeyView]; } - - [self _updateFilterMenu]; + [self _updateFilterButtons]; } #pragma mark Properties - (void)setFilterMode:(MPFilterMode)newFilterMode { if(_filterMode != newFilterMode) { - if(newFilterMode == MPFilterNone) { + if(newFilterMode == MPEntrySearchNone) { newFilterMode = MPFilterTitles; } _filterMode = newFilterMode; @@ -123,7 +115,6 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { } - (void)disable { - [self.filterSearchField setEnabled:NO]; } - (void)enable { @@ -145,22 +136,6 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { } } -#pragma mark Actions -- (void)toggleFilterSpace:(id)sender { - if(![sender isKindOfClass:[NSMenuItem class]]) { - return; // Wrong sender - } - MPFilterMode toggledMode = [sender tag]; - if(toggledMode & self.filterMode) { - /* Disable enabled flag */ - self.filterMode ^= toggledMode; - } - else { - /* Enable disabled flag */ - self.filterMode |= toggledMode; - } -} - - (void)exitFilter:(id)sender { if(!self.hasFilter) { return; // Nothing to do; @@ -231,74 +206,4 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { // only the entry view has to be bound, the rest not } -- (NSMenu *)_allocFilterMenu { - NSMenu *searchMenu = [[NSMenu alloc] init]; - - NSMenuItem *activeFilterItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_IN", "") action:NULL keyEquivalent:@""]; - [activeFilterItem setTag:MPContextBarViewControllerActiveFilterMenuItemTag]; - [searchMenu addItem:activeFilterItem]; - [searchMenu addItem:[NSMenuItem separatorItem]]; - - NSArray *titles = @[NSLocalizedString(@"TITLE", ""), - NSLocalizedString(@"PASSWORD", ""), - NSLocalizedString(@"URL", ""), - NSLocalizedString(@"USERNAME", "") - ]; - NSArray *tags = @[ @(MPFilterTitles), - @(MPFilterPasswords), - @(MPFilterUrls), - @(MPFilterUsernames) ]; - /* Attributes */ - for(NSUInteger index = 0; index < [tags count]; index++) { - NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:titles[index] action:@selector(toggleFilterSpace:) keyEquivalent:@""]; - [item setTag:[tags[index] integerValue]]; - [item setTarget:self]; - [searchMenu addItem:item]; - } - [searchMenu addItem:[NSMenuItem separatorItem]]; - /* Special Search */ - NSMenuItem *doublePasswordsItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"DUPLICTE_PASSWORDS", "") action:NULL keyEquivalent:@""]; - [doublePasswordsItem setTag:MPFilterDoublePasswords]; - - [searchMenu addItem:doublePasswordsItem]; - - return searchMenu; -} - -- (void)_updateFilterMenu { - NSMenu *menu = [self.filterTypePopupButton menu]; - NSArray *allItems = [menu itemArray]; - NSArray *enabledItems = [self _filterItemsForMode:self.filterMode]; - for(NSMenuItem *item in allItems) { - BOOL isSelected = [enabledItems containsObject:item]; - [item setState:(isSelected ? NSOnState : NSOffState)]; - } - NSMenuItem *activeFilterItem = [menu itemWithTag:MPContextBarViewControllerActiveFilterMenuItemTag]; - __block NSMutableString *activeFilterTitle; - [enabledItems enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - if(activeFilterTitle == nil) { - activeFilterTitle = [[NSMutableString alloc] initWithString:[obj title]]; - } - else { - [activeFilterTitle appendFormat:@", %@", [obj title]]; - } - }]; - [activeFilterItem setTitle:activeFilterTitle]; - [self.filterTypePopupButton selectItem:activeFilterItem]; -} - -- (NSArray *)_filterItemsForMode:(MPFilterMode)mode { - NSArray *options = [MPEntryFilterHelper optionsEnabledInMode:mode]; - NSMenu *menu = [self.filterTypePopupButton menu]; - NSMutableArray *menuItems = [[NSMutableArray alloc] initWithCapacity:[[menu itemArray] count]]; - for(NSNumber *number in options) { - MPFilterMode flag = [number integerValue]; - NSMenuItem *flagItem = [menu itemWithTag:flag]; - if(flagItem) { - [menuItems addObject:flagItem]; - } - } - return menuItems; -} - @end diff --git a/MacPass/MPDocumentSearchService.h b/MacPass/MPDocumentSearchService.h new file mode 100644 index 00000000..e7e6f04e --- /dev/null +++ b/MacPass/MPDocumentSearchService.h @@ -0,0 +1,40 @@ +// +// MPSearchHelper.h +// MacPass +// +// Created by Michael Starke on 24/01/14. +// Copyright (c) 2014 HicknHack Software GmbH. All rights reserved. +// + +#import + +@class MPDocument; + +FOUNDATION_EXTERN NSString *const MPSearchServiceSearchDidChangeNotification; +FOUNDATION_EXTERN NSString *const MPSearchServiceSearchWasClearedNotification; + +typedef NS_OPTIONS(NSUInteger, MPEntrySearchFlags) { + MPEntrySearchNone = 0, + MPEntrySearchUrls = (1<<0), + MPEntrySearchUsernames = (1<<1), + MPEntrySearchTitles = (1<<2), + MPEntrySearchPasswords = (1<<3), + MPEntrySearchNotes = (1<<4), + MPEntrySearchDoublePasswords = (1<<5) +}; + +@interface MPDocumentSearchService : NSObject + +@property (nonatomic, assign) MPEntrySearchFlags activeFlags; +@property (nonatomic, copy) NSString *searchString; + ++ (instancetype)sharedService; +- (NSArray *)entriesInDocument:(MPDocument *)document matching:(NSString *)string usingSearchMode:(MPEntrySearchFlags)mode; +- (NSArray *)optionsEnabledInMode:(MPEntrySearchFlags)mode; + +/* Clears the search string, but doesn't exit searching */ +- (IBAction)clearSearch:(id)sender; +/* exits searching mode */ +- (IBAction)exitSearch:(id)sender; + +@end diff --git a/MacPass/MPEntryFilterHelper.m b/MacPass/MPDocumentSearchService.m similarity index 56% rename from MacPass/MPEntryFilterHelper.m rename to MacPass/MPDocumentSearchService.m index aa82bc9f..d1c3c441 100644 --- a/MacPass/MPEntryFilterHelper.m +++ b/MacPass/MPDocumentSearchService.m @@ -6,17 +6,36 @@ // Copyright (c) 2014 HicknHack Software GmbH. All rights reserved. // -#import "MPEntryFilterHelper.h" +#import "MPDocumentSearchService.h" #import "MPDocument.h" #import "KPKGroup.h" #import "KPKEntry.h" #import "MPFlagsHelper.h" -@implementation MPEntryFilterHelper +@implementation MPDocumentSearchService -+ (NSArray *)entriesInDocument:(MPDocument *)document matching:(NSString *)filter usingFilterMode:(MPFilterMode)mode { +static MPDocumentSearchService *_kMPSearchServiceInstance; + ++ (instancetype)sharedService { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _kMPSearchServiceInstance = [[MPDocumentSearchService alloc] init]; + }); + return _kMPSearchServiceInstance; +} + +- (instancetype)init { + NSAssert(_kMPSearchServiceInstance == nil, @"only one shared instance allowed"); + self = [super init]; + if(self) { + _activeFlags = MPEntrySearchTitles; // Default search is set to titles + } + return self; +} + +- (NSArray *)entriesInDocument:(MPDocument *)document matching:(NSString *)string usingSearchMode:(MPEntrySearchFlags)mode { /* Filter double passwords */ - if(MPTestFlagInOptions(MPFilterDoublePasswords, mode)) { + if(MPTestFlagInOptions(MPEntrySearchDoublePasswords, mode)) { __block NSMutableDictionary *passwordToEntryMap; /* Build up a usage map */ [[document.root childEntries] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { @@ -41,7 +60,7 @@ return doublePasswords; } /* Filter using predicates */ - NSArray *predicates = [self _filterPredicatesForMode:mode withFilter:filter]; + NSArray *predicates = [self _filterPredicatesForMode:mode withString:string]; if(predicates) { NSPredicate *fullFilter = [NSCompoundPredicate orPredicateWithSubpredicates:predicates]; return [[document.root childEntries] filteredArrayUsingPredicate:fullFilter]; @@ -50,35 +69,35 @@ return [document.root childEntries]; } -+ (NSArray *)optionsEnabledInMode:(MPFilterMode)mode { - NSArray *allOptions = @[ @(MPFilterUrls), @(MPFilterUsernames), - @(MPFilterTitles), @(MPFilterPasswords) , - @(MPFilterNotes), @(MPFilterDoublePasswords) ]; +- (NSArray *)optionsEnabledInMode:(MPEntrySearchFlags)mode { + NSArray *allOptions = @[ @(MPEntrySearchUrls), @(MPEntrySearchUsernames), + @(MPEntrySearchTitles), @(MPEntrySearchPasswords) , + @(MPEntrySearchNotes), @(MPEntrySearchDoublePasswords) ]; NSIndexSet *indexes = [allOptions indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { - MPFilterMode flag = [obj integerValue]; + MPEntrySearchFlags flag = [obj integerValue]; return MPTestFlagInOptions(flag, mode); }]; return [allOptions objectsAtIndexes:indexes]; } -+ (NSArray *)_filterPredicatesForMode:(MPFilterMode)mode withFilter:(NSString *)filter{ +- (NSArray *)_filterPredicatesForMode:(MPEntrySearchFlags)mode withString:(NSString *)string{ NSMutableArray *prediactes = [[NSMutableArray alloc] initWithCapacity:4]; - if(MPTestFlagInOptions(MPFilterTitles, mode)) { - [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.title CONTAINS[cd] %@", filter]]; + if(MPTestFlagInOptions(MPEntrySearchTitles, mode)) { + [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.title CONTAINS[cd] %@", string]]; } - if(MPTestFlagInOptions(MPFilterUsernames, mode)) { - [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.username CONTAINS[cd] %@", filter]]; + if(MPTestFlagInOptions(MPEntrySearchUsernames, mode)) { + [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.username CONTAINS[cd] %@", string]]; } - if(MPTestFlagInOptions(MPFilterUrls, mode)) { - [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.url CONTAINS[cd] %@", filter]]; + if(MPTestFlagInOptions(MPEntrySearchUrls, mode)) { + [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.url CONTAINS[cd] %@", string]]; } - if(MPTestFlagInOptions(MPFilterPasswords, mode)) { - [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.password CONTAINS[cd] %@", filter]]; + if(MPTestFlagInOptions(MPEntrySearchPasswords, mode)) { + [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.password CONTAINS[cd] %@", string]]; } - if(MPTestFlagInOptions(MPFilterNotes, mode)) { - [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.notes CONTAINS[cd] %@", filter]]; + if(MPTestFlagInOptions(MPEntrySearchNotes, mode)) { + [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.notes CONTAINS[cd] %@", string]]; } return prediactes; } diff --git a/MacPass/MPDocumentWindowController.h b/MacPass/MPDocumentWindowController.h index 247d95a5..fb2f863d 100644 --- a/MacPass/MPDocumentWindowController.h +++ b/MacPass/MPDocumentWindowController.h @@ -14,6 +14,7 @@ @class MPInspectorViewController; @class MPPasswordInputController; @class MPOutlineViewController; +@class MPToolbarDelegate; @interface MPDocumentWindowController : NSWindowController @@ -21,10 +22,12 @@ @property (readonly, strong) MPEntryViewController *entryViewController; @property (readonly, strong) MPOutlineViewController *outlineViewController; @property (readonly, strong) MPInspectorViewController *inspectorViewController; +@property (readonly, strong) MPToolbarDelegate *toolbarDelegate; - (void)showEntries; - (void)showPasswordInput; -- (void)performFindPanelAction:(id)sender; +- (IBAction)performFindPanelAction:(id)sender; +- (IBAction)cancelSearch:(id)sender; - (IBAction)saveDocument:(id)sender; diff --git a/MacPass/MPDocumentWindowController.m b/MacPass/MPDocumentWindowController.m index e0068034..71b2fa38 100644 --- a/MacPass/MPDocumentWindowController.m +++ b/MacPass/MPDocumentWindowController.m @@ -46,7 +46,6 @@ typedef NS_ENUM(NSUInteger, MPAlertContext) { @property (strong) MPDatabaseSettingsWindowController *documentSettingsWindowController; @property (strong) MPDocumentWindowDelegate *documentWindowDelegate; @property (strong) MPPasswordEditWindowController *passwordEditWindowController; - @property (strong) MPToolbarDelegate *toolbarDelegate; @end @@ -222,6 +221,10 @@ typedef NS_ENUM(NSUInteger, MPAlertContext) { [self.entryViewController showFilter:sender]; } +- (void)cancelSearch:(id)sender { + [self.entryViewController clearFilter:sender]; +} + - (void)showPasswordInput { if(!self.passwordInputController) { self.passwordInputController = [[MPPasswordInputController alloc] init]; diff --git a/MacPass/MPEntryFilterHelper.h b/MacPass/MPEntryFilterHelper.h deleted file mode 100644 index 3d9a700a..00000000 --- a/MacPass/MPEntryFilterHelper.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// MPSearchHelper.h -// MacPass -// -// Created by Michael Starke on 24/01/14. -// Copyright (c) 2014 HicknHack Software GmbH. All rights reserved. -// - -#import - -@class MPDocument; - -typedef NS_OPTIONS(NSUInteger, MPFilterMode) { - MPFilterNone = 0, - MPFilterUrls = (1<<0), - MPFilterUsernames = (1<<1), - MPFilterTitles = (1<<2), - MPFilterPasswords = (1<<3), - MPFilterNotes = (1<<4), - MPFilterDoublePasswords = (1<<5) -}; - -@interface MPEntryFilterHelper : NSObject - -+ (NSArray *)entriesInDocument:(MPDocument *)document matching:(NSString *)filter usingFilterMode:(MPFilterMode)mode; -+ (NSArray *)optionsEnabledInMode:(MPFilterMode)mode; -@end diff --git a/MacPass/MPEntryViewController.h b/MacPass/MPEntryViewController.h index 064e72d3..ed65baff 100644 --- a/MacPass/MPEntryViewController.h +++ b/MacPass/MPEntryViewController.h @@ -37,6 +37,7 @@ typedef NS_ENUM( NSUInteger, MPCopyContentTypeTag) { /* Clear the Search filter*/ - (void)showFilter:(id)sender; +- (void)clearFilter:(id)sender; /* Copy/Paste */ - (void)copyUsername:(id)sender; diff --git a/MacPass/MPEntryViewController.m b/MacPass/MPEntryViewController.m index 9eced8e6..4a89dff8 100644 --- a/MacPass/MPEntryViewController.m +++ b/MacPass/MPEntryViewController.m @@ -15,7 +15,7 @@ #import "MPPasteBoardController.h" #import "MPOverlayWindowController.h" #import "MPContextBarViewController.h" -#import "MPEntryFilterHelper.h" +#import "MPDocumentSearchService.h" #import "MPContextMenuHelper.h" #import "MPActionHelper.h" @@ -335,7 +335,7 @@ NSString *const _MPTAbleSecurCellView = @"PasswordCell"; dispatch_async(backgroundQueue, ^{ MPDocument *document = [[self windowController] document]; - self.filteredEntries = [MPEntryFilterHelper entriesInDocument:document + self.filteredEntries = [MPDocumentSearchService entriesInDocument:document matching:self.contextBarViewController.filterString usingFilterMode:self.contextBarViewController.filterMode]; @@ -353,6 +353,10 @@ NSString *const _MPTAbleSecurCellView = @"PasswordCell"; [self _showContextBar]; } +- (void)clearFilter:(id)sender { + [self.contextBarViewController exitFilter:sender]; +} + #pragma mark ContextBar - (void)_showTrashBar { [self.contextBarViewController showTrash]; diff --git a/MacPass/MPToolbarDelegate.h b/MacPass/MPToolbarDelegate.h index dd106ff7..c68ade84 100644 --- a/MacPass/MPToolbarDelegate.h +++ b/MacPass/MPToolbarDelegate.h @@ -26,6 +26,6 @@ @interface MPToolbarDelegate : NSObject -@property (weak) NSToolbarItem *searchItem; +@property (weak, readonly) NSSearchField *searchField; @end diff --git a/MacPass/MPToolbarDelegate.m b/MacPass/MPToolbarDelegate.m index a6364b1d..2d1ad315 100644 --- a/MacPass/MPToolbarDelegate.m +++ b/MacPass/MPToolbarDelegate.m @@ -21,15 +21,18 @@ // #import "MPToolbarDelegate.h" -#import "MPIconHelper.h" -#import "MPAppDelegate.h" + #import "MPToolbarButton.h" #import "MPToolbarItem.h" -#import "MPActionHelper.h" -#import "MPContextMenuHelper.h" #import "MPContextToolbarButton.h" #import "MPAddEntryContextMenuDelegate.h" +#import "MPActionHelper.h" +#import "MPContextMenuHelper.h" +#import "MPIconHelper.h" + +#import "MPDocumentWindowController.h" + NSString *const MPToolbarItemLock = @"TOOLBAR_LOCK"; NSString *const MPToolbarItemAddGroup = @"TOOLBAR_ADD_GROUP"; NSString *const MPToolbarItemAddEntry = @"TOOLBAR_ADD_ENTRY"; @@ -45,6 +48,7 @@ NSString *const MPToolbarItemSearch = @"TOOLBAR_SEARCH"; @property (strong) NSMutableDictionary *toolbarItems; @property (strong) NSArray *toolbarIdentifiers; @property (strong) NSDictionary *toolbarImages; +@property (weak) NSSearchField *searchField; - (NSString *)_localizedLabelForToolbarItemIdentifier:(NSString *)identifier; - (SEL)_actionForToolbarItemIdentifier:(NSString *)identifier; @@ -130,6 +134,10 @@ NSString *const MPToolbarItemSearch = @"TOOLBAR_SEARCH"; else if( [itemIdentifier isEqualToString:MPToolbarItemSearch]){ NSSearchField *searchField = [[NSSearchField alloc] init]; [searchField setAction:@selector(performFindPanelAction:)]; + NSSearchFieldCell *cell = [searchField cell]; + [[cell cancelButtonCell] setAction:@selector(cancelSearch:)]; + [[cell cancelButtonCell] setTarget:nil]; + self.searchField = searchField; [item setView:searchField]; } else {