Skip to content

Commit 2262b16

Browse files
author
Travis
committed
Merge branch 'itemFiltering' of https://github.com/NOLTELAUTH/XToDo into NOLTELAUTH-itemFiltering
* 'itemFiltering' of https://github.com/NOLTELAUTH/XToDo: Added a search bar to the main interface that allows the user to filter through the results. All items containing either the whole search phrase or at least all the search words (separated by space) are retrieved and displayed.
2 parents 4c3679f + 8251d80 commit 2262b16

10 files changed

+144
-22
lines changed

XToDo.xcodeproj/project.pbxproj

+8
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
6EB64F0A18947A5D00EA6B86 /* XToDoPreferencesWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6EFEA8AE1894757200FD9595 /* XToDoPreferencesWindowController.xib */; };
3535
6EFEA8AF1894757200FD9595 /* XToDoPreferencesWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EFEA8AD1894757200FD9595 /* XToDoPreferencesWindowController.m */; };
3636
6EFEA8B01894757200FD9595 /* XToDoPreferencesWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6EFEA8AE1894757200FD9595 /* XToDoPreferencesWindowController.xib */; };
37+
814ABA721AD1A602004CD467 /* NSString+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 816AE24E1AD1A44F003A8FCA /* NSString+Additions.m */; };
38+
814ABA731AD1A603004CD467 /* NSString+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 816AE24E1AD1A44F003A8FCA /* NSString+Additions.m */; };
3739
C338F4DE18F4FBAF00EDE66E /* PathEditViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C338F4DD18F4FBAF00EDE66E /* PathEditViewController.m */; };
3840
C338F4DF18F4FBAF00EDE66E /* PathEditViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C338F4DD18F4FBAF00EDE66E /* PathEditViewController.m */; };
3941
C338F4E118F4FD8700EDE66E /* PathEditViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C338F4E018F4FD8700EDE66E /* PathEditViewController.xib */; };
@@ -80,6 +82,8 @@
8082
6EFEA8AC1894757200FD9595 /* XToDoPreferencesWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XToDoPreferencesWindowController.h; sourceTree = "<group>"; };
8183
6EFEA8AD1894757200FD9595 /* XToDoPreferencesWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XToDoPreferencesWindowController.m; sourceTree = "<group>"; };
8284
6EFEA8AE1894757200FD9595 /* XToDoPreferencesWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = XToDoPreferencesWindowController.xib; sourceTree = "<group>"; };
85+
816AE24D1AD1A44F003A8FCA /* NSString+Additions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+Additions.h"; sourceTree = "<group>"; };
86+
816AE24E1AD1A44F003A8FCA /* NSString+Additions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+Additions.m"; sourceTree = "<group>"; };
8387
C338F4DC18F4FBAF00EDE66E /* PathEditViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PathEditViewController.h; sourceTree = "<group>"; };
8488
C338F4DD18F4FBAF00EDE66E /* PathEditViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PathEditViewController.m; sourceTree = "<group>"; };
8589
C338F4E018F4FD8700EDE66E /* PathEditViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PathEditViewController.xib; sourceTree = "<group>"; };
@@ -164,6 +168,8 @@
164168
6EFEA8AE1894757200FD9595 /* XToDoPreferencesWindowController.xib */,
165169
C360639F18EBDCE000F500EA /* NSData+Split.h */,
166170
C36063A018EBDCE000F500EA /* NSData+Split.m */,
171+
816AE24D1AD1A44F003A8FCA /* NSString+Additions.h */,
172+
816AE24E1AD1A44F003A8FCA /* NSString+Additions.m */,
167173
);
168174
path = XToDo;
169175
sourceTree = "<group>";
@@ -318,6 +324,7 @@
318324
buildActionMask = 2147483647;
319325
files = (
320326
C36063A118EBDCE000F500EA /* NSData+Split.m in Sources */,
327+
814ABA731AD1A603004CD467 /* NSString+Additions.m in Sources */,
321328
1F67ED4A1846E54F00E9E6AD /* XToDo.m in Sources */,
322329
C338F4DE18F4FBAF00EDE66E /* PathEditViewController.m in Sources */,
323330
6EFEA8AF1894757200FD9595 /* XToDoPreferencesWindowController.m in Sources */,
@@ -334,6 +341,7 @@
334341
C3417AF118F6A871003297B8 /* XToDo.m in Sources */,
335342
6EB64F09189479D800EA6B86 /* XToDoPreferencesWindowController.m in Sources */,
336343
C3F4610018F43BE10009D503 /* ProjectSetting.m in Sources */,
344+
814ABA721AD1A602004CD467 /* NSString+Additions.m in Sources */,
337345
C36063A218EBDCE000F500EA /* NSData+Split.m in Sources */,
338346
1FCB6EB21851D481002E6BC3 /* XToDoWindowController.m in Sources */,
339347
1FCB6E951851D45B002E6BC3 /* XTAppDelegate.m in Sources */,

XToDo/NSString+Additions.h

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//
2+
// NSString+Additions.h
3+
// XToDo
4+
//
5+
// Created by Gregory Catellani on 05/04/15.
6+
//
7+
8+
#import <Foundation/Foundation.h>
9+
10+
@interface NSString (Additions)
11+
12+
#pragma mark - NSStringExtensionMethods
13+
14+
- (BOOL) xtodo_containsStringOrSubstrings:(NSString *)string seperatedByString:(NSString *)separator;
15+
16+
@end

XToDo/NSString+Additions.m

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//
2+
// NSString+Additions.m
3+
// XToDo
4+
//
5+
// Created by Gregory Catellani on 05/04/15.
6+
//
7+
8+
#import "NSString+Additions.h"
9+
10+
@implementation NSString (Additions)
11+
12+
#pragma mark - NSStringExtensionMethods
13+
14+
- (BOOL) xtodo_containsStringOrSubstrings:(NSString *)string seperatedByString:(NSString *)separator
15+
{
16+
NSParameterAssert(separator);
17+
18+
// Remove any trailing occurences of the separator
19+
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:separator]];
20+
21+
BOOL result = YES;
22+
23+
if(string.length > 0)
24+
{
25+
// Check if self is entirely made of string => returns YES in that case
26+
if ([self rangeOfString:string options:NSCaseInsensitiveSearch].location == NSNotFound)
27+
{
28+
// Check if self contains the substrings provided in string
29+
NSArray *substrings = [string componentsSeparatedByString:separator];
30+
if(substrings.count > 1)
31+
{
32+
for(NSString *substring in substrings)
33+
{
34+
if([self rangeOfString:substring options:NSCaseInsensitiveSearch].location == NSNotFound)
35+
{
36+
result = NO;
37+
break;
38+
}
39+
}
40+
}
41+
else
42+
{
43+
result = NO;
44+
}
45+
}
46+
}
47+
else
48+
{
49+
result = NO;
50+
}
51+
return result;
52+
}
53+
54+
@end

