mirror of
https://github.com/objective-see/TaskExplorer.git
synced 2026-03-22 07:02:39 +00:00
global search now is background threaded w/ overlay
reset color on auth prompt
This commit is contained in:
+38
-7
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
|
||||
@implementation TaskEnumerator
|
||||
|
||||
//@synthesize files;
|
||||
@synthesize tasks;
|
||||
@synthesize dylibs;
|
||||
@synthesize binaryQueue;
|
||||
|
||||
BIN
Binary file not shown.
+20
-24
@@ -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
@@ -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>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
Reference in New Issue
Block a user