global search now is background threaded w/ overlay

reset color on auth prompt
This commit is contained in:
Patrick Wardle
2016-12-05 21:46:30 -10:00
parent b35dd8a625
commit 623b1fb458
12 changed files with 304 additions and 310 deletions
+38 -7
View File
@@ -1641,8 +1641,11 @@ bail:
@synchronized(self.taskTableController.filteredItems)
{
//remove prev
[self.taskTableController.filteredItems removeAllObjects];
//normal filter
[self.filterObj filterTasks:search.string items:self.taskEnumerator.tasks results:self.taskTableController.filteredItems];
[self.filterObj filterTasks:search.string items:self.taskEnumerator.tasks results:self.taskTableController.filteredItems pane:PANE_TOP];
}
@@ -1679,6 +1682,9 @@ bail:
//get segment tag
segmentTag = [[self.bottomPaneBtn selectedCell] tagForSegment:[self.bottomPaneBtn selectedSegment]];
//remove all filtered tasks
[self.bottomViewController.filteredItems removeAllObjects];
//get item
// ->will bail if item isn't in (current) view, etc
switch(segmentTag)
@@ -1687,7 +1693,7 @@ bail:
case DYLIBS_VIEW:
{
//normal filter
[self.filterObj filterFiles:search.string items:self.currentTask.dylibs results:self.bottomViewController.filteredItems];
[self.filterObj filterFiles:search.string items:self.currentTask.dylibs results:self.bottomViewController.filteredItems pane:PANE_BOTTOM];
break;
}
@@ -1696,7 +1702,7 @@ bail:
case FILES_VIEW:
{
//filter
[self.filterObj filterFiles:search.string items:self.currentTask.files results:self.bottomViewController.filteredItems];
[self.filterObj filterFiles:search.string items:self.currentTask.files results:self.bottomViewController.filteredItems pane:PANE_BOTTOM];
break;
}
@@ -1882,7 +1888,7 @@ bail:
}
}
//bottom pane (dylibs, files, etc)
else
else if(PANE_BOTTOM == pane)
{
//always reload item (bottom) pane
[self.bottomViewController.itemView reloadData];
@@ -2200,6 +2206,12 @@ bail:
//filter string
NSString* filterString = nil;
//tag
NSUInteger segmentTag = 0;
//alert box
NSAlert* noKeywordsAlert = nil;
//extract filter
filterString = textView.textStorage.string;
@@ -2219,7 +2231,7 @@ bail:
[self finalizeFiltration:PANE_TOP];
//filter
[self.filterObj filterTasks:filterString items:self.taskEnumerator.tasks results:self.taskTableController.filteredItems];
[self.filterObj filterTasks:filterString items:self.taskEnumerator.tasks results:self.taskTableController.filteredItems pane:PANE_TOP];
}
//refresh/update UI when not a keyword search
@@ -2234,10 +2246,29 @@ bail:
// ->just dylibs
else if(textView == self.customItemsFilter)
{
//get segment tag
segmentTag = [[self.bottomPaneBtn selectedCell] tagForSegment:[self.bottomPaneBtn selectedSegment]];
//check if keyword was entered for files/networks
if(segmentTag != DYLIBS_VIEW)
{
//alloc/init alert
noKeywordsAlert = [NSAlert alertWithMessageText:@"#keywords not (yet) supported for files/connections" defaultButton:@"Ok" alternateButton:nil otherButton:nil informativeTextWithFormat:@""];
//and show it
[noKeywordsAlert runModal];
//reset search
self.filterItemsBox.stringValue = @"";
//bail
goto bail;
}
//set flag
self.bottomViewController.isFiltered = YES;
@synchronized (self.bottomViewController.filteredItems)
@synchronized(self.bottomViewController.filteredItems)
{
//remove all filtered tasks
[self.bottomViewController.filteredItems removeAllObjects];
@@ -2246,7 +2277,7 @@ bail:
[self finalizeFiltration:PANE_BOTTOM];
//filter
[self.filterObj filterFiles:filterString items:self.currentTask.dylibs results:self.bottomViewController.filteredItems];
[self.filterObj filterFiles:filterString items:self.currentTask.dylibs results:self.bottomViewController.filteredItems pane:PANE_BOTTOM];
}
//refresh/update UI when not a keyword search
+5 -1
View File
@@ -179,6 +179,9 @@
//bottom pane
#define PANE_BOTTOM 0x1
//search pane
#define PANE_SEARCH 0x2
//for prefs
//#define PREF_FIRST_RUN @"isFirstRun"
@@ -311,8 +314,9 @@
//delta for pid tag
#define PID_TAG_DELTA 1000
//TODO: change back
//search wait time (from app's launch)
#define SEARCH_WAIT_TIME 45
#define SEARCH_WAIT_TIME 10
//pls wait (search) message
#define PLS_WAIT_MESSAGE @"completing (initial) task/dylib/file enumeration please wait"
+6 -2
View File
@@ -46,11 +46,15 @@
//keyword filter '#notfound'
-(BOOL)notFound:(Binary*)item;
//filter all for global search
// ->tasks, dylibs, files, & connections
-(void)filterAll:(NSString*)filterText items:(NSMutableDictionary*)items results:(NSMutableArray*)results;
//filter tasks
-(void)filterTasks:(NSString*)filterText items:(NSMutableDictionary*)items results:(NSMutableArray*)results;
-(void)filterTasks:(NSString*)filterText items:(NSMutableDictionary*)items results:(NSMutableArray*)results pane:(NSUInteger)pane;
//filter dylibs and files
-(void)filterFiles:(NSString*)filterText items:(NSMutableArray*)items results:(NSMutableArray*)results;
-(void)filterFiles:(NSString*)filterText items:(NSMutableArray*)items results:(NSMutableArray*)results pane:(NSUInteger)pane;
//filter network connections
-(void)filterConnections:(NSString*)filterText items:(NSMutableArray*)items results:(NSMutableArray*)results;
+140 -52
View File
@@ -29,9 +29,6 @@ NSString * const BINARY_KEYWORDS[] = {@"#apple", @"#nonapple", @"#signed", @"#un
self = [super init];
if(nil != self)
{
//alloc file filter keywords
//fileFilters = [NSMutableArray array];
//alloc binary filter keywords
binaryFilters = [NSMutableArray array];
@@ -53,35 +50,121 @@ NSString * const BINARY_KEYWORDS[] = {@"#apple", @"#nonapple", @"#signed", @"#un
return [self.binaryFilters containsObject:searchString];
}
//filter all for global search
// ->tasks, dylibs, files, & connections
-(void)filterAll:(NSString*)filterText items:(NSMutableDictionary*)items results:(NSMutableArray*)results
{
//flag
BOOL isKeyword = NO;
//matching tasks
NSMutableArray* matchingTasks = nil;
//matching dylibs
NSMutableArray* matchingDylibs = nil;
//matching files
NSMutableArray* matchingFiles = nil;
//matching connections
NSMutableArray* matchingConnections = nil;
//alloc array for matching tasks
matchingTasks = [NSMutableArray array];
//alloc array for matching dylibs
matchingDylibs = [NSMutableArray array];
//alloc dictionary for matching files
matchingFiles = [NSMutableArray array];
//alloc dictionary for matching connections
matchingConnections = [NSMutableArray array];
//set flag
isKeyword = [self isKeyword:filterText];
//filter all tasks
[self filterTasks:filterText items:items results:matchingTasks pane:PANE_SEARCH];
//iterate over all tasks
// ->for each, filter their dylib, files, etc
for(Task* task in items.allValues)
{
//filter dylibs
[self filterFiles:filterText items:task.dylibs results:matchingDylibs pane:PANE_SEARCH];
//when keyword search
// ->skip files/connections
if(YES == isKeyword)
{
//skip
continue;
}
//filter files
[self filterFiles:filterText items:task.files results:matchingFiles pane:PANE_SEARCH];
//filter connections
[self filterFiles:filterText items:task.connections results:matchingConnections pane:PANE_SEARCH];
}
//remove duplicate dylibs
[results setArray:[[[NSSet setWithArray:results] allObjects] mutableCopy]];
//call back into search object to refresh it's UI and show results
dispatch_async(dispatch_get_main_queue(), ^{
//search done!
[((AppDelegate*)[[NSApplication sharedApplication] delegate]).searchWindowController completeSearch];
});
return;
}
//filter tasks
// ->name, path, pid
-(void)filterTasks:(NSString*)filterText items:(NSMutableDictionary*)items results:(NSMutableArray*)results
-(void)filterTasks:(NSString*)filterText items:(NSMutableDictionary*)items results:(NSMutableArray*)results pane:(NSUInteger)pane
{
//task
Task* task = nil;
//first reset any previous filter'd items
[results removeAllObjects];
//process #keyword filtering
// ->note: already checked its a full/matching keyword
if(YES == [filterText hasPrefix:@"#"])
{
//prep UI for filtering
// ->config/show overlay, etc
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) prepUIForFiltering:PANE_TOP];
if(PANE_SEARCH != pane)
{
//prep UI
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) prepUIForFiltering:pane];
}
//in background filter by keyword
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//nap a 1/2second to let message show up
[NSThread sleepForTimeInterval:0.5];
//when main thread
// ->do #keyword in background
if(YES == [NSThread isMainThread])
{
//in background filter by keyword
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//nap a 1/2second to let message show up
[NSThread sleepForTimeInterval:0.5];
//filter
// ->calls back in UI to refresh when done!
[self filterByKeyword:(NSString*)filterText items:items.allValues results:(NSMutableArray*)results pane:pane];
});
}
//already in background
// ->just run on current thread
else
{
//filter
// ->calls back in UI to refresh when done!
[self filterByKeyword:(NSString*)filterText items:items.allValues results:(NSMutableArray*)results];
});
[self filterByKeyword:(NSString*)filterText items:items.allValues results:(NSMutableArray*)results pane:pane];
}
}
//not keyword
@@ -142,11 +225,8 @@ NSString * const BINARY_KEYWORDS[] = {@"#apple", @"#nonapple", @"#signed", @"#un
//filter tasks
// ->name, path, pid
-(void)filterByKeyword:(NSString*)filterText items:(NSArray*)items results:(NSMutableArray*)results
-(void)filterByKeyword:(NSString*)filterText items:(NSArray*)items results:(NSMutableArray*)results pane:(NSUInteger)pane
{
//pane
NSUInteger pane = PANE_TOP;
//sync
@synchronized(items)
{
@@ -160,9 +240,6 @@ NSString * const BINARY_KEYWORDS[] = {@"#apple", @"#nonapple", @"#signed", @"#un
//handle tasks
if(YES == [items.firstObject isKindOfClass:[Task class]])
{
//set pane
pane = PANE_TOP;
//iterate over all items
for(id item in items)
{
@@ -177,9 +254,6 @@ NSString * const BINARY_KEYWORDS[] = {@"#apple", @"#nonapple", @"#signed", @"#un
//handle dylibs
else if(YES == [items.firstObject isKindOfClass:[Binary class]])
{
//set pane
pane = PANE_BOTTOM;
//iterate over all items
for(id item in items)
{
@@ -195,12 +269,16 @@ NSString * const BINARY_KEYWORDS[] = {@"#apple", @"#nonapple", @"#signed", @"#un
} //sync
//tell the UI we are done
dispatch_async(dispatch_get_main_queue(), ^{
//finalize UI
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) finalizeFiltration:pane];
});
if(PANE_SEARCH != pane)
{
//on main thread, update UI
dispatch_async(dispatch_get_main_queue(), ^{
//finalize UI
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) finalizeFiltration:pane];
});
}
//bail
bail:
@@ -210,11 +288,8 @@ bail:
//filter dylibs and files
// ->name and path
-(void)filterFiles:(NSString*)filterText items:(NSMutableArray*)items results:(NSMutableArray*)results
-(void)filterFiles:(NSString*)filterText items:(NSMutableArray*)items results:(NSMutableArray*)results pane:(NSUInteger)pane
{
//first reset filter'd items
[results removeAllObjects];
//process #keyword filtering for dylibs
// ->note: already checked its a full/matching keyword
if( (YES == [filterText hasPrefix:@"#"]) &&
@@ -222,19 +297,35 @@ bail:
{
//prep UI for filtering
// ->config/show overlay, etc
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) prepUIForFiltering:PANE_BOTTOM];
if(PANE_SEARCH != pane)
{
//prep UI
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) prepUIForFiltering:pane];
}
//in background filter by keyword
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//nap a 1/2second to let message show up
[NSThread sleepForTimeInterval:0.5];
//when main thread
// ->do #keyword search in background
if(YES == [NSThread isMainThread])
{
//in background filter by keyword
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//nap a 1/2second to let message show up
[NSThread sleepForTimeInterval:0.5];
//filter
// ->calls back in UI to refresh when done!
[self filterByKeyword:(NSString*)filterText items:items results:(NSMutableArray*)results pane:pane];
});
}
//already in background
// ->just run on current thread
else
{
//filter
// ->calls back in UI to refresh when done!
[self filterByKeyword:(NSString*)filterText items:items results:(NSMutableArray*)results];
});
[self filterByKeyword:(NSString*)filterText items:items results:(NSMutableArray*)results pane:pane];
}
}
//not keyword
@@ -283,9 +374,6 @@ bail:
//filter network connections
-(void)filterConnections:(NSString*)filterText items:(NSMutableArray*)items results:(NSMutableArray*)results
{
//first reset filter'd items
[results removeAllObjects];
//sync
@synchronized(items)
{
+3
View File
@@ -117,6 +117,9 @@
//end w/ NULL
installArgs[3] = NULL;
//reset text color
self.statusMsg.textColor = [NSColor blackColor];
//create authorization ref
osStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef);
if(errAuthorizationSuccess != osStatus)
+3
View File
@@ -69,5 +69,8 @@
//search
-(void)search;
//callback for when searching is done
// ->update UI by removing overlay and reloading table
-(void)completeSearch;
@end
+80 -216
View File
@@ -145,36 +145,9 @@
//calc time remaining
timeRemaining = SEARCH_WAIT_TIME - (currentTime - ((AppDelegate*)[[NSApplication sharedApplication] delegate]).startTime);
//pre-req
[self.overlayView setWantsLayer:YES];
//rounded corners
self.overlayView.layer.cornerRadius = 20.0;
//maks
self.overlayView.layer.masksToBounds = YES;
//set overlay's view color to black
self.overlayView.layer.backgroundColor = [NSColor blackColor].CGColor;
//make it semi-transparent
self.overlayView.alphaValue = 0.20;
//show overlay
self.overlayView.hidden = NO;
//disable search box
self.searchBox.enabled = NO;
//show activity indicator
[self.activityIndicator setHidden:NO];
//show activity indicator label
self.activityIndicatorLabel.hidden = NO;
//start spinner
[self.activityIndicator startAnimation:nil];
[self showOverlay];
//update w/ time
self.activityIndicatorLabel.stringValue = [NSString stringWithFormat:@"%@ (%d)", PLS_WAIT_MESSAGE, (int)timeRemaining];
@@ -185,6 +158,64 @@
return;
}
//display the overlay
-(void)showOverlay
{
//pre-req
[self.overlayView setWantsLayer:YES];
//rounded corners
self.overlayView.layer.cornerRadius = 20.0;
//maks
self.overlayView.layer.masksToBounds = YES;
//set overlay's view color to black
self.overlayView.layer.backgroundColor = [NSColor blackColor].CGColor;
//make it semi-transparent
self.overlayView.alphaValue = 0.20;
//show overlay
self.overlayView.hidden = NO;
//disable search box
self.searchBox.enabled = NO;
//show activity indicator
[self.activityIndicator setHidden:NO];
//show activity indicator label
self.activityIndicatorLabel.hidden = NO;
//start spinner
[self.activityIndicator startAnimation:nil];
return;
}
//callback for when searching is done
// ->update UI by removing overlay and reloading table
-(void)completeSearch
{
//hide overlay
self.overlayView.hidden = YES;
//hide activity indicator
self.activityIndicator.hidden = YES;
//hide activity indicator label
self.activityIndicatorLabel.hidden = YES;
//enable search box
self.searchBox.enabled = YES;
//reload table
[self.searchTable reloadData];
return;
}
//thread function
// ->wait until task enumeration is done, then allow user to search
-(void)waitTillPau
@@ -479,7 +510,7 @@ bail:
return;
}
//search
//do the search
-(void)search
{
//search string
@@ -488,39 +519,6 @@ bail:
//all tasks
OrderedDictionary* allTasks = nil;
//matching items
NSMutableArray* matchingItems = nil;
//matching tasks
NSMutableArray* matchingTasks = nil;
//matching dylibs
NSMutableDictionary* matchingDylibs = nil;
//matching files
NSMutableDictionary* matchingFiles = nil;
//matching connections
NSMutableDictionary* matchingConnections = nil;
//task
Task* task = nil;
//alloc array for matching items
matchingItems = [NSMutableArray array];
//alloc array for matching tasks
matchingTasks = [NSMutableArray array];
//alloc dictionary for matching dylibs
matchingDylibs = [NSMutableDictionary dictionary];
//alloc dictionary for matching files
matchingFiles = [NSMutableDictionary dictionary];
//alloc dictionary for matching connections
matchingConnections = [NSMutableDictionary dictionary];
//reset search results
[self.searchResults removeAllObjects];
@@ -531,166 +529,32 @@ bail:
//grab search string
searchString = [self.searchBox stringValue];
//show overlay
[self showOverlay];
//config it
self.activityIndicatorLabel.stringValue = [NSString stringWithFormat:@"searching (%@)", searchString];
//disable search input box
self.searchBox.enabled = NO;
//grab all tasks
allTasks = ((AppDelegate*)[[NSApplication sharedApplication] delegate]).taskEnumerator.tasks;
// ->make copy to avoid threading issues
allTasks = [((AppDelegate*)[[NSApplication sharedApplication] delegate]).taskEnumerator.tasks copy];
//'#' indicates a keyword search
// ->check for keyword match, then filter by keyword
if(YES == [searchString hasPrefix:@"#"])
{
//ignore #search strings that don't match a keyword
if(YES != [filterObj isKeyword:searchString])
{
//ignore
goto bail;
}
}
//1st: search for all matching tasks
//search for all matching tasks
[self.filterObj filterTasks:searchString items:allTasks results:matchingTasks];
//add all tasks
[self.searchResults addObjectsFromArray:matchingTasks];
//refresh table to display task matches
[self.searchTable reloadData];
//2nd: search for all matching dylibs
//sync
@synchronized(allTasks)
{
//reset
[matchingItems removeAllObjects];
//walk all tasks
// ->scan each for dylib matches, only processing first match
for(NSNumber* taskPid in allTasks)
{
//extract task
task = allTasks[taskPid];
//filter
[self.filterObj filterFiles:searchString items:task.dylibs results:matchingItems];
//process all matching dylibs
// ->but first check if processed due to matching in another task already
for(Binary* dylib in matchingItems)
{
//ignore if already seen/processed
if(nil != matchingDylibs[dylib.path])
{
//skip
continue;
}
//process
[self.searchResults addObject:dylib];
//save
matchingDylibs[dylib.path] = dylib;
}
}//all tasks
//kick off filtering in background
// ->will call back into to refresh UI when done
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
}//sync
//nap to allow message to show
[NSThread sleepForTimeInterval:0.5];
//refresh table to display dylib
[self.searchTable reloadData];
//3rd: search for all matching files
//sync
@synchronized(allTasks)
{
//reset
[matchingItems removeAllObjects];
//filter
[self.filterObj filterAll:searchString items:allTasks results:self.searchResults];
//walk all tasks
// ->scan each for file matches, only processing first match
for(NSNumber* taskPid in allTasks)
{
//extract task
task = allTasks[taskPid];
//filter
[self.filterObj filterFiles:searchString items:task.files results:matchingItems];
//process all matching dylibs
// ->but first check if processed due to matching in another task already
for(File* file in matchingItems)
{
//ignore if already seen/processed
if(nil != matchingFiles[file.path])
{
//skip
continue;
}
//process
[self.searchResults addObject:file];
//save
matchingFiles[file.path] = file;
}
}//all tasks
}//sync
//refresh table to display dylib
[self.searchTable reloadData];
//4th: search for all matching network comms
//sync
@synchronized(allTasks)
{
//reset
[matchingItems removeAllObjects];
//walk all tasks
// ->scan each for connections matches, only processing first match
for(NSNumber* taskPid in allTasks)
{
//extract task
task = allTasks[taskPid];
//filter
[self.filterObj filterConnections:searchString items:task.connections results:matchingItems];
//process all matching connections
// ->but first check if processed due to matching in another task already
for(Connection* connection in matchingItems)
{
//ignore if already seen/processed
if(nil != matchingConnections[connection.endpoints])
{
//skip
continue;
}
//process
[self.searchResults addObject:connection];
//save
matchingConnections[connection.endpoints] = connection;
}
}//all tasks
}//sync
//refresh table to display dylib
[self.searchTable reloadData];
//bail
bail:
});
return;
}
//invoked when the user clicks 'virus total' icon
-1
View File
@@ -23,7 +23,6 @@
@implementation TaskEnumerator
//@synthesize files;
@synthesize tasks;
@synthesize dylibs;
@synthesize binaryQueue;
+20 -24
View File
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11542" systemVersion="16B2555" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11201"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11542"/>
<capability name="Alignment constraints to the first baseline" minToolsVersion="6.0"/>
<capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="TaskTableController">
@@ -66,10 +67,7 @@
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="unknown" id="2ru-B9-6b1"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="ryD-lC-8IR">
<rect key="frame" x="46" y="20" width="1103" height="19"/>
<constraints>
<constraint firstAttribute="width" constant="1099" id="wO6-VJ-u2U"/>
</constraints>
<rect key="frame" x="46" y="20" width="1148" height="19"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Task Name" id="fEY-SM-ufc">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -103,7 +101,7 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" tag="101" translatesAutoresizingMaskIntoConstraints="NO" id="miW-QO-gna">
<rect key="frame" x="31" y="2" width="1168" height="21"/>
<rect key="frame" x="31" y="2" width="1163" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="iDn-3d-0cR"/>
</constraints>
@@ -175,7 +173,7 @@
<constraint firstItem="miW-QO-gna" firstAttribute="leading" secondItem="cG6-PF-La2" secondAttribute="trailing" constant="7" id="J3y-8b-F3q"/>
<constraint firstItem="ryD-lC-8IR" firstAttribute="top" secondItem="sdY-t5-tbW" secondAttribute="top" constant="1" id="Lbj-0c-fph"/>
<constraint firstItem="aPz-9H-xyy" firstAttribute="baseline" secondItem="gpF-bM-EQR" secondAttribute="baseline" id="Pki-Ta-dyF"/>
<constraint firstItem="aPz-9H-xyy" firstAttribute="leading" secondItem="miW-QO-gna" secondAttribute="trailing" constant="3" id="Uzg-uC-v3U"/>
<constraint firstItem="aPz-9H-xyy" firstAttribute="leading" secondItem="miW-QO-gna" secondAttribute="trailing" constant="8" id="Uzg-uC-v3U"/>
<constraint firstItem="aPz-9H-xyy" firstAttribute="baseline" secondItem="MqO-G8-w9L" secondAttribute="baseline" id="Vc5-aU-ZbM"/>
<constraint firstItem="gpF-bM-EQR" firstAttribute="leading" secondItem="MqO-G8-w9L" secondAttribute="trailing" constant="17" id="YUh-1b-zZn"/>
<constraint firstAttribute="trailing" secondItem="gpF-bM-EQR" secondAttribute="trailing" constant="20" id="ZwL-8K-oUV"/>
@@ -184,7 +182,7 @@
<constraint firstItem="ryD-lC-8IR" firstAttribute="leading" secondItem="M2y-fe-Zb7" secondAttribute="trailing" constant="4" id="pFh-5j-5D1"/>
<constraint firstAttribute="trailing" secondItem="Y4J-KD-8iy" secondAttribute="trailing" constant="20" id="qVu-zJ-0T1"/>
<constraint firstItem="M2y-fe-Zb7" firstAttribute="leading" secondItem="cG6-PF-La2" secondAttribute="trailing" constant="7" id="sEJ-g2-oVP"/>
<constraint firstItem="Dtg-ac-EVZ" firstAttribute="leading" secondItem="ryD-lC-8IR" secondAttribute="trailing" constant="58" id="sdA-ud-S6g"/>
<constraint firstItem="Dtg-ac-EVZ" firstAttribute="leading" secondItem="ryD-lC-8IR" secondAttribute="trailing" constant="13" id="sdA-ud-S6g"/>
<constraint firstAttribute="bottom" secondItem="miW-QO-gna" secondAttribute="bottom" constant="2" id="vBh-4c-GNV"/>
</constraints>
<connections>
@@ -204,9 +202,8 @@
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="unknown" id="tuX-G4-1az"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="kE0-h4-XoU">
<rect key="frame" x="26" y="20" width="1000" height="19"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="kE0-h4-XoU">
<rect key="frame" x="26" y="20" width="1168" height="19"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Dylib Name" id="BA3-2m-roK">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -303,6 +300,9 @@
<constraints>
<constraint firstItem="mKM-Ea-CdX" firstAttribute="leading" secondItem="s79-UC-kl8" secondAttribute="trailing" constant="8" id="0SL-Ue-D05"/>
<constraint firstItem="s79-UC-kl8" firstAttribute="top" secondItem="bgG-DR-RMT" secondAttribute="bottom" id="6Ek-CH-ceb"/>
<constraint firstItem="FC1-IO-3xs" firstAttribute="leading" secondItem="kE0-h4-XoU" secondAttribute="trailing" constant="13" id="AhI-Ot-vpj"/>
<constraint firstItem="kE0-h4-XoU" firstAttribute="top" secondItem="AMp-Sl-IUz" secondAttribute="top" constant="1" id="Ga8-kH-3D8"/>
<constraint firstItem="kE0-h4-XoU" firstAttribute="leading" secondItem="bgG-DR-RMT" secondAttribute="trailing" constant="4" id="Inm-s6-Ltk"/>
<constraint firstItem="d6d-We-r4h" firstAttribute="top" secondItem="Nvb-5R-deG" secondAttribute="bottom" constant="1" id="MR2-Mt-7Qr"/>
<constraint firstItem="s79-UC-kl8" firstAttribute="leading" secondItem="bgG-DR-RMT" secondAttribute="leading" id="Nmd-bu-WPB"/>
<constraint firstItem="d6d-We-r4h" firstAttribute="leading" secondItem="mKM-Ea-CdX" secondAttribute="trailing" constant="11" id="PCm-qd-72F"/>
@@ -328,10 +328,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="LkX-uS-hKH">
<rect key="frame" x="11" y="20" width="1000" height="19"/>
<constraints>
<constraint firstAttribute="width" constant="996" id="hN6-a0-6o5"/>
</constraints>
<rect key="frame" x="11" y="20" width="1259" height="19"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="File Name" id="fg8-Ix-mHR">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -417,6 +414,7 @@
<constraint firstItem="LkX-uS-hKH" firstAttribute="top" secondItem="zC6-7V-PKY" secondAttribute="top" constant="1" id="eh3-61-z6W"/>
<constraint firstAttribute="trailing" secondItem="yDq-tI-YQJ" secondAttribute="trailing" constant="20" id="igS-YC-KW1"/>
<constraint firstItem="27e-wh-BEp" firstAttribute="leading" secondItem="tIY-Ij-plN" secondAttribute="trailing" constant="18" id="jXy-Fb-Tj8"/>
<constraint firstItem="8Vk-bl-kjr" firstAttribute="leading" secondItem="LkX-uS-hKH" secondAttribute="trailing" constant="8" id="uGy-dm-0W0"/>
</constraints>
<connections>
<outlet property="textField" destination="LkX-uS-hKH" id="XKi-AB-R3o"/>
@@ -435,7 +433,7 @@
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="5ar-gc-DMu"/>
</imageView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" tag="101" translatesAutoresizingMaskIntoConstraints="NO" id="clK-51-yQN">
<rect key="frame" x="31" y="2" width="1278" height="21"/>
<rect key="frame" x="31" y="2" width="1274" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="vJP-Yj-JtN"/>
</constraints>
@@ -446,10 +444,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="t4A-WM-KWO">
<rect key="frame" x="31" y="20" width="1000" height="19"/>
<constraints>
<constraint firstAttribute="width" constant="996" id="249-xb-bIV"/>
</constraints>
<rect key="frame" x="31" y="20" width="1278" height="19"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Network Info" id="Boe-bK-y2E">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -486,12 +481,13 @@
<constraints>
<constraint firstItem="clK-51-yQN" firstAttribute="top" secondItem="vkh-K9-CiP" secondAttribute="top" constant="17" id="3Wk-Ml-AkJ"/>
<constraint firstItem="n84-aN-dS4" firstAttribute="centerY" secondItem="vkh-K9-CiP" secondAttribute="centerY" id="ADP-sg-zrz"/>
<constraint firstItem="ajd-Yb-p6i" firstAttribute="leading" secondItem="t4A-WM-KWO" secondAttribute="trailing" constant="8" id="M2S-fy-HPc"/>
<constraint firstAttribute="trailing" secondItem="YYR-6I-wYA" secondAttribute="trailing" constant="19" id="VBr-Y6-gzg"/>
<constraint firstItem="clK-51-yQN" firstAttribute="baseline" secondItem="YYR-6I-wYA" secondAttribute="firstBaseline" id="cq5-gG-kNL"/>
<constraint firstAttribute="trailing" secondItem="ajd-Yb-p6i" secondAttribute="trailing" constant="21" id="dkh-kB-hLV"/>
<constraint firstItem="YYR-6I-wYA" firstAttribute="top" secondItem="ajd-Yb-p6i" secondAttribute="bottom" constant="1" id="gtv-qN-prM"/>
<constraint firstItem="n84-aN-dS4" firstAttribute="leading" secondItem="vkh-K9-CiP" secondAttribute="leading" constant="5" id="iJH-Aa-QGY"/>
<constraint firstItem="YYR-6I-wYA" firstAttribute="leading" secondItem="clK-51-yQN" secondAttribute="trailing" constant="4" id="jm8-jP-xgx"/>
<constraint firstItem="YYR-6I-wYA" firstAttribute="leading" secondItem="clK-51-yQN" secondAttribute="trailing" constant="8" id="jm8-jP-xgx"/>
<constraint firstItem="clK-51-yQN" firstAttribute="leading" secondItem="t4A-WM-KWO" secondAttribute="leading" id="l5G-L7-hiY"/>
<constraint firstItem="t4A-WM-KWO" firstAttribute="top" secondItem="vkh-K9-CiP" secondAttribute="top" constant="1" id="o6N-cq-p91"/>
<constraint firstItem="clK-51-yQN" firstAttribute="leading" secondItem="n84-aN-dS4" secondAttribute="trailing" constant="2" id="zd5-Ae-yYB"/>
@@ -512,7 +508,7 @@
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" verticalHuggingPriority="750" controlSize="mini" horizontal="YES" id="gmJ-1g-Tah">
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" controlSize="mini" horizontal="YES" id="gmJ-1g-Tah">
<rect key="frame" x="1" y="279" width="1354" height="14"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
@@ -528,7 +524,7 @@
<constraint firstItem="QDh-31-mfl" firstAttribute="top" secondItem="T1P-b9-TzF" secondAttribute="top" id="ouv-e6-7Mv"/>
<constraint firstAttribute="bottom" secondItem="QDh-31-mfl" secondAttribute="bottom" id="t31-0J-wLa"/>
</constraints>
<point key="canvasLocation" x="664.5" y="-658"/>
<point key="canvasLocation" x="664" y="-658"/>
</view>
</objects>
<resources>
+7 -3
View File
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11542" systemVersion="16B2555" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11201"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11542"/>
<capability name="Alignment constraints to the first baseline" minToolsVersion="6.0"/>
<capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="SearchWindowController">
@@ -415,6 +416,10 @@
</textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="YtR-V5-2Zi">
<rect key="frame" x="428" y="105" width="458" height="165"/>
<constraints>
<constraint firstAttribute="height" constant="165" id="1C0-NI-zSF"/>
<constraint firstAttribute="width" constant="458" id="ukQ-qr-9mr"/>
</constraints>
</customView>
<progressIndicator horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="RXw-FP-B7l">
<rect key="frame" x="636" y="196" width="32" height="32"/>
@@ -442,7 +447,6 @@
<constraint firstItem="8GA-gp-lIa" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="-1" id="bVx-kV-QU1"/>
<constraint firstAttribute="centerX" secondItem="Q88-hM-E3W" secondAttribute="centerX" constant="-8" id="dxs-NA-iEU"/>
<constraint firstAttribute="trailing" secondItem="8GA-gp-lIa" secondAttribute="trailing" constant="-1" id="hYI-5Z-VSU"/>
<constraint firstItem="YtR-V5-2Zi" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="428" id="mJj-49-I9e"/>
<constraint firstItem="BB9-Xc-q8T" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" constant="11" id="phr-KT-g4L"/>
<constraint firstItem="BB9-Xc-q8T" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="20" id="sZv-PY-ckN"/>
</constraints>
+2 -4
View File
@@ -77,7 +77,7 @@
<rect key="frame" x="662" y="125" width="32" height="32"/>
</progressIndicator>
<textField hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kIC-ZZ-ldy">
<rect key="frame" x="543" y="210" width="270" height="18"/>
<rect key="frame" x="619" y="210" width="118" height="18"/>
<constraints>
<constraint firstAttribute="height" constant="18" id="f5b-Ls-Iea"/>
</constraints>
@@ -90,9 +90,8 @@
</subviews>
<constraints>
<constraint firstItem="LMT-Bu-FAk" firstAttribute="leading" secondItem="E4M-PF-VD0" secondAttribute="centerX" constant="-16" id="9rN-kn-Kch"/>
<constraint firstItem="LMT-Bu-FAk" firstAttribute="top" secondItem="kIC-ZZ-ldy" secondAttribute="bottom" constant="53" id="DGl-Ls-bej"/>
<constraint firstItem="kIC-ZZ-ldy" firstAttribute="centerX" secondItem="LMT-Bu-FAk" secondAttribute="centerX" id="FHS-PP-sDV"/>
<constraint firstItem="kIC-ZZ-ldy" firstAttribute="leading" secondItem="E4M-PF-VD0" secondAttribute="centerX" constant="-133" id="KMj-fD-TVd"/>
<constraint firstItem="LMT-Bu-FAk" firstAttribute="centerY" secondItem="E4M-PF-VD0" secondAttribute="centerY" id="UJF-bU-Q8q"/>
<constraint firstItem="kIC-ZZ-ldy" firstAttribute="top" secondItem="E4M-PF-VD0" secondAttribute="top" constant="53" id="mO5-9B-M4K"/>
</constraints>
</customView>
@@ -222,7 +221,6 @@
<constraint firstItem="UiZ-UI-inM" firstAttribute="leading" secondItem="372" secondAttribute="leading" constant="49" id="hIv-ki-dG5"/>
<constraint firstItem="gtq-gn-VPL" firstAttribute="leading" secondItem="372" secondAttribute="centerX" constant="-109" id="iUK-4W-mmK"/>
<constraint firstAttribute="trailing" secondItem="bNA-gy-9Ta" secondAttribute="trailing" constant="8" id="k4n-CB-LFx"/>
<constraint firstItem="joB-SY-vJU" firstAttribute="leading" secondItem="372" secondAttribute="leading" constant="500" id="mN5-g8-i4v"/>
<constraint firstItem="TNF-7q-Loy" firstAttribute="top" secondItem="372" secondAttribute="top" constant="-1" id="n5l-e4-yQi"/>
<constraint firstItem="UiZ-UI-inM" firstAttribute="leading" secondItem="hum-Mj-cDd" secondAttribute="trailing" constant="12" id="nDs-Pe-WqU"/>
<constraint firstItem="UiZ-UI-inM" firstAttribute="baseline" secondItem="hum-Mj-cDd" secondAttribute="baseline" id="oG8-Ak-Yjt"/>