XToDo/XToDo-Prefix.pch

100644100755
+3
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,7 @@
66

77
#ifdef __OBJC__
88
#import <Foundation/Foundation.h>
9+
10+
// Import common class additions
11+
#import "NSString+Additions.h"
912
#endif

XToDo/XToDoModel.h

100644100755
+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@
146146
+ (IDEWorkspaceTabController*)tabController;
147147
+ (IDESourceCodeEditor*)currentEditor;
148148

149-
+ (NSArray*)findItemsWithProjectSetting:(ProjectSetting*)projectSetting projectPath:(NSString*)ProjectPath;
149+
+ (NSArray*)findItemsWithProjectSetting:(ProjectSetting*)projectSetting projectPath:(NSString*)ProjectPath containingContentString:(NSString *)filterString;
150150

151151
+ (BOOL)openItem:(XToDoItem*)item;
152152

XToDo/XToDoModel.m

100644100755
+10-3
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ + (NSArray*)findItemsWithProjectPath:(NSString*)projectPath
217217
excludeDirs:(NSArray*)excludeDirs
218218
fileTypes:(NSSet*)fileTypes
219219
tempFilePath:(NSString*)tempFilePath
220+
containingContentString:(NSString *)filterString
220221
{
221222
// find all files match dirs and extnames
222223
NSArray* filePaths = [XToDoModel findFileNameWithProjectPath:projectPath
@@ -267,10 +268,14 @@ + (NSArray*)findItemsWithProjectPath:(NSString*)projectPath
267268
NSMutableArray* arr = [NSMutableArray array];
268269
for (NSString* line in results) {
269270
if (line.length > 4) {
270-
id anItem = [self itemFromLine:line];
271+
XToDoItem *anItem = [self itemFromLine:line];
271272

272273
if (nil != anItem) {
273-
[arr addObject:anItem];
274+
// Filter out items that do not contain our search string
275+
if(!filterString || filterString.length == 0 || [anItem.content xtodo_containsStringOrSubstrings:filterString seperatedByString:@" "])
276+
{
277+
[arr addObject:anItem];
278+
}
274279
}
275280
}
276281
}
@@ -279,6 +284,7 @@ + (NSArray*)findItemsWithProjectPath:(NSString*)projectPath
279284

280285
+ (NSArray*)findItemsWithProjectSetting:(ProjectSetting*)projectSetting
281286
projectPath:(NSString*)projectPath
287+
containingContentString:(NSString *)filterString
282288
{
283289
NSArray* includeDirs = [projectSetting includeDirs];
284290
if ([includeDirs count] == 0) {
@@ -296,7 +302,8 @@ + (NSArray*)findItemsWithProjectSetting:(ProjectSetting*)projectSetting
296302
fileTypes:[NSSet setWithObjects:@"H", @"hpp", @"M",
297303
@"Mm", @"c", @"cpp",
298304
@"cc", @"swift", nil]
299-
tempFilePath:tempFilePath];
305+
tempFilePath:tempFilePath
306+
containingContentString:filterString];
300307
}
301308
@catch (NSException* exception)
302309
{

XToDo/XToDoWindowController.h

100644100755
+7
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,11 @@
2121
- (void)setSearchRootDir:(NSString*)searchRootDir projectName:(NSString*)projectName;
2222

2323
- (IBAction)refresh:(id)sender;
24+
25+
26+
#pragma mark - Result filtering
27+
28+
@property (weak) IBOutlet NSSearchField *filterResultsSearchField;
29+
- (IBAction)filterResults:(id)sender;
30+
2431
@end

XToDo/XToDoWindowController.m

100644100755
+14-2
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ - (void)windowDidLoad
138138
selector:@selector(_onNotifyProjectSettingChanged:)
139139
name:kNotifyProjectSettingChanged
140140
object:nil];
141+
142+
[self.window makeFirstResponder:self.listView];
141143
}
142144

