diff --git a/Frameworks/OakFilterList/src/OakAbbreviations.h b/Frameworks/OakFilterList/src/OakAbbreviations.h index 3a3408a6..1f5955e5 100644 --- a/Frameworks/OakFilterList/src/OakAbbreviations.h +++ b/Frameworks/OakFilterList/src/OakAbbreviations.h @@ -1,9 +1,4 @@ @interface OakAbbreviations : NSObject -{ -@private - NSString* name; - NSMutableArray* bindings; -} + (OakAbbreviations*)abbreviationsForName:(NSString*)aName; - (NSArray*)stringsForAbbreviation:(NSString*)anAbbreviation; diff --git a/Frameworks/OakFilterList/src/OakAbbreviations.mm b/Frameworks/OakFilterList/src/OakAbbreviations.mm index 72869de5..2b150df9 100644 --- a/Frameworks/OakFilterList/src/OakAbbreviations.mm +++ b/Frameworks/OakFilterList/src/OakAbbreviations.mm @@ -8,6 +8,8 @@ static NSString* const FCAbbreviationKey = @"short"; static NSString* const FCExpandedStringKey = @"long"; @interface OakAbbreviations () +@property (nonatomic, copy) NSString* name; +@property (nonatomic, retain) NSMutableArray* bindings; - (id)initWithName:(NSString*)aName; @end @@ -15,18 +17,18 @@ static NSString* const FCExpandedStringKey = @"long"; + (OakAbbreviations*)abbreviationsForName:(NSString*)aName { static NSMutableDictionary* SharedInstances = [NSMutableDictionary new]; - if(![SharedInstances objectForKey:aName]) - [SharedInstances setObject:[[[self alloc] initWithName:aName] autorelease] forKey:aName]; - return [SharedInstances objectForKey:aName]; + if(!SharedInstances[aName]) + SharedInstances[aName] = [[self alloc] initWithName:aName]; + return SharedInstances[aName]; } - (id)initWithName:(NSString*)aName { if(self = [self init]) { - name = [aName copy]; - bindings = [[[NSUserDefaults standardUserDefaults] arrayForKey:name] mutableCopy] ?: [NSMutableArray new]; - D(DBF_FilterList_Abbreviations, bug("%s\n", [[bindings description] UTF8String]);); + self.name = aName; + self.bindings = [[[NSUserDefaults standardUserDefaults] arrayForKey:self.name] mutableCopy] ?: [NSMutableArray new]; + D(DBF_FilterList_Abbreviations, bug("%s\n", [[self.bindings description] UTF8String]);); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:NSApplicationWillTerminateNotification object:NSApp]; } return self; @@ -36,17 +38,14 @@ static NSString* const FCExpandedStringKey = @"long"; { [self applicationWillTerminate:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationWillTerminateNotification object:NSApp]; - [bindings release]; - [name release]; - [super dealloc]; } - (void)applicationWillTerminate:(NSNotification*)aNotification { - D(DBF_FilterList_Abbreviations, bug("%s\n", [[bindings description] UTF8String]);); - if([bindings count] > 50) - [bindings setArray:[bindings subarrayWithRange:NSMakeRange(0, 50)]]; - [[NSUserDefaults standardUserDefaults] setObject:bindings forKey:name]; + D(DBF_FilterList_Abbreviations, bug("%s\n", [[self.bindings description] UTF8String]);); + if([self.bindings count] > 50) + [self.bindings setArray:[self.bindings subarrayWithRange:NSMakeRange(0, 50)]]; + [[NSUserDefaults standardUserDefaults] setObject:self.bindings forKey:self.name]; } - (NSArray*)stringsForAbbreviation:(NSString*)anAbbreviation @@ -57,10 +56,10 @@ static NSString* const FCExpandedStringKey = @"long"; if(NSIsEmptyString(anAbbreviation)) return exactMatches; - for(NSDictionary* binding in bindings) + for(NSDictionary* binding in self.bindings) { - NSString* abbr = [binding objectForKey:FCAbbreviationKey]; - NSString* path = [binding objectForKey:FCExpandedStringKey]; + NSString* abbr = binding[FCAbbreviationKey]; + NSString* path = binding[FCExpandedStringKey]; if([abbr isEqualToString:anAbbreviation]) [exactMatches addObject:path]; @@ -80,12 +79,8 @@ static NSString* const FCExpandedStringKey = @"long"; if(NSIsEmptyString(anAbbreviation) || NSIsEmptyString(aString)) return; - NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: - anAbbreviation, FCAbbreviationKey, - aString, FCExpandedStringKey, - nil]; - - [bindings removeObject:dict]; - [bindings insertObject:dict atIndex:0]; + NSDictionary* dict = @{ FCAbbreviationKey : anAbbreviation, FCExpandedStringKey : aString }; + [self.bindings removeObject:dict]; + [self.bindings insertObject:dict atIndex:0]; } @end diff --git a/Frameworks/OakFilterList/src/OakFilterList.h b/Frameworks/OakFilterList/src/OakFilterList.h index f01e6fca..897f469b 100644 --- a/Frameworks/OakFilterList/src/OakFilterList.h +++ b/Frameworks/OakFilterList/src/OakFilterList.h @@ -7,11 +7,6 @@ PUBLIC @interface OakFilterWindowController : NSWindowController OBJC_WATCH_LEAKS(OakFilterWindowController); IBOutlet OakFilterListView* filterView; IBOutlet NSView* filterControlsView; - SEL action; - SEL accessoryAction; - id target; - BOOL sendActionOnSingleClick; - BOOL retainedSelf; } + (id)filterWindow; - (void)showWindowRelativeToWindow:(NSWindow*)parentWindow; diff --git a/Frameworks/OakFilterList/src/OakFilterList.mm b/Frameworks/OakFilterList/src/OakFilterList.mm index 65337bdd..47e68fe5 100644 --- a/Frameworks/OakFilterList/src/OakFilterList.mm +++ b/Frameworks/OakFilterList/src/OakFilterList.mm @@ -7,20 +7,13 @@ - (IBAction)accept:(id)sender; - (IBAction)cancel:(id)sender; @property (nonatomic, retain) NSView* filterControls; +@property (nonatomic, retain) OakFilterWindowController* retainedSelf; @end @implementation OakFilterWindowController -@synthesize target, action, accessoryAction, sendActionOnSingleClick; - + (id)filterWindow { - return [[[self alloc] initWithWindowNibName:@"FilterWindow"] autorelease]; -} - -- (void)dealloc -{ - self.dataSource = nil; - [super dealloc]; + return [[self alloc] initWithWindowNibName:@"FilterWindow"]; } - (void)windowDidLoad @@ -29,11 +22,7 @@ filterView.action = @selector(singleClick:); filterView.doubleAction = @selector(accept:); - if(!retainedSelf) - { - [self retain]; - retainedSelf = YES; - } + self.retainedSelf = self; } - (void)showWindowRelativeToWindow:(NSWindow*)parentWindow @@ -93,7 +82,7 @@ NSWindow* window = [self window]; // loads filterView from nib filterView.filterDataSource = dataSource; - self.accessoryAction = self.accessoryAction; // trigger accessory button creation if necessary + self.accessoryAction = _accessoryAction; // trigger accessory button creation if necessary if(dataSource) [window setFrameAutosaveName:[NSString stringWithFormat:@"Filter Window %@ Saved Frame", [dataSource className]]]; @@ -115,8 +104,8 @@ - (void)setSendActionOnSingleClick:(BOOL)newSendActionOnSingleClick { - sendActionOnSingleClick = newSendActionOnSingleClick; - [(NSPanel*)self.window setBecomesKeyOnlyIfNeeded:sendActionOnSingleClick]; + _sendActionOnSingleClick = newSendActionOnSingleClick; + [(NSPanel*)self.window setBecomesKeyOnlyIfNeeded:_sendActionOnSingleClick]; } - (BOOL)allowsMultipleSelection @@ -136,21 +125,20 @@ - (void)setTarget:(id)newTarget { - if(newTarget != target) + if(_target != newTarget) { - [target release]; - target = [newTarget retain]; - self.accessoryAction = self.accessoryAction; // update accessory button target + _target = newTarget; + self.accessoryAction = _accessoryAction; // update accessory button target } } - (void)setAccessoryAction:(SEL)selector { - accessoryAction = selector; - if(accessoryAction && [filterView.filterDataSource respondsToSelector:@selector(accessoryButton)]) + _accessoryAction = selector; + if(_accessoryAction && [filterView.filterDataSource respondsToSelector:@selector(accessoryButton)]) { NSButtonCell* button = [filterView.filterDataSource accessoryButton]; - [button setAction:accessoryAction]; + [button setAction:_accessoryAction]; [button setTarget:self.target]; filterView.accessoryButton = button; } @@ -206,7 +194,7 @@ { static std::set const forward = { @selector(moveUp:), @selector(moveDown:), @selector(moveUpAndModifySelection:), @selector(moveDownAndModifySelection:), @selector(pageUp:), @selector(pageDown:), @selector(movePageUp:), @selector(movePageDown:), @selector(scrollPageUp:), @selector(scrollPageDown:), @selector(moveToBeginningOfDocument:), @selector(moveToEndOfDocument:), @selector(insertNewline:), @selector(insertNewlineIgnoringFieldEditor:), @selector(cancelOperation:) }; if(forward.find(aCommand) != forward.end() && [self respondsToSelector:aCommand]) - return [self performSelector:aCommand withObject:aControl], YES; + return [NSApp sendAction:aCommand to:self from:aControl]; return NO; } @@ -216,11 +204,9 @@ - (void)windowWillClose:(NSNotification*)aNotification { - if(retainedSelf) - { - retainedSelf = NO; - [self autorelease]; - } + filterView.target = nil; + filterView.accessoryButton.target = nil; + self.retainedSelf = nil; } - (IBAction)cancel:(id)sender @@ -259,7 +245,7 @@ - (IBAction)singleClick:(id)sender { - if(!sendActionOnSingleClick) + if(!_sendActionOnSingleClick) return; if([[[filterView.tableColumns objectAtIndex:filterView.clickedColumn] identifier] isEqualToString:@"accessoryColumn"]) diff --git a/Frameworks/OakFilterList/src/OakFilterListView.h b/Frameworks/OakFilterList/src/OakFilterListView.h index 482a30dc..5eccdc82 100644 --- a/Frameworks/OakFilterList/src/OakFilterListView.h +++ b/Frameworks/OakFilterList/src/OakFilterListView.h @@ -2,14 +2,6 @@ #import @interface OakFilterListView : NSTableView -{ - OBJC_WATCH_LEAKS(OakFilterListView) - NSArray* items; - NSAttributedString* infoString; - id filterDataSource; - BOOL isWaitingForItems; - NSUInteger sourceIndex; -} @property (nonatomic, retain) id filterDataSource; @property (nonatomic, retain, readonly) NSAttributedString* infoString; @property (nonatomic, readonly) NSArray* selectedItems; diff --git a/Frameworks/OakFilterList/src/OakFilterListView.mm b/Frameworks/OakFilterList/src/OakFilterListView.mm index f442d1eb..d6f27aa9 100644 --- a/Frameworks/OakFilterList/src/OakFilterListView.mm +++ b/Frameworks/OakFilterList/src/OakFilterListView.mm @@ -23,12 +23,6 @@ NSString* const FLDataSourceItemsShouldAscendNotification = @"FLDataSourceItems @end @implementation OakFilterListView -@synthesize filterDataSource, isWaitingForItems, items, infoString, sourceIndex; - -// ================== -// = Setup/Teardown = -// ================== - - (void)setup { self.dataSource = self; @@ -54,15 +48,12 @@ NSString* const FLDataSourceItemsShouldAscendNotification = @"FLDataSourceItems - (void)dealloc { - self.filterDataSource = nil; - self.items = nil; [[NSNotificationCenter defaultCenter] removeObserver:self]; - [super dealloc]; } - (void)awakeFromNib { - self.infoString = [[[NSAttributedString alloc] initWithString:@""] autorelease]; + self.infoString = [[NSAttributedString alloc] initWithString:@""]; } - (void)viewFrameDidChange:(NSNotification*)notification @@ -76,31 +67,32 @@ NSString* const FLDataSourceItemsShouldAscendNotification = @"FLDataSourceItems - (void)setFilterDataSource:(id )aDataSource { - if(aDataSource != filterDataSource) + if(aDataSource != _filterDataSource) { - if(filterDataSource) + if(_filterDataSource) { - if([filterDataSource respondsToSelector:@selector(stopLoading)]) - [filterDataSource stopLoading]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:FLDataSourceItemsDidChangeNotification object:filterDataSource]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:FLDataSourceItemsShouldDescendNotification object:filterDataSource]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:FLDataSourceItemsShouldAscendNotification object:filterDataSource]; - [filterDataSource autorelease]; + if([_filterDataSource respondsToSelector:@selector(stopLoading)]) + [_filterDataSource stopLoading]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:FLDataSourceItemsDidChangeNotification object:_filterDataSource]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:FLDataSourceItemsShouldDescendNotification object:_filterDataSource]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:FLDataSourceItemsShouldAscendNotification object:_filterDataSource]; + } - if(filterDataSource = [aDataSource retain]) + + if(_filterDataSource = aDataSource) { - ASSERT([filterDataSource conformsToProtocol:@protocol(FilterListDataSource)]); - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataSourceHasMoreData:) name:FLDataSourceItemsDidChangeNotification object:filterDataSource]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataSourceShouldDescend:) name:FLDataSourceItemsShouldDescendNotification object:filterDataSource]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataSourceShouldAscend:) name:FLDataSourceItemsShouldAscendNotification object:filterDataSource]; + ASSERT([_filterDataSource conformsToProtocol:@protocol(FilterListDataSource)]); + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataSourceHasMoreData:) name:FLDataSourceItemsDidChangeNotification object:_filterDataSource]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataSourceShouldDescend:) name:FLDataSourceItemsShouldDescendNotification object:_filterDataSource]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataSourceShouldAscend:) name:FLDataSourceItemsShouldAscendNotification object:_filterDataSource]; NSTextFieldCell* dataCell = nil; - if([filterDataSource respondsToSelector:@selector(itemDataCell)]) - dataCell = [filterDataSource itemDataCell]; + if([_filterDataSource respondsToSelector:@selector(itemDataCell)]) + dataCell = [_filterDataSource itemDataCell]; if(!dataCell) - dataCell = [[[NSTextFieldCell alloc] initTextCell:@""] autorelease]; + dataCell = [[NSTextFieldCell alloc] initTextCell:@""]; [[self.tableColumns objectAtIndex:0] setDataCell:dataCell]; - self.allowsMultipleSelection = [filterDataSource respondsToSelector:@selector(allowsMultipleSelection)] && [filterDataSource allowsMultipleSelection]; + self.allowsMultipleSelection = [_filterDataSource respondsToSelector:@selector(allowsMultipleSelection)] && [_filterDataSource allowsMultipleSelection]; } [self reloadData]; } @@ -130,12 +122,12 @@ NSString* const FLDataSourceItemsShouldAscendNotification = @"FLDataSourceItems - (void)dataSourceShouldDescend:(NSNotification*)aNotification { - [filterDataSource descendIntoItem:[self.selectedItems lastObject]]; + [_filterDataSource descendIntoItem:[self.selectedItems lastObject]]; } - (void)dataSourceShouldAscend:(NSNotification*)aNotification { - [filterDataSource descendIntoItem:nil]; + [_filterDataSource descendIntoItem:nil]; } - (void)dataSourceHasMoreData:(NSNotification*)notification @@ -146,15 +138,18 @@ NSString* const FLDataSourceItemsShouldAscendNotification = @"FLDataSourceItems - (void)reloadData { NSArray* selectedItems = nil; - if([filterDataSource respondsToSelector:@selector(preservesSelectionWhenFiltering)] && [filterDataSource preservesSelectionWhenFiltering]) + if([_filterDataSource respondsToSelector:@selector(preservesSelectionWhenFiltering)] && [_filterDataSource preservesSelectionWhenFiltering]) selectedItems = [self.items objectsAtIndexes:self.selectedRowIndexes]; - self.items = [filterDataSource items]; - if(![filterDataSource respondsToSelector:@selector(infoStringForItem:)]) + self.items = [_filterDataSource items]; + if(![_filterDataSource respondsToSelector:@selector(infoStringForItem:)]) { - NSMutableParagraphStyle* style = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease]; + NSMutableParagraphStyle* style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [style setAlignment:NSCenterTextAlignment]; - NSAttributedString* text = [[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%lu items", self.items.count] - attributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSColor darkGrayColor], NSForegroundColorAttributeName, [NSFont controlContentFontOfSize:11], NSFontAttributeName, style, NSParagraphStyleAttributeName, nil]] autorelease]; + NSAttributedString* text = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%lu items", self.items.count] attributes:@{ + NSForegroundColorAttributeName : [NSColor darkGrayColor], + NSFontAttributeName : [NSFont controlContentFontOfSize:11], + NSParagraphStyleAttributeName : style + }]; self.infoString = text; } [super reloadData]; @@ -173,7 +168,7 @@ NSString* const FLDataSourceItemsShouldAscendNotification = @"FLDataSourceItems [self selectRowIndexes:indexesToSelect byExtendingSelection:NO]; [self scrollRowToVisible:indexesToSelect.firstIndex]; [self tableViewSelectionDidChange:nil]; - self.isWaitingForItems = [filterDataSource respondsToSelector:@selector(moreItemsToCome)] && [filterDataSource moreItemsToCome]; + self.isWaitingForItems = [_filterDataSource respondsToSelector:@selector(moreItemsToCome)] && [_filterDataSource moreItemsToCome]; } // ====================== @@ -182,55 +177,61 @@ NSString* const FLDataSourceItemsShouldAscendNotification = @"FLDataSourceItems - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { - return [items count]; + return [_items count]; } - (id)tableView:(NSTableView*)tableView objectValueForTableColumn:(NSTableColumn*)tableColumn row:(NSInteger)rowIndex { if([tableColumn.identifier isEqualToString:@"accessoryColumn"]) - return [items objectAtIndex:rowIndex]; - if([filterDataSource respondsToSelector:@selector(displayStringForItem:)]) + return [_items objectAtIndex:rowIndex]; + + if([_filterDataSource respondsToSelector:@selector(displayStringForItem:)]) { - NSMutableParagraphStyle* pStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease]; + NSMutableParagraphStyle* pStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [pStyle setLineBreakMode:NSLineBreakByTruncatingMiddle]; - NSMutableAttributedString* text = [[[filterDataSource displayStringForItem:[items objectAtIndex:rowIndex]] mutableCopy] autorelease]; - [text addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSColor darkGrayColor], NSForegroundColorAttributeName, [NSFont controlContentFontOfSize:13], NSFontAttributeName, pStyle, NSParagraphStyleAttributeName, nil] range:NSMakeRange(0, [text length])]; - NSDictionary* highlightAttributes = [NSDictionary dictionaryWithObjectsAndKeys: - @1, NSUnderlineStyleAttributeName, - [NSColor blackColor], NSForegroundColorAttributeName, - [[NSFontManager sharedFontManager] convertFont:[NSFont controlContentFontOfSize:13] toHaveTrait:NSBoldFontMask], NSFontAttributeName, - nil]; + + NSFont* baseFont = [NSFont controlContentFontOfSize:13]; + NSFont* boldFont = [[NSFontManager sharedFontManager] convertFont:baseFont toHaveTrait:NSBoldFontMask]; + + NSDictionary* baseAttributes = @{ NSForegroundColorAttributeName : [NSColor darkGrayColor], NSFontAttributeName : baseFont, NSParagraphStyleAttributeName : pStyle }; + NSDictionary* highlightAttributes = @{ NSForegroundColorAttributeName : [NSColor blackColor], NSFontAttributeName : boldFont, NSUnderlineStyleAttributeName : @1 }; + + NSMutableAttributedString* text = [[_filterDataSource displayStringForItem:[_items objectAtIndex:rowIndex]] mutableCopy]; + [text addAttributes:baseAttributes range:NSMakeRange(0, [text length])]; HighlightRangesWithAttribute(text, FLMatchingTextAttributeName, highlightAttributes); return text; } else - return [items objectAtIndex:rowIndex]; + { + return [_items objectAtIndex:rowIndex]; + } } - (void)tableViewSelectionDidChange:(NSNotification*)notification { - if([filterDataSource respondsToSelector:@selector(infoStringForItem:)]) + if([_filterDataSource respondsToSelector:@selector(infoStringForItem:)]) { - if(self.selectedRow != -1 && [items count] > 0) + if(self.selectedRow != -1 && [_items count] > 0) { - NSMutableAttributedString* text = [[[filterDataSource infoStringForItem:[items objectAtIndex:self.selectedRow]] mutableCopy] autorelease]; - NSMutableParagraphStyle* style = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease]; - [style setLineBreakMode:NSLineBreakByTruncatingHead]; - [text addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSColor darkGrayColor], NSForegroundColorAttributeName, [NSFont controlContentFontOfSize:11], NSFontAttributeName, style, NSParagraphStyleAttributeName, nil] - range:NSMakeRange(0, [text length])]; - NSDictionary* highlightAttributes = [NSDictionary dictionaryWithObjectsAndKeys: - @1, NSUnderlineStyleAttributeName, - [NSColor blackColor], NSForegroundColorAttributeName, - [[NSFontManager sharedFontManager] convertFont:[NSFont controlContentFontOfSize:11] toHaveTrait:NSBoldFontMask], NSFontAttributeName, - nil]; + NSMutableParagraphStyle* pStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; + [pStyle setLineBreakMode:NSLineBreakByTruncatingHead]; + + NSFont* baseFont = [NSFont controlContentFontOfSize:11]; + NSFont* boldFont = [[NSFontManager sharedFontManager] convertFont:baseFont toHaveTrait:NSBoldFontMask]; + + NSDictionary* baseAttributes = @{ NSForegroundColorAttributeName : [NSColor darkGrayColor], NSFontAttributeName : baseFont, NSParagraphStyleAttributeName : pStyle }; + NSDictionary* highlightAttributes = @{ NSForegroundColorAttributeName : [NSColor blackColor], NSFontAttributeName : boldFont, NSUnderlineStyleAttributeName : @1 }; + + NSMutableAttributedString* text = [[_filterDataSource infoStringForItem:[_items objectAtIndex:self.selectedRow]] mutableCopy]; + [text addAttributes:baseAttributes range:NSMakeRange(0, [text length])]; HighlightRangesWithAttribute(text, FLMatchingTextAttributeName, highlightAttributes); NSUInteger tabIndex = [text.mutableString rangeOfString:@"\t"].location; if(tabIndex != NSNotFound) { CGFloat width = self.window.frame.size.width - [text attributedSubstringFromRange:NSMakeRange(tabIndex, text.length - tabIndex)].size.width - 10; - NSMutableParagraphStyle* rightAlignStyle = [[[text attribute:NSParagraphStyleAttributeName atIndex:tabIndex effectiveRange:NULL] mutableCopy] autorelease]; - [rightAlignStyle setTabStops:@[ [[[NSTextTab alloc] initWithType:NSLeftTabStopType location:width + 1.0] autorelease] ]]; + NSMutableParagraphStyle* rightAlignStyle = [[text attribute:NSParagraphStyleAttributeName atIndex:tabIndex effectiveRange:NULL] mutableCopy]; + [rightAlignStyle setTabStops:@[ [[NSTextTab alloc] initWithType:NSLeftTabStopType location:width + 1.0] ]]; [text addAttribute:NSParagraphStyleAttributeName value:rightAlignStyle range:NSMakeRange(0, text.length)]; } @@ -238,15 +239,15 @@ NSString* const FLDataSourceItemsShouldAscendNotification = @"FLDataSourceItems } else { - self.infoString = [[[NSAttributedString alloc] initWithString:@""] autorelease]; + self.infoString = [[NSAttributedString alloc] initWithString:@""]; } } } - (void)tableView:(NSTableView*)tableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn*)tableColumn row:(NSInteger)rowIndex { - if([filterDataSource respondsToSelector:@selector(willDisplayCell:forItem:)] && ![tableColumn.identifier isEqualToString:@"accessoryColumn"]) - [filterDataSource willDisplayCell:aCell forItem:[self.items objectAtIndex:rowIndex]]; + if([_filterDataSource respondsToSelector:@selector(willDisplayCell:forItem:)] && ![tableColumn.identifier isEqualToString:@"accessoryColumn"]) + [_filterDataSource willDisplayCell:aCell forItem:[self.items objectAtIndex:rowIndex]]; } // =========== @@ -260,14 +261,14 @@ NSString* const FLDataSourceItemsShouldAscendNotification = @"FLDataSourceItems - (void)waitForAllItems { - if([filterDataSource respondsToSelector:@selector(waitForAllItems)]) - [filterDataSource waitForAllItems]; + if([_filterDataSource respondsToSelector:@selector(waitForAllItems)]) + [_filterDataSource waitForAllItems]; } - (void)makeSelectedItemsBestMatch { - if([filterDataSource respondsToSelector:@selector(makeItemsBestFitForCurrentSearch:)]) - [filterDataSource makeItemsBestFitForCurrentSearch:self.selectedItems]; + if([_filterDataSource respondsToSelector:@selector(makeItemsBestFitForCurrentSearch:)]) + [_filterDataSource makeItemsBestFitForCurrentSearch:self.selectedItems]; } - (BOOL)acceptsFirstResponder diff --git a/Frameworks/OakFilterList/src/datasources/BundleItemChooser.h b/Frameworks/OakFilterList/src/datasources/BundleItemChooser.h index 983bd1fc..7ebf8e37 100644 --- a/Frameworks/OakFilterList/src/datasources/BundleItemChooser.h +++ b/Frameworks/OakFilterList/src/datasources/BundleItemChooser.h @@ -3,9 +3,7 @@ #else #import "../OakFilterList.h" #endif -#import #import -#import #import namespace search @@ -19,19 +17,6 @@ namespace search } PUBLIC @interface BundleItemChooser : NSObject -{ - OBJC_WATCH_LEAKS(BundleItemChooser); - scope::context_t scope; - BOOL hasSelection; - std::vector all_items; - std::set items_filtered_by_scope; - BOOL searchAllScopes; - std::string originalFilterString; - std::string filterString; - NSViewController* viewController; - BOOL keyEquivalentSearch; - search::type searchType; -} + (id)bundleItemChooserForScope:(scope::context_t const&)aScope; @property (nonatomic, retain) NSString* filterString; @property (nonatomic, assign) BOOL keyEquivalentSearch; diff --git a/Frameworks/OakFilterList/src/datasources/BundleItemChooser.mm b/Frameworks/OakFilterList/src/datasources/BundleItemChooser.mm index 504b9be3..2bf81b93 100644 --- a/Frameworks/OakFilterList/src/datasources/BundleItemChooser.mm +++ b/Frameworks/OakFilterList/src/datasources/BundleItemChooser.mm @@ -80,37 +80,28 @@ OAK_DEBUG_VAR(FilterList_BundleItemChooser); OakKeyEquivalentView* keyEquivField; NSSegmentedControl* sourceSelector; MGScopeBar* scopeBar; - BundleItemChooser* itemChooser; } -@property (nonatomic, assign) BundleItemChooser* itemChooser; +@property (nonatomic, weak) BundleItemChooser* itemChooser; @end @interface BundleItemChooserView : NSView -{ - BundleItemChooserViewController* viewController; -} -@property (nonatomic, assign) BundleItemChooserViewController* viewController; +@property (nonatomic, weak) BundleItemChooserViewController* viewController; @end @implementation BundleItemChooserView -@synthesize viewController; - - (void)viewDidMoveToWindow { [self.window makeFirstResponder:[self.viewController valueForKey:self.viewController.itemChooser.keyEquivalentSearch ? @"keyEquivField" : @"searchField"]]; - self.viewController = nil; } @end -@implementation BundleItemChooserViewController -@synthesize itemChooser; - static NSString* const TitleSearchMode = @"TitleSearchMode"; static NSString* const KeyEquivalentSearchMode = @"KeyEquivalentSearchMode"; static NSString* const CurrentScope = @"CurrentScope"; static NSString* const AllScopes = @"AllScopes"; +@implementation BundleItemChooserViewController - (id)initWithBundleItemChooser:(BundleItemChooser*)chooser { if((self = [super init])) @@ -119,21 +110,21 @@ static NSString* const AllScopes = @"AllScopes"; static const CGFloat initialViewWidth = 1200; - searchField = [[[NSSearchField alloc] initWithFrame:NSMakeRect(7, 8, initialViewWidth-14, 22)] autorelease]; + searchField = [[NSSearchField alloc] initWithFrame:NSMakeRect(7, 8, initialViewWidth-14, 22)]; searchField.action = @selector(didChangeFilterString:); searchField.target = self; searchField.autoresizingMask = NSViewWidthSizable|NSViewMinYMargin; [searchField.cell setScrollable:YES]; - keyEquivField = [[[OakKeyEquivalentView alloc] initWithFrame:searchField.frame] autorelease]; + keyEquivField = [[OakKeyEquivalentView alloc] initWithFrame:searchField.frame]; keyEquivField.autoresizingMask = NSViewWidthSizable|NSViewMinYMargin; keyEquivField.disableGlobalHotkeys = NO; [keyEquivField setHidden:YES]; - scopeBar = [[[OakScopeBar alloc] initWithFrame:NSMakeRect(0, NSMaxY(searchField.frame) + 6, initialViewWidth, 25)] autorelease]; + scopeBar = [[OakScopeBar alloc] initWithFrame:NSMakeRect(0, NSMaxY(searchField.frame) + 6, initialViewWidth, 25)]; scopeBar.autoresizingMask = NSViewWidthSizable|NSViewMinYMargin; - self.view = [[[BundleItemChooserView alloc] initWithFrame:NSMakeRect(0, 0, initialViewWidth, NSMaxY(scopeBar.frame))] autorelease]; + self.view = [[BundleItemChooserView alloc] initWithFrame:NSMakeRect(0, 0, initialViewWidth, NSMaxY(scopeBar.frame))]; ((BundleItemChooserView*)self.view).viewController = self; self.view.autoresizingMask = NSViewWidthSizable; [self.view addSubview:searchField]; @@ -141,10 +132,10 @@ static NSString* const AllScopes = @"AllScopes"; [self.view addSubview:scopeBar]; - BOOL searchAllScopes = itemChooser.searchAllScopes; - BOOL keyEquivalentSearch = itemChooser.keyEquivalentSearch; - search::type searchType = itemChooser.searchType; - NSString* filterString = itemChooser.filterString; + BOOL searchAllScopes = chooser.searchAllScopes; + BOOL keyEquivalentSearch = chooser.keyEquivalentSearch; + search::type searchType = chooser.searchType; + NSString* filterString = chooser.filterString; scopeBar.delegate = self; [scopeBar reloadData]; @@ -159,9 +150,9 @@ static NSString* const AllScopes = @"AllScopes"; case search::themes: [scopeBar setSelected:YES forItem:@"Themes" inGroup:2]; break; } - itemChooser.filterString = filterString; + chooser.filterString = filterString; - if(itemChooser.keyEquivalentSearch) + if(chooser.keyEquivalentSearch) keyEquivField.eventString = filterString; else searchField.stringValue = filterString; @@ -174,11 +165,8 @@ static NSString* const AllScopes = @"AllScopes"; - (void)dealloc { searchField.target = nil; - searchField.action = NULL; [[NSNotificationCenter defaultCenter] removeObserver:self]; [keyEquivField unbind:@"value"]; - self.itemChooser = nil; - [super dealloc]; } - (int)numberOfGroupsInScopeBar:(MGScopeBar*)theScopeBar @@ -228,26 +216,26 @@ static NSString* const AllScopes = @"AllScopes"; [searchField setHidden:NO]; [keyEquivField setHidden:YES]; [self.view.window makeFirstResponder:searchField]; - itemChooser.keyEquivalentSearch = NO; + self.itemChooser.keyEquivalentSearch = NO; } else if(identifier == KeyEquivalentSearchMode) { [searchField setHidden:YES]; [keyEquivField setHidden:NO]; [self.view.window makeFirstResponder:keyEquivField]; - itemChooser.keyEquivalentSearch = YES; + self.itemChooser.keyEquivalentSearch = YES; keyEquivField.recording = YES; } } else if(groupNumber == 0) { - itemChooser.searchAllScopes = identifier == AllScopes; + self.itemChooser.searchAllScopes = identifier == AllScopes; } else if(groupNumber == 2) { - if([identifier isEqualToString:@"Actions"]) itemChooser.searchType = search::actions; - else if([identifier isEqualToString:@"Grammars"]) itemChooser.searchType = search::grammars; - else if([identifier isEqualToString:@"Themes"]) itemChooser.searchType = search::themes; + if([identifier isEqualToString:@"Actions"]) self.itemChooser.searchType = search::actions; + else if([identifier isEqualToString:@"Grammars"]) self.itemChooser.searchType = search::grammars; + else if([identifier isEqualToString:@"Themes"]) self.itemChooser.searchType = search::themes; } } @@ -286,7 +274,7 @@ static NSString* const AllScopes = @"AllScopes"; [scopeBar setSelected:YES forItem:identifier inGroup:groupIndex]; } -- (void)didChangeFilterString:(NSSearchField*)sender { itemChooser.filterString = sender.stringValue; } +- (void)didChangeFilterString:(NSSearchField*)sender { self.itemChooser.filterString = sender.stringValue; } - (void)setSearchFieldDelegate:(id)aDelegate { searchField.delegate = aDelegate; } - (void)viewFrameDidChange:(NSNotification*)notification @@ -298,6 +286,19 @@ static NSString* const AllScopes = @"AllScopes"; @end @implementation BundleItemChooser +{ + OBJC_WATCH_LEAKS(BundleItemChooser); + scope::context_t scope; + BOOL hasSelection; + std::vector all_items; + std::set items_filtered_by_scope; + BOOL searchAllScopes; + std::string originalFilterString; + std::string filterString; + NSViewController* viewController; + BOOL keyEquivalentSearch; + search::type searchType; +} @synthesize keyEquivalentSearch, textViewHasSelection = hasSelection, searchAllScopes, searchType; static std::vector relevant_items_in_scope (search::type searchType, scope::context_t const& scope, bool hasSelection) @@ -332,13 +333,7 @@ static std::vector relevant_items_in_scope (search::type sear + (id)bundleItemChooserForScope:(scope::context_t const&)aScope { - return [[[self alloc] initWithScope:aScope] autorelease]; -} - -- (void)dealloc -{ - [viewController release]; - [super dealloc]; + return [[self alloc] initWithScope:aScope]; } - (NSString*)title @@ -348,7 +343,7 @@ static std::vector relevant_items_in_scope (search::type sear - (NSTextFieldCell*)itemDataCell { - return [[[OakBundleItemCell alloc] initTextCell:@""] autorelease]; + return [[OakBundleItemCell alloc] initTextCell:@""]; } - (void)setSearchType:(search::type)newType @@ -408,7 +403,7 @@ static std::vector relevant_items_in_scope (search::type sear - (NSButtonCell*)accessoryButton { - NSButtonCell* button = [[NSButtonCell new] autorelease]; + NSButtonCell* button = [NSButtonCell new]; [button setButtonType:NSSwitchButton]; [button setBezelStyle:NSSmallSquareBezelStyle]; [button setImagePosition:NSImageOnly]; @@ -432,7 +427,7 @@ static std::vector relevant_items_in_scope (search::type sear if(!filterString.empty() && key_equivalent(all_items[index]) != originalFilterString) continue; - BundleItemChooserItem* item = [[BundleItemChooserItem new] autorelease]; + BundleItemChooserItem* item = [BundleItemChooserItem new]; [item setIndex:index]; [item setUuid:all_items[index]->uuid()]; rankedItems.insert(std::make_pair(0, item)); @@ -461,7 +456,7 @@ static std::vector relevant_items_in_scope (search::type sear rank = 1 - std::max(nameRank, triggerRank); } - BundleItemChooserItem* item = [[BundleItemChooserItem new] autorelease]; + BundleItemChooserItem* item = [BundleItemChooserItem new]; [item setIndex:index]; [item setUuid:all_items[index]->uuid()]; rankedItems.insert(std::make_pair(rank, item)); diff --git a/Frameworks/OakFilterList/src/datasources/OakBundleItemCell.h b/Frameworks/OakFilterList/src/datasources/OakBundleItemCell.h index ad107724..f2a431b1 100644 --- a/Frameworks/OakFilterList/src/datasources/OakBundleItemCell.h +++ b/Frameworks/OakFilterList/src/datasources/OakBundleItemCell.h @@ -1,8 +1,4 @@ @interface OakBundleItemCell : NSTextFieldCell -{ - NSString* keyEquivalent; - NSAttributedString* attributedTabTrigger; -} @property (nonatomic, retain) NSString* keyEquivalent; @property (nonatomic, retain) NSString* tabTrigger; @property (nonatomic, retain) NSAttributedString* attributedTabTrigger; diff --git a/Frameworks/OakFilterList/src/datasources/OakBundleItemCell.mm b/Frameworks/OakFilterList/src/datasources/OakBundleItemCell.mm index d9f9c0b4..e0d21641 100644 --- a/Frameworks/OakFilterList/src/datasources/OakBundleItemCell.mm +++ b/Frameworks/OakFilterList/src/datasources/OakBundleItemCell.mm @@ -5,87 +5,72 @@ #import "../highlight_ranges.h" @implementation OakBundleItemCell -@synthesize keyEquivalent, attributedTabTrigger; - - (id)copyWithZone:(NSZone*)zone { - OakBundleItemCell* cell = [super copyWithZone:zone]; - cell->keyEquivalent = [self.keyEquivalent copy]; - cell->attributedTabTrigger = [self.attributedTabTrigger copy]; + OakBundleItemCell* cell = [super copyWithZone:zone]; + cell.keyEquivalent = [self.keyEquivalent copy]; + cell.attributedTabTrigger = [self.attributedTabTrigger copy]; return cell; } -- (void)dealloc -{ - self.keyEquivalent = nil; - self.attributedTabTrigger = nil; - [super dealloc]; -} - - (NSString*)tabTrigger { - return attributedTabTrigger.string; + return self.attributedTabTrigger.string; } - (void)setTabTrigger:(NSString*)tabTrigger { - self.attributedTabTrigger = tabTrigger ? [[[NSAttributedString alloc] initWithString:tabTrigger attributes:nil] autorelease] : nil; + self.attributedTabTrigger = tabTrigger ? [[NSAttributedString alloc] initWithString:tabTrigger attributes:nil] : nil; } - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView { - if(NSNotEmptyString(attributedTabTrigger.string)) + if(NSNotEmptyString(self.attributedTabTrigger.string)) { - NSMutableAttributedString* attrStr = [[attributedTabTrigger mutableCopy] autorelease]; + NSMutableAttributedString* attrStr = [self.attributedTabTrigger mutableCopy]; - NSDictionary* highlightAttributes = [NSDictionary dictionaryWithObjectsAndKeys: - @1, NSUnderlineStyleAttributeName, - [NSFont boldSystemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]], NSFontAttributeName, - nil]; + NSDictionary* highlightAttributes = @{ NSUnderlineStyleAttributeName : @1, NSFontAttributeName : [NSFont boldSystemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]] }; HighlightRangesWithAttribute(attrStr, FLMatchingTextAttributeName, highlightAttributes); - [attrStr appendAttributedString:[[[NSAttributedString alloc] initWithString:@"⇥" attributes:nil] autorelease]]; - CFTypeRef str = (CFAttributedStringRef)attrStr; + [attrStr appendAttributedString:[[NSAttributedString alloc] initWithString:@"⇥" attributes:nil]]; + CFTypeRef str = (CFAttributedStringRef)CFBridgingRetain(attrStr); HIThemeTextInfo textInfo = { kHIThemeTextInfoVersionZero, kThemeStateActive, kThemeSmallSystemFont, kHIThemeTextHorizontalFlushRight, kHIThemeTextVerticalFlushCenter, 0, kHIThemeTextTruncationNone, 1, 0 }; - CGFloat width = 0.0; + CGFloat width = 0; HIThemeGetTextDimensions(str, 0, &textInfo, &width, NULL, NULL); NSRect triggerFrame; - NSDivideRect(cellFrame, &triggerFrame, &cellFrame, width + 12.0, NSMaxXEdge); - cellFrame.size.width -= 10.0; - triggerFrame.size.width -= 2.0; + NSDivideRect(cellFrame, &triggerFrame, &cellFrame, width + 12, NSMaxXEdge); + cellFrame.size.width -= 10; + triggerFrame.size.width -= 2; - [[NSColor colorWithCalibratedRed:0.0 green:0.0 blue:0.0 alpha:0.15] set]; + [[NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:0.15] set]; NSRect podRect = triggerFrame; [[NSBezierPath bezierPathWithRoundedRect:podRect xRadius:4 yRadius:4] fill]; - HIRect bounds = { { NSMinX(podRect) - 5.0f, NSMinY(podRect) }, { NSWidth(podRect), NSHeight(podRect) } }; + HIRect bounds = { { NSMinX(podRect) - 5, NSMinY(podRect) }, { NSWidth(podRect), NSHeight(podRect) } }; [[NSColor textColor] set]; if([self isHighlighted] && ([[controlView window] firstResponder] == controlView || ([[[controlView window] firstResponder] respondsToSelector:@selector(delegate)] && [[[controlView window] firstResponder] performSelector:@selector(delegate)] == controlView)) && [[controlView window] isKeyWindow]) [[NSColor alternateSelectedControlTextColor] set]; CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; HIThemeDrawTextBox(str, &bounds, &textInfo, context, kHIThemeOrientationNormal); + + CFRelease(str); } - else if(NSNotEmptyString(keyEquivalent)) + else if(NSNotEmptyString(self.keyEquivalent)) { size_t keyStartsAt = 0; - std::string const glyphString = ns::glyphs_for_event_string(to_s(keyEquivalent), &keyStartsAt); + std::string const glyphString = ns::glyphs_for_event_string(to_s(self.keyEquivalent), &keyStartsAt); NSString* modifiers = [NSString stringWithCxxString:glyphString.substr(0, keyStartsAt)]; NSString* key = [NSString stringWithCxxString:glyphString.substr(keyStartsAt)]; NSDictionary* fontAttr = @{ NSFontAttributeName : [self font] }; CGFloat width = std::max(1, [modifiers sizeWithAttributes:fontAttr].width); - NSMutableAttributedString* aStr = [[[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"\t%@\t%@", modifiers, key] attributes:fontAttr] autorelease]; - NSMutableParagraphStyle* pStyle = [[NSMutableParagraphStyle new] autorelease]; - [pStyle setTabStops: - [NSArray arrayWithObjects: - [[[NSTextTab alloc] initWithType:NSRightTabStopType location:width] autorelease], - [[[NSTextTab alloc] initWithType:NSLeftTabStopType location:width + 1] autorelease], - nil]]; - + NSMutableAttributedString* aStr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"\t%@\t%@", modifiers, key] attributes:fontAttr]; + NSMutableParagraphStyle* pStyle = [NSMutableParagraphStyle new]; + [pStyle setTabStops:@[ [[NSTextTab alloc] initWithType:NSRightTabStopType location:width], [[NSTextTab alloc] initWithType:NSLeftTabStopType location:width + 1] ]]; [aStr addAttributes:@{ NSParagraphStyleAttributeName : pStyle } range:NSMakeRange(0, [aStr length])]; if([self isHighlighted] && ([[controlView window] firstResponder] == controlView || ([[[controlView window] firstResponder] respondsToSelector:@selector(delegate)] && [[[controlView window] firstResponder] performSelector:@selector(delegate)] == controlView)) && [[controlView window] isKeyWindow]) @@ -104,7 +89,7 @@ - (NSSize)cellSize { NSSize cellSize = [super cellSize]; - cellSize.width += 55.0; + cellSize.width += 55; return cellSize; } @end diff --git a/Frameworks/OakFilterList/src/datasources/OakFileChooser.h b/Frameworks/OakFilterList/src/datasources/OakFileChooser.h index 3aa5d56a..87e08bac 100644 --- a/Frameworks/OakFilterList/src/datasources/OakFileChooser.h +++ b/Frameworks/OakFilterList/src/datasources/OakFileChooser.h @@ -7,71 +7,7 @@ #import #import -struct file_chooser_t -{ - struct item_t - { - item_t () { } - item_t (document::document_ptr document, std::string const& matchName, double rank, std::vector< std::pair > const& matchRanges) : _document(document), _match_name(matchName), _rank(rank), _match_ranges(matchRanges) { } - bool operator< (item_t const& rhs) const; - - document::document_ptr _document; - std::string _match_name; - double _rank; - std::vector< std::pair > _match_ranges; - size_t _parents = 0; - }; - - void setup (std::string const& path, std::string const& globString, std::string const& rankString); - void set_excluded_document (oak::uuid_t const& uuid); - void set_path (std::string const& path); - void set_filtering (std::string const& globString, std::string const& rankString); - - void set_documents (std::vector const& documents); - - bool running () const; - bool poll_scanner (); - void wait () const; - void stop_scanner (); - - std::string const& glob_string () const { return _glob_string; } - std::string const& rank_string () const { return _rank_string; } - - std::vector const& items () const { return _ranked_items; } - -private: - void add_documents (std::vector const& documents); - - std::shared_ptr _scanner; - - std::string _path = NULL_STR; - std::string _glob_string = NULL_STR; - std::string _rank_string = NULL_STR; - - oak::uuid_t _excluded_document; - - std::vector _all_documents; - std::vector _filtered_documents; - std::vector _ranked_items; -}; - PUBLIC @interface OakFileChooser : NSObject -{ - OBJC_WATCH_LEAKS(OakFileChooser) - NSString* _path; - NSString* projectPath; - - NSViewController* viewController; - - file_chooser_t helper; - document::document_ptr document; - - OakTimer* scannerProbeTimer; - double pollInterval; - NSUInteger sourceIndex; - - NSString* title; -} + (id)fileChooserWithPath:(NSString*)aPath projectPath:(NSString*)project; @property (nonatomic, assign) NSUInteger sourceIndex; @property (nonatomic, retain) NSString* path; diff --git a/Frameworks/OakFilterList/src/datasources/OakFileChooser.mm b/Frameworks/OakFilterList/src/datasources/OakFileChooser.mm index 5172efc0..5f083cd5 100644 --- a/Frameworks/OakFilterList/src/datasources/OakFileChooser.mm +++ b/Frameworks/OakFilterList/src/datasources/OakFileChooser.mm @@ -20,6 +20,54 @@ OAK_DEBUG_VAR(FilterList_OakFileChooser); // = Helper = // ========== +struct file_chooser_t +{ + struct item_t + { + item_t () { } + item_t (document::document_ptr document, std::string const& matchName, double rank, std::vector< std::pair > const& matchRanges) : _document(document), _match_name(matchName), _rank(rank), _match_ranges(matchRanges) { } + bool operator< (item_t const& rhs) const; + + document::document_ptr _document; + std::string _match_name; + double _rank; + std::vector< std::pair > _match_ranges; + size_t _parents = 0; + }; + + void setup (std::string const& path, std::string const& globString, std::string const& rankString); + void set_excluded_document (oak::uuid_t const& uuid); + void set_path (std::string const& path); + void set_filtering (std::string const& globString, std::string const& rankString); + + void set_documents (std::vector const& documents); + + bool running () const; + bool poll_scanner (); + void wait () const; + void stop_scanner (); + + std::string const& glob_string () const { return _glob_string; } + std::string const& rank_string () const { return _rank_string; } + + std::vector const& items () const { return _ranked_items; } + +private: + void add_documents (std::vector const& documents); + + std::shared_ptr _scanner; + + std::string _path = NULL_STR; + std::string _glob_string = NULL_STR; + std::string _rank_string = NULL_STR; + + oak::uuid_t _excluded_document; + + std::vector _all_documents; + std::vector _filtered_documents; + std::vector _ranked_items; +}; + bool file_chooser_t::item_t::operator< (item_t const& rhs) const { std::tuple lhsValue(_rank, -_document->lru().value(), _match_name), rhsValue(rhs._rank, -rhs._document->lru().value(), rhs._match_name); @@ -288,7 +336,7 @@ void file_chooser_t::wait () const @implementation FileChooserItem @synthesize selectionString; -+ (FileChooserItem*)fileChooserItemWithItem:(file_chooser_t::item_t const&)someItem selection:(NSString*)aSelection { return [[[FileChooserItem alloc] initWithItem:someItem selection:aSelection] autorelease]; } ++ (FileChooserItem*)fileChooserItemWithItem:(file_chooser_t::item_t const&)someItem selection:(NSString*)aSelection { return [[FileChooserItem alloc] initWithItem:someItem selection:aSelection]; } - (id)copyWithZone:(NSZone*)zone { return [[FileChooserItem alloc] initWithItem:data selection:selectionString]; } - (BOOL)isEqual:(FileChooserItem*)anotherItem { return [self.identifier isEqualToString:anotherItem.identifier]; } - (id)objectForKey:(id)key { return [self valueForKey:key]; } @@ -298,17 +346,11 @@ void file_chooser_t::wait () const if(self = [super init]) { data = someItem; - selectionString = [aSelection retain]; + selectionString = aSelection; } return self; } -- (void)dealloc -{ - [selectionString release]; - [super dealloc]; -} - - (NSString*)path { return [NSString stringWithCxxString:data._document->path()]; } - (NSString*)identifier { return [NSString stringWithCxxString:data._document->identifier()]; } - (document::document_ptr const&)document { return data._document; } @@ -318,8 +360,8 @@ void file_chooser_t::wait () const NSAttributedString* res = AttributedStringWithMarkedUpRanges(data._match_name, data._match_ranges); if(data._parents) { - NSMutableAttributedString* prefix = [[res mutableCopy] autorelease]; - NSAttributedString* suffix = [[[NSAttributedString alloc] initWithString:[NSString stringWithCxxString:parents(data._document->path(), data._parents)] attributes:nil] autorelease]; + NSMutableAttributedString* prefix = [res mutableCopy]; + NSAttributedString* suffix = [[NSAttributedString alloc] initWithString:[NSString stringWithCxxString:parents(data._document->path(), data._parents)] attributes:nil]; [prefix appendAttributedString:suffix]; res = prefix; } @@ -368,7 +410,7 @@ void file_chooser_t::wait () const globHistoryList = [[OakHistoryList alloc] initWithName:[NSString stringWithFormat:@"Find in Folder Globs.%@", fileChooser.projectPath] stackSize:10 defaultItems:@"*", @"*.txt", @"*.{c,h}", nil]; fileChooser.globString = globHistoryList.head; - globComboBox = [[[NSComboBox alloc] initWithFrame:NSMakeRect(0, 0, 35, 26)] autorelease]; + globComboBox = [[NSComboBox alloc] initWithFrame:NSMakeRect(0, 0, 35, 26)]; globComboBox.font = [NSFont userFixedPitchFontOfSize:12]; globComboBox.delegate = self; globComboBox.autoresizingMask = NSViewWidthSizable; @@ -376,14 +418,14 @@ void file_chooser_t::wait () const [globComboBox bind:@"value" toObject:globHistoryList withKeyPath:@"head" options:nil]; [globComboBox bind:@"contentValues" toObject:globHistoryList withKeyPath:@"list" options:nil]; - searchField = [[[NSSearchField alloc] initWithFrame:NSMakeRect(0, 0, splitViewWidth - NSWidth(globComboBox.frame), 0)] autorelease]; + searchField = [[NSSearchField alloc] initWithFrame:NSMakeRect(0, 0, splitViewWidth - NSWidth(globComboBox.frame), 0)]; searchField.action = @selector(didChangeFilterString:); searchField.target = self; searchField.stringValue = fileChooser.filterString; searchField.autoresizingMask = NSViewWidthSizable; [searchField.cell setScrollable:YES]; - NSSplitView* splitView = [[[NSSplitView alloc] initWithFrame:NSMakeRect((viewWidth-splitViewWidth)/2, 8, splitViewWidth, 26)] autorelease]; + NSSplitView* splitView = [[NSSplitView alloc] initWithFrame:NSMakeRect((viewWidth-splitViewWidth)/2, 8, splitViewWidth, 26)]; splitView.delegate = self; splitView.autoresizingMask = NSViewWidthSizable; [splitView setVertical:YES]; @@ -391,7 +433,7 @@ void file_chooser_t::wait () const [splitView addSubview:globComboBox]; splitView.autosaveName = @"File Chooser Splitter Position"; - sourceSelector = [[[NSSegmentedControl alloc] initWithFrame:NSMakeRect(-1, NSMaxY(splitView.frame) + 5, viewWidth+2, 23)] autorelease]; + sourceSelector = [[NSSegmentedControl alloc] initWithFrame:NSMakeRect(-1, NSMaxY(splitView.frame) + 5, viewWidth+2, 23)]; sourceSelector.refusesFirstResponder = YES; sourceSelector.target = self; sourceSelector.action = @selector(takeSourceIndexFrom:); @@ -401,7 +443,7 @@ void file_chooser_t::wait () const sourceSelector.selectedSegment = fileChooser.sourceIndex; [sourceSelector setLabel:@"Open Files" forSegment:2]; - self.view = [[[NSView alloc] initWithFrame:NSMakeRect(0, 0, viewWidth, NSMaxY(sourceSelector.frame)-3)] autorelease]; + self.view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, viewWidth, NSMaxY(sourceSelector.frame)-3)]; self.view.autoresizingMask = NSViewWidthSizable; [self.view addSubview:splitView]; [self.view addSubview:sourceSelector]; @@ -469,19 +511,31 @@ void file_chooser_t::wait () const - (void)dealloc { searchField.target = nil; - searchField.action = NULL; [globComboBox unbind:@"value"]; [globComboBox unbind:@"contentValues"]; [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [globHistoryList dealloc]; - [super dealloc]; } @end @implementation OakFileChooser +{ + OBJC_WATCH_LEAKS(OakFileChooser) + NSString* _path; + NSString* projectPath; + + NSViewController* viewController; + + file_chooser_t helper; + document::document_ptr document; + + OakTimer* scannerProbeTimer; + double pollInterval; + NSUInteger sourceIndex; + + NSString* title; +} @synthesize scannerProbeTimer, path = _path, projectPath, sourceIndex, title; - (NSString*)effectivePath @@ -529,8 +583,8 @@ void file_chooser_t::wait () const { if((self = [super init])) { - _path = [aPath retain]; - projectPath = [project retain]; + _path = aPath; + projectPath = project; [self updateTitle]; helper.setup([[self effectivePath] fileSystemRepresentation], "*", ""); @@ -541,7 +595,7 @@ void file_chooser_t::wait () const + (id)fileChooserWithPath:(NSString*)aPath projectPath:(NSString*)project { - return [[[self alloc] initWithPath:aPath projectPath:project] autorelease]; + return [[self alloc] initWithPath:aPath projectPath:project]; } - (NSViewController*)viewController @@ -553,7 +607,7 @@ void file_chooser_t::wait () const - (NSButtonCell*)accessoryButton { - NSButtonCell* button = [[NSButtonCell new] autorelease]; + NSButtonCell* button = [NSButtonCell new]; [button setButtonType:NSSwitchButton]; [button setBezelStyle:NSSmallSquareBezelStyle]; [button setImagePosition:NSImageOnly]; @@ -565,15 +619,9 @@ void file_chooser_t::wait () const - (void)dealloc { - [viewController release]; [self stopProbing]; - [projectPath release]; - [_path release]; - if(document) document->close(); - - [super dealloc]; } // =========================== @@ -614,8 +662,7 @@ void file_chooser_t::wait () const { if(newPath != _path) { - [_path release]; - _path = [newPath retain]; + _path = newPath; if(sourceIndex == 1) { helper.set_path([[self effectivePath] fileSystemRepresentation]); @@ -721,8 +768,8 @@ void file_chooser_t::wait () const - (NSAttributedString*)infoStringForItem:(id)item { - NSMutableAttributedString* str = [[[item infoString] mutableCopy] autorelease]; - [str appendAttributedString:[[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"\t%zu item%s", helper.items().size(), helper.items().size() != 1 ? "s" : ""] attributes:nil] autorelease]]; + NSMutableAttributedString* str = [[item infoString] mutableCopy]; + [str appendAttributedString:[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"\t%zu item%s", helper.items().size(), helper.items().size() != 1 ? "s" : ""] attributes:nil]]; return str; } diff --git a/Frameworks/OakFilterList/src/datasources/SymbolChooser.mm b/Frameworks/OakFilterList/src/datasources/SymbolChooser.mm index 665a5af6..63ae8ad1 100644 --- a/Frameworks/OakFilterList/src/datasources/SymbolChooser.mm +++ b/Frameworks/OakFilterList/src/datasources/SymbolChooser.mm @@ -22,13 +22,13 @@ OAK_DEBUG_VAR(FilterList_SymbolChooser); { symbolChooser = chooser; - searchField = [[[NSSearchField alloc] initWithFrame:NSMakeRect(10, 10, 180, 22)] autorelease]; + searchField = [[NSSearchField alloc] initWithFrame:NSMakeRect(10, 10, 180, 22)]; searchField.target = symbolChooser; searchField.action = @selector(search:); searchField.autoresizingMask = NSViewWidthSizable|NSViewMinYMargin; [searchField.cell setScrollable:YES]; - self.view = [[[NSView alloc] initWithFrame:NSMakeRect(0, 0, 200, NSMaxY(searchField.frame) + 8)] autorelease]; + self.view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 200, NSMaxY(searchField.frame) + 8)]; self.view.autoresizingMask = NSViewWidthSizable|NSViewMinYMargin; [self.view addSubview:searchField]; } @@ -39,8 +39,6 @@ OAK_DEBUG_VAR(FilterList_SymbolChooser); { searchField.delegate = nil; searchField.target = nil; - searchField.action = NULL; - [super dealloc]; } - (void)setSearchFieldDelegate:(id)aDelegate @@ -92,7 +90,7 @@ OAK_DEBUG_VAR(FilterList_SymbolChooser); + (id)symbolChooserForDocument:(document::document_ptr)aDocument { - return [[[self alloc] initWithDocument:aDocument] autorelease]; + return [[self alloc] initWithDocument:aDocument]; } - (NSString*)title @@ -139,7 +137,5 @@ OAK_DEBUG_VAR(FilterList_SymbolChooser); - (void)dealloc { document->close(); - [viewController release]; - [super dealloc]; } @end diff --git a/Frameworks/OakFilterList/src/datasources/SymbolList.h b/Frameworks/OakFilterList/src/datasources/SymbolList.h index 68bc194a..5764353c 100644 --- a/Frameworks/OakFilterList/src/datasources/SymbolList.h +++ b/Frameworks/OakFilterList/src/datasources/SymbolList.h @@ -2,13 +2,6 @@ #import @interface FileChooserSymbolItem : NSObject -{ - NSString* path; - NSString* selectionString; - NSString* identifier; - NSAttributedString* displayString; - NSAttributedString* infoString; -} @property (nonatomic, retain) NSString* path; @property (nonatomic, retain) NSString* selectionString; @property (nonatomic, retain) NSString* identifier; diff --git a/Frameworks/OakFilterList/src/datasources/SymbolList.mm b/Frameworks/OakFilterList/src/datasources/SymbolList.mm index b6b788f6..4d84f9a9 100644 --- a/Frameworks/OakFilterList/src/datasources/SymbolList.mm +++ b/Frameworks/OakFilterList/src/datasources/SymbolList.mm @@ -4,8 +4,6 @@ #import @implementation FileChooserSymbolItem -@synthesize path, selectionString, identifier, displayString, infoString; - - (id)initWithPath:(NSString*)aPath selectionString:(NSString*)aSelectionString identifier:(NSString*)anIdentifier displayString:(NSAttributedString*)aDisplayString infoString:(NSAttributedString*)anInfoString { if((self = [super init])) @@ -20,17 +18,6 @@ } - (id)objectForKey:(id)key { return [self valueForKey:key]; } - -- (void)dealloc -{ - self.path = nil; - self.identifier = nil; - self.selectionString = nil; - self.displayString = nil; - self.infoString = nil; - - [super dealloc]; -} @end static FileChooserSymbolItem* CreateItem (document::document_ptr const& document, text::pos_t const& pos, std::string const& candidate, std::vector< std::pair > const& ranges) @@ -40,7 +27,7 @@ static FileChooserSymbolItem* CreateItem (document::document_ptr const& document NSString* identifier = [NSString stringWithCxxString:document->identifier()]; NSAttributedString* display = AttributedStringWithMarkedUpRanges(candidate, ranges); NSAttributedString* info = [[NSAttributedString alloc] initWithString:[NSString stringWithCxxString:document->display_name() + ":" + (std::string)pos]]; - return [[[FileChooserSymbolItem alloc] initWithPath:path selectionString:selection identifier:identifier displayString:display infoString:info] autorelease]; + return [[FileChooserSymbolItem alloc] initWithPath:path selectionString:selection identifier:identifier displayString:display infoString:info]; } NSArray* SymbolListForDocument (document::document_ptr const& document, std::string const& filter) diff --git a/Frameworks/OakFilterList/src/highlight_ranges.mm b/Frameworks/OakFilterList/src/highlight_ranges.mm index acd4bb92..e93aeefd 100644 --- a/Frameworks/OakFilterList/src/highlight_ranges.mm +++ b/Frameworks/OakFilterList/src/highlight_ranges.mm @@ -7,7 +7,7 @@ NSString* const FLMatchingTextAttributeName = @"FLMatchingTextAttributeName"; NSAttributedString* AttributedStringWithMarkedUpRanges (std::string const& in, std::vector< std::pair > const& ranges, size_t offset) { - NSMutableAttributedString* res = [[[NSMutableAttributedString alloc] init] autorelease]; + NSMutableAttributedString* res = [[NSMutableAttributedString alloc] init]; NSDictionary* highlightAttrs = @{ FLMatchingTextAttributeName : [NSNull null] }; ASSERT(offset >= 0 && offset < in.size()); @@ -21,12 +21,12 @@ NSAttributedString* AttributedStringWithMarkedUpRanges (std::string const& in, s size_t from = 0; iterate(it, ranges) { - [res appendAttributedString:[[[NSAttributedString alloc] initWithString:[NSString stringWithCxxString:std::string(text.begin() + from, text.begin() + it->first)] attributes:nil] autorelease]]; - [res appendAttributedString:[[[NSAttributedString alloc] initWithString:[NSString stringWithCxxString:std::string(text.begin() + it->first, text.begin() + it->second)] attributes:highlightAttrs] autorelease]]; + [res appendAttributedString:[[NSAttributedString alloc] initWithString:[NSString stringWithCxxString:std::string(text.begin() + from, text.begin() + it->first)] attributes:nil]]; + [res appendAttributedString:[[NSAttributedString alloc] initWithString:[NSString stringWithCxxString:std::string(text.begin() + it->first, text.begin() + it->second)] attributes:highlightAttrs]]; from = it->second; } if(from < text.size()) - [res appendAttributedString:[[[NSAttributedString alloc] initWithString:[NSString stringWithCxxString:std::string(text.begin() + from, text.end())] attributes:nil] autorelease]]; + [res appendAttributedString:[[NSAttributedString alloc] initWithString:[NSString stringWithCxxString:std::string(text.begin() + from, text.end())] attributes:nil]]; return res; } diff --git a/Frameworks/OakFilterList/target b/Frameworks/OakFilterList/target index b2ef4e7e..77e9bdfe 100644 --- a/Frameworks/OakFilterList/target +++ b/Frameworks/OakFilterList/target @@ -3,5 +3,3 @@ EXPORT = src/OakFilterList.h src/datasources/*.h CP_Resources = resources/* LINK += text bundles document io plist MGScopeBar ns OakAppKit OakFoundation OakSystem OakTextView regexp scope FRAMEWORKS = Cocoa Carbon - -OBJCXX_FLAGS += -fno-objc-arc