143145
- (void)dealloc
@@ -210,10 +212,10 @@ - (IBAction)refresh:(id)sender
210212
[self.workingIndicator setHidden:NO];
211213
[self.workingIndicator startAnimation:nil];
212214

215+
__block NSString *filterString = self.filterResultsSearchField ? self.filterResultsSearchField.stringValue : @"";
213216
dispatch_async(dispatch_get_global_queue(0, 0), ^{
214217
ProjectSetting *projectSetting = [XToDoModel projectSettingByProjectName:self.projectName];
215-
NSArray *items = [XToDoModel findItemsWithProjectSetting:projectSetting
216-
projectPath:self.projectPath];
218+
NSArray *items = [XToDoModel findItemsWithProjectSetting:projectSetting projectPath:self.projectPath containingContentString:filterString];
217219
dispatch_async(dispatch_get_main_queue(), ^{
218220
self.items=items;
219221
[self.workingIndicator setHidden:YES];
@@ -326,4 +328,14 @@ - (void)outlineViewSelectionDidChange:(NSNotification*)notification
326328
}
327329
}
328330

331+
332+
#pragma mark - Result filtering
333+
334+
- (IBAction)filterResults:(id)sender
335+
{
336+
if(sender == self.filterResultsSearchField)
337+
{
338+
[self refresh:nil];
339+
}
340+
}
329341
@end

XToDo/XToDoWindowController.xib

100644100755
+28-16
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2-
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5053" systemVersion="13C64" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
2+
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7528.3" systemVersion="14C1514" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
33
<dependencies>
4-
<deployment defaultVersion="1080" identifier="macosx"/>
5-
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5053"/>
4+
<deployment identifier="macosx"/>
5+
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7528.3"/>
66
</dependencies>
77
<objects>
88
<customObject id="-2" userLabel="File's Owner" customClass="XToDoWindowController">
99
<connections>
10+
<outlet property="filterResultsSearchField" destination="ab7-DL-Ufn" id="Es3-AX-5qb"/>
1011
<outlet property="listView" destination="IEj-77-EWU" id="htK-fg-Mgu"/>
1112
<outlet property="window" destination="1" id="3"/>
1213
<outlet property="workingIndicator" destination="LeC-Ui-Mbv" id="NsN-U2-NNt"/>
1314
</connections>
1415
</customObject>
1516
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
16-
<customObject id="-3" userLabel="Application"/>
17+
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
1718
<window title="ToDo List" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="1" customClass="NSPanel">
1819
<windowStyleMask key="styleMask" titled="YES" closable="YES" resizable="YES" texturedBackground="YES"/>
1920
<windowCollectionBehavior key="collectionBehavior" moveToActiveSpace="YES" transient="YES" fullScreenAuxiliary="YES"/>
@@ -25,17 +26,29 @@
2526
<rect key="frame" x="0.0" y="0.0" width="320" height="400"/>
2627
<autoresizingMask key="autoresizingMask"/>
2728
<subviews>
28-
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="24" horizontalPageScroll="10" verticalLineScroll="24" verticalPageScroll="10" usesPredominantAxisScrolling="NO" id="GTU-oT-VnD">
29-
<rect key="frame" x="0.0" y="0.0" width="320" height="400"/>
29+
<searchField wantsLayer="YES" verticalHuggingPriority="750" id="ab7-DL-Ufn">
30+
<rect key="frame" x="1" y="380" width="317" height="22"/>
31+
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
32+
<searchFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" borderStyle="bezel" placeholderString="Filter results" usesSingleLineMode="YES" bezelStyle="round" sendsSearchStringImmediately="YES" maximumRecents="10" id="s1O-JS-boD">
33+
<font key="font" metaFont="system"/>
34+
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
35+
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
36+
</searchFieldCell>
37+
<connections>
38+
<action selector="filterResults:" target="-2" id="o3r-MP-Jvc"/>
39+
</connections>
40+
</searchField>
41+
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="26" horizontalPageScroll="10" verticalLineScroll="26" verticalPageScroll="10" usesPredominantAxisScrolling="NO" id="GTU-oT-VnD">
42+
<rect key="frame" x="0.0" y="0.0" width="320" height="378"/>
3043
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
31-
<clipView key="contentView" id="d4x-zJ-UU4">
44+
<clipView key="contentView" drawsBackground="NO" id="d4x-zJ-UU4">
3245
<rect key="frame" x="0.0" y="0.0" width="320" height="400"/>
3346
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
3447
<subviews>
35-
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="sourceList" multipleSelection="NO" autosaveColumns="NO" rowHeight="24" rowSizeStyle="systemDefault" viewBased="YES" indentationPerLevel="16" outlineTableColumn="poP-lE-uPQ" id="IEj-77-EWU">
36-
<rect key="frame" x="0.0" y="0.0" width="320" height="400"/>
48+
<outlineView appearanceType="vibrantLight" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="sourceList" multipleSelection="NO" autosaveColumns="NO" rowHeight="24" rowSizeStyle="systemDefault" viewBased="YES" indentationPerLevel="16" outlineTableColumn="poP-lE-uPQ" id="IEj-77-EWU">
49+
<rect key="frame" x="0.0" y="0.0" width="320" height="0.0"/>
3750
<autoresizingMask key="autoresizingMask"/>
38-
<size key="intercellSpacing" width="3" height="0.0"/>
51+
<size key="intercellSpacing" width="3" height="2"/>
3952
<color key="backgroundColor" name="_sourceListBackgroundColor" catalog="System" colorSpace="catalog"/>
4053
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
4154
<tableColumns>
@@ -79,19 +92,17 @@
7992
</connections>
8093
</outlineView>
8194
</subviews>
82-
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
95+
<nil key="backgroundColor"/>
8396
</clipView>
8497
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="ubv-eb-ya8">
85-
<rect key="frame" x="0.0" y="-16" width="0.0" height="16"/>
8698
<autoresizingMask key="autoresizingMask"/>
8799
</scroller>
88100
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="1HN-5v-iEX">
89-
<rect key="frame" x="-16" y="0.0" width="16" height="0.0"/>
90101
<autoresizingMask key="autoresizingMask"/>
91102
</scroller>
92103
</scrollView>
93104
<progressIndicator hidden="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" id="LeC-Ui-Mbv">
94-
<rect key="frame" x="292" y="382" width="16" height="16"/>
105+
<rect key="frame" x="292" y="362" width="16" height="16"/>
95106
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
96107
</progressIndicator>
97108
</subviews>
@@ -132,11 +143,12 @@
132143
<connections>
133144
<outlet property="delegate" destination="-2" id="4"/>
134145
</connections>
146+
<point key="canvasLocation" x="149" y="435"/>
135147
</window>
136148
</objects>
137149
<resources>
138150
<image name="NSFolder" width="32" height="32"/>
139-
<image name="NSFollowLinkFreestandingTemplate" width="10" height="10"/>
140-
<image name="NSMenuOnStateTemplate" width="11" height="11"/>
151+
<image name="NSFollowLinkFreestandingTemplate" width="14" height="14"/>
152+
<image name="NSMenuOnStateTemplate" width="12" height="12"/>
141153
</resources>
142154
</document>

XToDoApp/XToDoApp-Prefix.pch

100644100755
+3
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,7 @@
66

77
#ifdef __OBJC__
88
#import <Cocoa/Cocoa.h>
9+
10+
// Import common class additions
11+
#import "NSString+Additions.h"
912
#endif

0 commit comments

Comments
 (0)