global search window logic (work in progress!)

This commit is contained in:
Patrick Wardle
2015-08-18 21:59:25 -10:00
parent 9c632982ac
commit 197c40908a
15 changed files with 1282 additions and 39 deletions
+4
View File
@@ -18,6 +18,7 @@
#import "FlaggedItems.h"
#import "ResultsWindowController.h"
#import "RequestRootWindowController.h"
#import "SearchWindowController.h"
#import "Task.h"
@@ -108,6 +109,9 @@
//about window controller
@property(nonatomic, retain)AboutWindowController* aboutWindowController;
//search window controller
@property(nonatomic, retain)SearchWindowController* searchWindowController;
//results window controller
@property(nonatomic, retain)ResultsWindowController* resultsWindowController;
+37 -22
View File
@@ -32,6 +32,11 @@
//TODO: show 'from where' via quarantine attrz
//TODO: show user (after pid): -> (pid, user)?
//TODO: when filtering, and then refresh, doesn't go to row #0 :/
//TODO: check if VT can be reached! if not, error? or don't show '0 VT results detected' etc...
//TODO: JavaW (iWorm) dylibs...
//TODO: remove task, remove from taskEnum's global list for executables, and dylibs, etc
//TODO: also refresh!....
@implementation AppDelegate
@@ -51,6 +56,7 @@
@synthesize requestRootWindowController;
@synthesize taskViewFormat;
@synthesize flagItemsWindowController;
@synthesize searchWindowController;
@synthesize scannerThread;
@synthesize progressIndicator;
@@ -63,11 +69,6 @@
@synthesize flaggedItems;
//@synthesize taskScrollView;
//TODO: check if VT can be reached! if not, error? or don't show '0 VT results detected' etc...
//TODO: JavaW (iWorm) dylibs...
//center window
// ->also make front
-(void)awakeFromNib
@@ -88,9 +89,10 @@
// ->main entry point
-(void)applicationDidFinishLaunching:(NSNotification *)notification
{
//TODO: re-enable
//first thing...
// ->install exception handlers!
installExceptionHandlers();
//installExceptionHandlers();
//init virus total object
virusTotalObj = [[VirusTotal alloc] init];
@@ -326,8 +328,9 @@ bail:
// ->waits until window is non-nil
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//TODO: re-enable
//make modal
makeModal(self.requestRootWindowController);
//makeModal(self.requestRootWindowController);
});
@@ -1146,17 +1149,31 @@ bail:
//automatically invoked when user clicks 'search' button
// ->perform global search
//TODO: implement (in next version)
- (IBAction)search:(id)sender
-(IBAction)search:(id)sender
{
//'unimplemented' msg
NSAlert* errorPopup = nil;
//alloc/init flagged items window
if(nil == self.searchWindowController)
{
//alloc/init
searchWindowController = [[SearchWindowController alloc] initWithWindowNibName:@"SearchWindow"];
}
//init popup w/ msg
errorPopup = [NSAlert alertWithMessageText:@"sorry, 'global search' not yet implemented" defaultButton:@"Ok" alternateButton:nil otherButton:nil informativeTextWithFormat:@"...should be in next version :)"];
//init/prep it
[self.searchWindowController prepare];
//and show it
[errorPopup runModal];
//show it
[self.searchWindowController showWindow:self];
/*
//invoke function in background that will make window modal
// ->waits until window is non-nil
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//make modal
//makeModal(self.searchWindowController);
});
*/
return;
}
@@ -1735,7 +1752,7 @@ bail:
//show flagged items
else
{
//alloc/init settings window
//alloc/init flagged items window
if(nil == self.flagItemsWindowController)
{
//alloc/init
@@ -1745,20 +1762,18 @@ bail:
//show it
[self.flagItemsWindowController showWindow:self];
/*
//invoke function in background that will make window modal
// ->waits until window is non-nil
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//make modal
makeModal(self.prefsWindowController);
makeModal(self.flagItemsWindowController);
});
*/
}
//NSLog(@"would show flagged items");
return;
}
-1
View File
@@ -116,7 +116,6 @@ NSString * const KEYWORDS[] = {@"#apple", @"#nonapple", @"#signed", @"#unsigned"
}
//filter dylibs and files
// ->name and path
-(void)filterFiles:(NSString*)filterText items:(NSMutableArray*)items results:(NSMutableArray*)results
+1 -1
View File
@@ -3,7 +3,7 @@
// TaskExplorer
//
// Created by Patrick Wardle on 8/14/15.
// Copyright (c) 2015 Lucas Derraugh. All rights reserved.
// Copyright (c) 2015 Objective-See. All rights reserved.
//
#import <Cocoa/Cocoa.h>
+13 -1
View File
@@ -3,7 +3,7 @@
// TaskExplorer
//
// Created by Patrick Wardle on 8/14/15.
// Copyright (c) 2015 Lucas Derraugh. All rights reserved.
// Copyright (c) 2015 Objective-See. All rights reserved.
//
#import "AppDelegate.h"
@@ -11,6 +11,7 @@
#import "ItemView.h"
#import "KKRow.h"
//TODO: mouse over for info/show in finder buttons!
@interface FlaggedItems ()
@@ -50,6 +51,17 @@
[self.flaggedItemTable reloadData];
}
//TODO: don't need
//automatically invoked when window is closing
// ->make ourselves unmodal
-(void)windowWillClose:(NSNotification *)notification
{
//make un-modal
//[[NSApplication sharedApplication] stopModal];
return;
}
//table delegate
// ->return number of rows, which is just number of items in the currently selected plugin
-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
+3
View File
@@ -22,6 +22,9 @@ NSTableCellView* createItemView(NSTableView* tableView, id owner, id item);
//create & customize flagged item view
NSTableCellView* createFlaggedItemView(NSTableView* tableView, id owner, id item);
//create & customize global dylib/file view
NSTableCellView* createLoadedItemView(NSTableView* tableView, id owner, id item);
//create & customize task view
NSTableCellView* createTaskView(NSTableView* tableView, id owner, id item);
+154 -5
View File
@@ -9,10 +9,12 @@
#import "Consts.h"
#import "ItemView.h"
#import "VTButton.h"
#import "AppDelegate.h"
#import "kkRowCell.h"
#import "AppDelegate.h"
#import "SearchWindowController.h"
#import "3rdParty/OrderedDictionary.h"
//create customize item view
NSTableCellView* createItemView(NSTableView* tableView, id owner, id item)
{
@@ -25,12 +27,22 @@ NSTableCellView* createItemView(NSTableView* tableView, id owner, id item)
//bail
goto bail;
}
//first handle logic for flagged items
if(YES == [owner isKindOfClass:[FlaggedItems class]])
//handle logic for flagged items
// ->but only dylibs, to get special global 'loaded in' views
if( (YES == [owner isKindOfClass:[FlaggedItems class]]) &&
(YES == [item isKindOfClass:[Binary class]]) )
{
//create & config view
itemCell = createFlaggedItemView(tableView, owner, item);
itemCell = createLoadedItemView(tableView, owner, item);
}
//handle logic for search results
// ->dylibs and files have the special global 'loaded in' views
else if( (YES == [owner isKindOfClass:[SearchWindowController class]]) &&
( (YES == [item isKindOfClass:[Binary class]]) || (YES == [item isKindOfClass:[File class]]) ) )
{
//create & config view
itemCell = createLoadedItemView(tableView, owner, item);
}
//logic to create task view
@@ -135,6 +147,143 @@ NSImage* getCodeSigningIcon(Binary* binary)
return codeSignIcon;
}
//create & customize global dylib/file view
NSTableCellView* createLoadedItemView(NSTableView* tableView, id owner, id item)
{
//item cell
NSTableCellView* loadedItemCell = nil;
//matching or host tasks
NSMutableArray* tasks = nil;
//pid or 'loaded in' string
NSMutableString* loadedIn = nil;
//task's name frame
CGRect nameFrame = {0};
//get host tasks
// TODO: make this work for files too!
tasks = [((AppDelegate*)[[NSApplication sharedApplication] delegate]).taskEnumerator loadedIn:item];
//start 'loaded in: ...' str
loadedIn = [NSMutableString stringWithFormat:@"(loaded in:"];
//add all tasks
for(Task* task in tasks)
{
//append name
[loadedIn appendFormat:@" %@,", task.binary.name];
}
//remove last ','
if(YES == [loadedIn hasSuffix:@","])
{
//remove
[loadedIn deleteCharactersInRange:NSMakeRange([loadedIn length]-1, 1)];
}
//terminate list/output
[loadedIn appendString:@")"];
//dylibs
// ->create cell
if(YES == [item isKindOfClass:[Binary class]])
{
//create
loadedItemCell = [tableView makeViewWithIdentifier:@"TaskCell" owner:owner];
}
//files
// ->create cell
else if(YES == [item isKindOfClass:[File class]])
{
//create
loadedItemCell = [tableView makeViewWithIdentifier:@"FileCell" owner:owner];
}
//sanity check
if(nil == loadedItemCell)
{
//bail
goto bail;
}
//brand new cells need tracking areas
// ->determine if new, by checking default (.xib/IB) value
if( (YES == [loadedItemCell.textField.stringValue isEqualToString:@"Task Name"]) ||
(YES == [loadedItemCell.textField.stringValue isEqualToString:@"File Name"]) )
{
//only dylibs have VT button
if(YES == [item isKindOfClass:[Binary class]])
{
//add tracking area
// ->'vt' button
addTrackingArea(loadedItemCell, TABLE_ROW_VT_BUTTON, owner);
}
//add tracking area
// ->'info' button
addTrackingArea(loadedItemCell, TABLE_ROW_INFO_BUTTON, owner);
//add tracking area
// ->'show' button
addTrackingArea(loadedItemCell, TABLE_ROW_SHOW_BUTTON, owner);
}
//set icon
//TODO: make sure files have icons!!
loadedItemCell.imageView.image = [item icon];
//only dylibs have code signing icons
if(YES == [item isKindOfClass:[Binary class]])
{
//set code signing icon
((NSImageView*)[loadedItemCell viewWithTag:TABLE_ROW_SIGNATURE_ICON]).image = getCodeSigningIcon(item);
}
//default
// ->(re)set main textfield's color to black
loadedItemCell.textField.textColor = [NSColor blackColor];
//set main text
// ->name
[loadedItemCell.textField setStringValue:[item name]];
//get name frame
nameFrame = loadedItemCell.textField.frame;
//adjust width to fit text
nameFrame.size.width = [loadedItemCell.textField.stringValue sizeWithAttributes: @{NSFontAttributeName: loadedItemCell.textField.font}].width + 5;
//disable autolayout for name
loadedItemCell.textField.translatesAutoresizingMaskIntoConstraints = YES;
//update name frame
// ->should now be exact size of text
loadedItemCell.textField.frame = nameFrame;
//set pid
// ->immediately follows name
[((NSTextField*)[loadedItemCell viewWithTag:TABLE_ROW_PID_LABEL]) setStringValue:loadedIn];
//set path
[[loadedItemCell viewWithTag:TABLE_ROW_SUB_TEXT_TAG] setStringValue:[item path]];
//only dylibs have VT button
if(YES == [item isKindOfClass:[Binary class]])
{
//config VT button
configVTButton(loadedItemCell, owner, item);
}
//bail
bail:
return loadedItemCell;
}
//TODO: for search, each task is unique, so same for flagged tasks? YES, get args etc :)
//create & customize flagged item view
NSTableCellView* createFlaggedItemView(NSTableView* tableView, id owner, Binary* binary)
{
+64
View File
@@ -0,0 +1,64 @@
//
// FlaggedItems.h
// TaskExplorer
//
// Created by Patrick Wardle on 8/14/15.
// Copyright (c) 2015 Objective-See. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "InfoWindowController.h"
#import "VTInfoWindowController.h"
@interface SearchWindowController : NSWindowController
//automatically invoked when user presses 'Enter' in search box
// ->search!
-(IBAction)search:(id)sender;
//PROPERTIES
//flag for first time init's
@property BOOL didInit;
//search box
@property (weak) IBOutlet NSTextField *searchBox;
//table
@property (weak) IBOutlet NSTableView *searchTable;
//table items
@property(nonatomic, retain)NSMutableArray* searchResults;
//filter object
@property(nonatomic, retain)Filter* filterObj;
//vt window controller
@property (nonatomic, retain)VTInfoWindowController* vtWindowController;
//info window controller
@property(retain, nonatomic)InfoWindowController* infoWindowController;
//tasks
@property(nonatomic, retain)NSMutableDictionary* tasks;
//dylibs
@property(nonatomic, retain)NSMutableDictionary* dylibs;
//files
@property(nonatomic, retain)NSMutableDictionary* files;
//connections
@property(nonatomic, retain)NSMutableDictionary* connections;
/* METHODS */
//init/prepare
// ->make sure everything is cleanly init'd
-(void)prepare;
@end
+520
View File
@@ -0,0 +1,520 @@
//
// SearchWindowController.m
// TaskExplorer
//
// Created by Patrick Wardle on 8/14/15.
// Copyright (c) 2015 Objective-See. All rights reserved.
//
//TODO: mouse over for info/show in finder buttons!
#import "AppDelegate.h"
#import "SearchWindowController.h"
#import "ItemView.h"
#import "KKRow.h"
#import "Filter.h"
#import "SearchResult.h"
@implementation SearchWindowController
@synthesize tasks;
@synthesize dylibs;
@synthesize files;
@synthesize connections;
@synthesize didInit;
@synthesize searchTable;
@synthesize filterObj;
@synthesize searchResults;
@synthesize searchBox;
@synthesize vtWindowController;
@synthesize infoWindowController;
//automatically called when nib is loaded
// ->center window
-(void)awakeFromNib
{
//single time init
if(YES != self.didInit)
{
//center
[self.window center];
//set flag
self.didInit = YES;
}
return;
}
/*
//automatically invoked when window is loaded
// ->set to white
-(void)windowDidLoad
{
//super
//[super windowDidLoad];
//TODO: reset searchResults when user clears search box~!
//init search data
// ->loads all current tasks, dylibs, files, network conns
//[self initSearchData];
//TODO: disable search box till done generating search dicts?
return;
}
*/
//automatically invoked when window is closing
// ->make ourselves unmodal
-(void)windowWillClose:(NSNotification *)notification
{
//make un-modal
//[[NSApplication sharedApplication] stopModal];
return;
}
//init/prepare
// ->make sure everything is cleanly init'd
-(void)prepare
{
//init filter obj
filterObj = [[Filter alloc] init];
//init array for search results
searchResults = [NSMutableArray array];
//table reload
// ->make sure all is reset
[self.searchTable reloadData];
//reset search string
[self.searchBox setStringValue:@""];
return;
}
/*
//init search data
// ->load all tasks/dylibs/files/connections into dictionaries for easy/quick searching
-(void)initSearchData:(NSString*)searchString
{
//alloc task dictionary
tasks = ((AppDelegate*)[[NSApplication sharedApplication] delegate]).taskEnumerator.tasks;
//alloc dylibs dictionary
dylibs = [NSMutableDictionary dictionary];
//alloc files dictionary
files = [NSMutableDictionary dictionary];
//alloc connections dictionary
connections = [NSMutableDictionary dictionary];
/*
//'#' indicates a keyword search
// ->check for keyword match, then filter by keyword
if(YES == [search.string hasPrefix:@"#"])
{
//ignore #search strings that don't match a keyword
if(YES != [filterObj isKeyword:search.string])
{
//ignore
goto bail;
}
}
//filter
[self.filterObj filterTasks:search.string items:self.taskEnumerator.tasks results:self.taskTableController.filteredItems];
*/
//process each
// ->add files, tasks, network connections
/*
for(NSNumber* taskPid in tasks)
{
//extract task
task = tasks[taskPid];
//
}
*/
/*
return;
}
*/
/*
-(void)search:(NSString*)searchString
{
//filter object
Filter* filterObj = nil;
//task
Task* task = nil;
//init filter obj
filterObj = [[Filter alloc] init];
return;
}
*/
//table delegate
// ->return number of rows
-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
//count
return self.searchResults.count;
}
//table delegate method
// ->return cell for row
-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
//row view
NSView* rowView = nil;
//sanity check
// ->make sure there is table item for row
if(row >= self.searchResults.count)
{
//bail
goto bail;
}
//create the view
// ->inits row w/ all required info
rowView = createItemView(tableView, self, [self.searchResults objectAtIndex:row]);
//bail
bail:
return rowView;
}
//automatically invoked
// ->create custom (sub-classed) NSTableRowView
-(NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row
{
//row view
KKRow* rowView = nil;
//row ID
static NSString* const kRowIdentifier = @"TableRowView";
//try grab existing row view
rowView = [tableView makeViewWithIdentifier:kRowIdentifier owner:self];
//make new if needed
if(nil == rowView)
{
//create new
// ->size doesn't matter
rowView = [[KKRow alloc] initWithFrame:NSZeroRect];
//set row ID
rowView.identifier = kRowIdentifier;
}
return rowView;
}
//automatically invoked when user presses 'Enter' in search box
// ->search!
- (IBAction)search:(id)sender
{
//search string
NSString* searchString = nil;
//all tasks
OrderedDictionary* allTasks = nil;
//matching items
NSMutableArray* matchingItems = nil;
//matching tasks
NSMutableArray* matchingTasks = nil;
//matching dylibs
NSMutableDictionary* matchingDylibs = nil;
//task
Task* task = nil;
//search result
//SearchResult* searchResult = 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];
//reset search results
[self.searchResults removeAllObjects];
//grab search string
searchString = [sender stringValue];
//grab all tasks
allTasks = ((AppDelegate*)[[NSApplication sharedApplication] delegate]).taskEnumerator.tasks;
//'#' 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;
}
}
//first; search for all matching tasks
[self.filterObj filterTasks:searchString items:allTasks results:matchingTasks];
//TODO: don't need for loop for this?
//convert/save into search result objects
for(Task* task in matchingTasks)
{
//init
//searchResult = [[SearchResult alloc] initWithItem:task];
//add to table items
[self.searchResults addObject:task];
}
//refresh table to display task matches
[self.searchTable reloadData];
//second; search for all matching dylibs
//sync
@synchronized(allTasks)
{
//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
}//sync
//refresh table to display dylib
[self.searchTable reloadData];
//bail
bail:
return;
}
//invoked when the user clicks 'virus total' icon
// ->launch browser and browse to virus total's page
-(void)showVTInfo:(id)sender
{
//item
// ->task or dylib
id item = nil;
//binary
Binary* binary = nil;
//row
NSInteger itemRow = 0;
//grab sender's row
itemRow = [self.searchTable rowForView:sender];
//sanity check(s)
// ->make sure row is decent
if( (-1 == itemRow) ||
(itemRow >= self.searchResults.count) )
{
//bail
goto bail;
}
//extract item for row
item = self.searchResults[itemRow];
//tasks
// ->grab binary
if(YES == [item isKindOfClass:[Task class]])
{
//get binary
binary = ((Task*)item).binary;
}
//binaries
// ->can use as is
else if(YES == [item isKindOfClass:[Binary class]])
{
//set
binary = item;
}
//sanity check
if(nil == binary)
{
//bail
goto bail;
}
//alloc/init info window
vtWindowController = [[VTInfoWindowController alloc] initWithItem:binary];
//show it
[self.vtWindowController.windowController showWindow:self];
//bail
bail:
return;
}
//automatically invoked when user clicks the 'show in finder' icon
// ->open Finder to show item
-(IBAction)showInFinder:(id)sender
{
//item
// ->task, dylib, or file
id item = nil;
//path to item
NSString* path = nil;
//row
NSInteger itemRow = 0;
//grab sender's row
itemRow = [self.searchTable rowForView:sender];
//sanity check(s)
// ->make sure row is decent
if( (-1 == itemRow) ||
(itemRow >= self.searchResults.count) )
{
//bail
goto bail;
}
//extract item for row
item = self.searchResults[itemRow];
//tasks
// ->grab path from binary
if(YES == [item isKindOfClass:[Task class]])
{
//get path
path = ((Task*)item).binary.path;
}
//binary/files
// ->use as is
else if( (YES == [item isKindOfClass:[Binary class]]) ||
(YES == [item isKindOfClass:[File class]]) )
{
//get path
path = [item path];
}
//sanity check
if(nil == path)
{
//bail
goto bail;
}
//open Finder
// ->will reveal binary
[[NSWorkspace sharedWorkspace] selectFile:path inFileViewerRootedAtPath:nil];
//bail
bail:
return;
}
//automatically invoked when user clicks the 'info' icon
// ->create/configure/display info window for task/dylib/file/etc
-(IBAction)showInfo:(id)sender
{
//item
// ->task, dylib, file, etc
id item = nil;
//row
NSInteger itemRow = 0;
//grab sender's row
itemRow = [self.searchTable rowForView:sender];
//sanity check(s)
// ->make sure row is decent
if( (-1 == itemRow) ||
(itemRow >= self.searchResults.count) )
{
//bail
goto bail;
}
//grab item
item = self.searchResults[itemRow];
//alloc/init info window
infoWindowController = [[InfoWindowController alloc] initWithItem:item];
//show it
[self.infoWindowController.windowController showWindow:self];
//bail
bail:
return;
}
@end
+28
View File
@@ -8,6 +8,9 @@
/* Begin PBXBuildFile section */
1D21BC4F172AF43D009D1CFD /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D21BC4E172AF43D009D1CFD /* Cocoa.framework */; };
7D2F567C1B81BEAB00C7D85E /* SearchWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D2F567B1B81BEAB00C7D85E /* SearchWindow.xib */; };
7D2F567F1B81BEB400C7D85E /* SearchWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D2F567E1B81BEB400C7D85E /* SearchWindowController.m */; };
7DEC68971B844F4800F4C12E /* SearchResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DEC68961B844F4800F4C12E /* SearchResult.m */; };
CD001B381AB903040089014A /* logo.png in Resources */ = {isa = PBXBuildFile; fileRef = CD001B351AB903040089014A /* logo.png */; };
CD001B391AB903040089014A /* logoApple.png in Resources */ = {isa = PBXBuildFile; fileRef = CD001B361AB903040089014A /* logoApple.png */; };
CD02194F1AD34D8B005148A2 /* AboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = CD02194D1AD34D8B005148A2 /* AboutWindow.xib */; };
@@ -150,6 +153,11 @@
1D21BC51172AF43D009D1CFD /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
1D21BC52172AF43D009D1CFD /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
1D21BC53172AF43D009D1CFD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
7D2F567B1B81BEAB00C7D85E /* SearchWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = SearchWindow.xib; path = UI/SearchWindow.xib; sourceTree = "<group>"; };
7D2F567D1B81BEB300C7D85E /* SearchWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchWindowController.h; sourceTree = "<group>"; };
7D2F567E1B81BEB400C7D85E /* SearchWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchWindowController.m; sourceTree = "<group>"; };
7DEC68951B844F4800F4C12E /* SearchResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchResult.h; sourceTree = "<group>"; };
7DEC68961B844F4800F4C12E /* SearchResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchResult.m; sourceTree = "<group>"; };
CD001B351AB903040089014A /* logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = logo.png; path = images/logo.png; sourceTree = SOURCE_ROOT; };
CD001B361AB903040089014A /* logoApple.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = logoApple.png; path = images/logoApple.png; sourceTree = SOURCE_ROOT; };
CD02194D1AD34D8B005148A2 /* AboutWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = AboutWindow.xib; path = UI/AboutWindow.xib; sourceTree = "<group>"; };
@@ -323,6 +331,10 @@
1D21BC42172AF43D009D1CFD = {
isa = PBXGroup;
children = (
7D2F567D1B81BEB300C7D85E /* SearchWindowController.h */,
7D2F567E1B81BEB400C7D85E /* SearchWindowController.m */,
7DEC68951B844F4800F4C12E /* SearchResult.h */,
7DEC68961B844F4800F4C12E /* SearchResult.m */,
CD74A0781B7F170B00A8AAD3 /* FlaggedItems.h */,
CD74A0791B7F170B00A8AAD3 /* FlaggedItems.m */,
CD4D54201B2CE6F200008030 /* NSMutableArray+QueueAdditions.h */,
@@ -551,6 +563,7 @@
CDA81E621AA020E8009790E2 /* UI */ = {
isa = PBXGroup;
children = (
7D2F567B1B81BEAB00C7D85E /* SearchWindow.xib */,
CD74A07D1B81B5D400A8AAD3 /* FlaggedItems.xib */,
CD4D54271B2EAC7800008030 /* NetworkInfoWindow.xib */,
CD4D54231B2D082300008030 /* DylibInfoWindow.xib */,
@@ -630,8 +643,12 @@
LastUpgradeCheck = 0620;
ORGANIZATIONNAME = "Lucas Derraugh";
TargetAttributes = {
1D21BC4A172AF43D009D1CFD = {
DevelopmentTeam = VBG97UB4TA;
};
CDA5F6AC1B16D805003CE340 = {
CreatedOnToolsVersion = 6.3.2;
DevelopmentTeam = VBG97UB4TA;
};
};
};
@@ -685,6 +702,7 @@
CDF08CD01AC4C6E8009B3423 /* settingsBG.png in Resources */,
CDEE77021B3FD55600763826 /* teText.png in Resources */,
CDEE76FC1B3FD44500763826 /* saveIcon.png in Resources */,
7D2F567C1B81BEAB00C7D85E /* SearchWindow.xib in Resources */,
CD0219591AD37748005148A2 /* unsigned2.png in Resources */,
CD4D54281B2EAC7800008030 /* NetworkInfoWindow.xib in Resources */,
CDA81D5C1A95B4B4009790E2 /* MainMenu.xib in Resources */,
@@ -753,6 +771,7 @@
CD74A07B1B7F170B00A8AAD3 /* FlaggedItems.m in Sources */,
CDA5F6C41B16E20E003CE340 /* RequestRootWindowController.m in Sources */,
CDD2483B1AF5CC4D00232422 /* Task.m in Sources */,
7D2F567F1B81BEB400C7D85E /* SearchWindowController.m in Sources */,
CD83887F1AACCEDF000EB098 /* VirusTotal.m in Sources */,
CDF08CDF1AC886F2009B3423 /* VTInfoWindowController.m in Sources */,
CD3F4CEB1AF6D948002A2647 /* OrderedDictionary.m in Sources */,
@@ -777,6 +796,7 @@
CDD248351AF5947300232422 /* TAAdaptiveSpaceItemView.m in Sources */,
CDBE49181B58DC9B0031FC22 /* NSApplicationKeyEvents.m in Sources */,
CDA81D531A95B492009790E2 /* Utilities.m in Sources */,
7DEC68971B844F4800F4C12E /* SearchResult.m in Sources */,
CD7B9FAB1AD08FA100DF3C71 /* KKRow.m in Sources */,
CD3F4CFD1AF71B58002A2647 /* ItemBase.m in Sources */,
);
@@ -884,11 +904,14 @@
1D21BC69172AF43D009D1CFD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "Developer ID Application";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "TaskExplorer-Prefix.pch";
INFOPLIST_FILE = "TaskExplorer-Info.plist";
PRODUCT_NAME = TaskExplorer;
PROVISIONING_PROFILE = "";
WRAPPER_EXTENSION = app;
};
name = Debug;
@@ -896,11 +919,14 @@
1D21BC6A172AF43D009D1CFD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "Developer ID Application";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "TaskExplorer-Prefix.pch";
INFOPLIST_FILE = "TaskExplorer-Info.plist";
PRODUCT_NAME = TaskExplorer;
PROVISIONING_PROFILE = "";
WRAPPER_EXTENSION = app;
};
name = Release;
@@ -913,6 +939,7 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CODE_SIGN_IDENTITY = "Developer ID Application";
COMBINE_HIDPI_IMAGES = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -941,6 +968,7 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CODE_SIGN_IDENTITY = "Developer ID Application";
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
ENABLE_NS_ASSERTIONS = NO;
@@ -7,14 +7,14 @@
<key>IDESourceControlProjectIdentifier</key>
<string>FE4103FE-6F26-4639-8C9F-D8D32C76D6A9</string>
<key>IDESourceControlProjectName</key>
<string>TaskExplorer</string>
<string>project</string>
<key>IDESourceControlProjectOriginsDictionary</key>
<dict>
<key>61F07AFB33748EF0C810BEEF6126283DAC63A899</key>
<string>https://bitbucket.org/objective-see/taskexplorer.git</string>
</dict>
<key>IDESourceControlProjectPath</key>
<string>TaskExplorer.xcodeproj</string>
<string>TaskExplorer.xcodeproj/project.xcworkspace</string>
<key>IDESourceControlProjectRelativeInstallPathDictionary</key>
<dict>
<key>61F07AFB33748EF0C810BEEF6126283DAC63A899</key>
+1 -1
View File
@@ -38,7 +38,7 @@
//category table view
@property(weak) IBOutlet NSTableView *itemView;
//info window
//info window controller
@property(retain, nonatomic)InfoWindowController* infoWindowController;
//virus total window controller
+3 -3
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14F27" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
@@ -17,7 +17,7 @@
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="95" y="481" width="1304" height="322"/>
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1057"/>
<value key="minSize" type="size" width="800" height="250"/>
<view key="contentView" id="se5-gp-TjO">
<rect key="frame" x="0.0" y="0.0" width="1304" height="322"/>
@@ -49,7 +49,7 @@
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView identifier="FlaggedItem" id="LL3-Mq-2hG" customClass="kkRowCell">
<tableCellView identifier="TaskCell" id="LL3-Mq-2hG" customClass="kkRowCell">
<rect key="frame" x="1" y="1" width="1301" height="40"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
+449
View File
@@ -0,0 +1,449 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="SearchWindowController">
<connections>
<outlet property="searchBox" destination="BB9-Xc-q8T" id="8cj-MF-5Nv"/>
<outlet property="searchTable" destination="w0h-ih-Ej7" id="d9e-Dk-k2K"/>
<outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Search" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="95" y="481" width="1304" height="425"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1057"/>
<value key="minSize" type="size" width="800" height="250"/>
<view key="contentView" id="se5-gp-TjO">
<rect key="frame" x="0.0" y="3" width="1304" height="425"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView misplaced="YES" autohidesScrollers="YES" horizontalLineScroll="42" horizontalPageScroll="10" verticalLineScroll="42" verticalPageScroll="10" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="8GA-gp-lIa">
<rect key="frame" x="-1" y="31" width="1306" height="324"/>
<clipView key="contentView" misplaced="YES" drawsBackground="NO" id="4oI-qg-e78">
<rect key="frame" x="1" y="1" width="1204" height="437"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="40" rowSizeStyle="automatic" viewBased="YES" id="w0h-ih-Ej7">
<rect key="frame" x="0.0" y="0.0" width="1304" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="MainCell" editable="NO" width="1301" minWidth="500" maxWidth="2000" id="Nnf-1E-SNL">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="thk-IY-RnX">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView identifier="TaskCell" id="sUk-Ix-Ica" customClass="kkRowCell">
<rect key="frame" x="0.0" y="0.0" width="1301" height="40"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="KGc-fT-NHo">
<rect key="frame" x="1" y="7" width="25" height="25"/>
<constraints>
<constraint firstAttribute="width" constant="25" id="R8P-N9-HIl"/>
<constraint firstAttribute="height" constant="25" id="Z6m-hY-qVK"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="5e6-Bn-yRq"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" misplaced="YES" tag="100" translatesAutoresizingMaskIntoConstraints="NO" id="lke-4V-7Zy">
<rect key="frame" x="33" y="23" width="11" height="11"/>
<constraints>
<constraint firstAttribute="height" constant="11" id="CvL-5h-KIg"/>
<constraint firstAttribute="width" constant="11" id="rqr-G2-p8X"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="unknown" id="IhW-G7-O7C"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="n1s-T9-NPU">
<rect key="frame" x="46" y="20" width="225" height="19"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Task Name" id="5KE-Dr-geL">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button toolTip="show in finder" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="107" translatesAutoresizingMaskIntoConstraints="NO" id="gCS-2D-Ds7">
<rect key="frame" x="1263" y="15" width="18" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="18" id="8pV-NY-Mhk"/>
<constraint firstAttribute="height" constant="18" id="9R2-4n-jWO"/>
</constraints>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="show" imagePosition="overlaps" alignment="center" alternateImage="showBG" state="on" imageScaling="proportionallyDown" inset="2" id="gW6-U6-JVc">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="showInFinder:" target="-2" id="2ZS-1b-dnL"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="108" translatesAutoresizingMaskIntoConstraints="NO" id="bfy-Vt-ur5">
<rect key="frame" x="1258" y="4" width="25" height="12"/>
<constraints>
<constraint firstAttribute="height" constant="12" id="VJw-eb-bzV"/>
<constraint firstAttribute="width" constant="21" id="zfp-Wv-VjV"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="show" id="5tj-2k-fiv">
<font key="font" size="9" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="101" translatesAutoresizingMaskIntoConstraints="NO" id="NrX-dv-Ndg">
<rect key="frame" x="31" y="2" width="1118" height="21"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="item path" id="q9H-hQ-BE4">
<font key="font" size="11" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button toolTip="show virustotal info" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="103" translatesAutoresizingMaskIntoConstraints="NO" id="oNi-kw-tm3" customClass="VTButton">
<rect key="frame" x="1155" y="17" width="49" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="29" id="ceG-SD-b1T"/>
<constraint firstAttribute="width" constant="49" id="sC7-h2-9TZ"/>
</constraints>
<buttonCell key="cell" type="bevel" title="▪ ▪ ▪" bezelStyle="regularSquare" imagePosition="overlaps" alignment="center" enabled="NO" refusesFirstResponder="YES" state="on" imageScaling="proportionallyDown" inset="2" id="Set-21-4OM">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" size="8" name="Menlo-Bold"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="104" translatesAutoresizingMaskIntoConstraints="NO" id="Gb3-Kp-uki">
<rect key="frame" x="1148" y="4" width="65" height="12"/>
<constraints>
<constraint firstAttribute="height" constant="12" id="PLZ-BP-h3a"/>
<constraint firstAttribute="width" constant="61" id="Z8g-YQ-jkg"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="virustotal" id="B9p-4E-fYN">
<font key="font" size="9" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button toolTip="show file info" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="105" translatesAutoresizingMaskIntoConstraints="NO" id="p6d-mB-jY7">
<rect key="frame" x="1226" y="17" width="15" height="15"/>
<constraints>
<constraint firstAttribute="width" constant="15" id="3Ka-kt-lLC"/>
<constraint firstAttribute="height" constant="15" id="P68-hP-BU6"/>
</constraints>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="info" imagePosition="overlaps" alignment="center" alternateImage="infoBG" state="on" imageScaling="proportionallyDown" inset="2" id="6Ig-Ve-GiF">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="showInfo:" target="-2" id="Lve-p9-fmt"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="106" translatesAutoresizingMaskIntoConstraints="NO" id="pYR-xm-B9a">
<rect key="frame" x="1220" y="4" width="25" height="12"/>
<constraints>
<constraint firstAttribute="width" constant="21" id="bDg-n0-fZK"/>
<constraint firstAttribute="height" constant="12" id="eTs-g0-b06"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="info" id="lYM-jY-383">
<font key="font" size="9" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="102" translatesAutoresizingMaskIntoConstraints="NO" id="SQO-cM-V2f">
<rect key="frame" x="295" y="20" width="675" height="18"/>
<constraints>
<constraint firstAttribute="height" constant="18" id="gMv-w4-pQh"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="pid" id="Lm4-16-Zlv">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" white="0.49295236009999999" alpha="0.84999999999999998" colorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="SQO-cM-V2f" firstAttribute="leading" secondItem="n1s-T9-NPU" secondAttribute="trailing" constant="8" id="GvF-LW-0UJ"/>
<constraint firstAttribute="trailing" secondItem="gCS-2D-Ds7" secondAttribute="trailing" constant="20" id="KJ7-EP-HUM"/>
<constraint firstItem="p6d-mB-jY7" firstAttribute="leading" secondItem="oNi-kw-tm3" secondAttribute="trailing" constant="22" id="MOG-Th-2rD"/>
<constraint firstAttribute="trailing" secondItem="bfy-Vt-ur5" secondAttribute="trailing" constant="20" id="OFd-VX-lUs"/>
<constraint firstItem="KGc-fT-NHo" firstAttribute="leading" secondItem="sUk-Ix-Ica" secondAttribute="leading" constant="4" id="OG0-6W-uXp"/>
<constraint firstItem="pYR-xm-B9a" firstAttribute="leading" secondItem="Gb3-Kp-uki" secondAttribute="trailing" constant="11" id="Vou-zx-GCc"/>
<constraint firstItem="NrX-dv-Ndg" firstAttribute="leading" secondItem="KGc-fT-NHo" secondAttribute="trailing" constant="2" id="b3y-V0-Dqs"/>
<constraint firstItem="gCS-2D-Ds7" firstAttribute="leading" secondItem="p6d-mB-jY7" secondAttribute="trailing" constant="22" id="ccN-Sf-2o3"/>
<constraint firstItem="bfy-Vt-ur5" firstAttribute="leading" secondItem="pYR-xm-B9a" secondAttribute="trailing" constant="17" id="gWw-co-H34"/>
<constraint firstItem="KGc-fT-NHo" firstAttribute="top" secondItem="sUk-Ix-Ica" secondAttribute="top" constant="7" id="ixB-HB-XNH"/>
<constraint firstItem="Gb3-Kp-uki" firstAttribute="leading" secondItem="NrX-dv-Ndg" secondAttribute="trailing" constant="8" id="jOh-lG-rMG"/>
</constraints>
<connections>
<outlet property="imageView" destination="KGc-fT-NHo" id="fjH-oS-Ttv"/>
<outlet property="textField" destination="n1s-T9-NPU" id="SUI-4J-csg"/>
</connections>
</tableCellView>
<tableCellView identifier="FileCell" id="62p-Yk-Jl3" customClass="kkRowCell">
<rect key="frame" x="0.0" y="0.0" width="1301" height="40"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="IIS-fl-0Bl">
<rect key="frame" x="1" y="7" width="25" height="25"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="6WK-up-tjw"/>
<constraint firstAttribute="width" constant="25" id="Taf-w0-lmh"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="6gv-k4-mdi"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ugh-bk-muU">
<rect key="frame" x="31" y="20" width="225" height="19"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="File Name" id="fgN-p7-FWL">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button toolTip="show in finder" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="107" translatesAutoresizingMaskIntoConstraints="NO" id="vr7-eK-3Bt">
<rect key="frame" x="1263" y="15" width="18" height="18"/>
<constraints>
<constraint firstAttribute="height" constant="18" id="dAr-cN-uUn"/>
<constraint firstAttribute="width" constant="18" id="zXa-WM-eOg"/>
</constraints>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="show" imagePosition="overlaps" alignment="center" alternateImage="showBG" state="on" imageScaling="proportionallyDown" inset="2" id="JfA-Xz-dMU">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="showInFinder:" target="-2" id="3Eh-Zw-Rbh"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="108" translatesAutoresizingMaskIntoConstraints="NO" id="Xsx-qZ-Zpb">
<rect key="frame" x="1258" y="4" width="25" height="12"/>
<constraints>
<constraint firstAttribute="height" constant="12" id="0fT-ZA-eOk"/>
<constraint firstAttribute="width" constant="21" id="Xog-rK-3AA"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="show" id="kqf-4B-ouI">
<font key="font" size="9" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="101" translatesAutoresizingMaskIntoConstraints="NO" id="4c4-WA-4rL">
<rect key="frame" x="31" y="2" width="1118" height="21"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="item path" id="1An-1Z-a3L">
<font key="font" size="11" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button toolTip="show virustotal info" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="103" translatesAutoresizingMaskIntoConstraints="NO" id="i6u-9C-uXr" customClass="VTButton">
<rect key="frame" x="1155" y="17" width="49" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="29" id="dZK-av-f0h"/>
<constraint firstAttribute="width" constant="49" id="pSZ-XT-150"/>
</constraints>
<buttonCell key="cell" type="bevel" title="▪ ▪ ▪" bezelStyle="regularSquare" imagePosition="overlaps" alignment="center" enabled="NO" refusesFirstResponder="YES" state="on" imageScaling="proportionallyDown" inset="2" id="GbW-1n-cPa">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" size="8" name="Menlo-Bold"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="104" translatesAutoresizingMaskIntoConstraints="NO" id="PDw-rS-77D">
<rect key="frame" x="1148" y="4" width="65" height="12"/>
<constraints>
<constraint firstAttribute="height" constant="12" id="BOb-he-sMX"/>
<constraint firstAttribute="width" constant="61" id="Lfq-Ws-PxQ"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="virustotal" id="knf-Fq-SXI">
<font key="font" size="9" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button toolTip="show file info" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="105" translatesAutoresizingMaskIntoConstraints="NO" id="UgY-KO-I4K">
<rect key="frame" x="1226" y="17" width="15" height="15"/>
<constraints>
<constraint firstAttribute="width" constant="15" id="mcK-qU-Zhw"/>
<constraint firstAttribute="height" constant="15" id="ueM-k7-z2V"/>
</constraints>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="info" imagePosition="overlaps" alignment="center" alternateImage="infoBG" state="on" imageScaling="proportionallyDown" inset="2" id="JWo-Wl-G2k">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="showInfo:" target="-2" id="Qg3-J4-Gmd"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="106" translatesAutoresizingMaskIntoConstraints="NO" id="5kn-qs-yNV">
<rect key="frame" x="1220" y="4" width="25" height="12"/>
<constraints>
<constraint firstAttribute="height" constant="12" id="itt-sl-J4t"/>
<constraint firstAttribute="width" constant="21" id="zVz-lj-dNx"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="info" id="15W-dO-1SZ">
<font key="font" size="9" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="102" translatesAutoresizingMaskIntoConstraints="NO" id="fnp-rh-Inz">
<rect key="frame" x="295" y="20" width="79" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="75" id="Mgt-VY-xK3"/>
<constraint firstAttribute="height" constant="18" id="uzP-Cn-LZW"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="pid" id="JT7-PU-YPp">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" white="0.49295236009999999" alpha="0.84999999999999998" colorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="PDw-rS-77D" firstAttribute="leading" secondItem="4c4-WA-4rL" secondAttribute="trailing" constant="8" id="1SS-3r-UgX"/>
<constraint firstItem="IIS-fl-0Bl" firstAttribute="top" secondItem="62p-Yk-Jl3" secondAttribute="top" constant="7" id="8c5-Z7-Olg"/>
<constraint firstItem="5kn-qs-yNV" firstAttribute="leading" secondItem="PDw-rS-77D" secondAttribute="trailing" constant="11" id="DGY-Ua-MhO"/>
<constraint firstAttribute="trailing" secondItem="Xsx-qZ-Zpb" secondAttribute="trailing" constant="20" id="Nyw-Bs-k6x"/>
<constraint firstItem="vr7-eK-3Bt" firstAttribute="leading" secondItem="UgY-KO-I4K" secondAttribute="trailing" constant="22" id="PkR-9T-0we"/>
<constraint firstItem="4c4-WA-4rL" firstAttribute="leading" secondItem="IIS-fl-0Bl" secondAttribute="trailing" constant="2" id="bEr-bp-efR"/>
<constraint firstItem="fnp-rh-Inz" firstAttribute="leading" secondItem="ugh-bk-muU" secondAttribute="trailing" constant="8" id="cFH-UH-bLJ"/>
<constraint firstItem="IIS-fl-0Bl" firstAttribute="leading" secondItem="62p-Yk-Jl3" secondAttribute="leading" constant="4" id="dM0-v7-57a"/>
<constraint firstItem="UgY-KO-I4K" firstAttribute="leading" secondItem="i6u-9C-uXr" secondAttribute="trailing" constant="22" id="eBy-TC-Ohr"/>
<constraint firstItem="Xsx-qZ-Zpb" firstAttribute="leading" secondItem="5kn-qs-yNV" secondAttribute="trailing" constant="17" id="icg-9v-1Px"/>
<constraint firstAttribute="trailing" secondItem="vr7-eK-3Bt" secondAttribute="trailing" constant="20" id="sgF-8e-pVL"/>
</constraints>
<connections>
<outlet property="imageView" destination="IIS-fl-0Bl" id="VGd-ss-r4L"/>
<outlet property="textField" destination="ugh-bk-muU" id="5Bo-1C-aqM"/>
</connections>
</tableCellView>
<tableCellView identifier="NetworkCell" id="waX-25-DeA" customClass="kkRowCell">
<rect key="frame" x="0.0" y="0.0" width="1301" height="40"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="71C-gs-Mno">
<rect key="frame" x="5" y="9" width="26" height="23"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="5cY-lj-s0H"/>
<constraint firstAttribute="width" constant="20" id="RFz-62-vLF"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="21o-6T-gOU"/>
</imageView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="101" translatesAutoresizingMaskIntoConstraints="NO" id="kT3-0V-Fwt">
<rect key="frame" x="31" y="2" width="1228" height="21"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="item path" id="V6l-Qj-AQN">
<font key="font" size="11" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="UR5-ag-OPP">
<rect key="frame" x="31" y="20" width="1000" height="19"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Network Info" id="WqN-YF-KzO">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button toolTip="show file info" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="105" translatesAutoresizingMaskIntoConstraints="NO" id="b9d-lc-cIV">
<rect key="frame" x="1265" y="16" width="15" height="15"/>
<constraints>
<constraint firstAttribute="width" constant="15" id="B8v-8X-yWj"/>
<constraint firstAttribute="height" constant="15" id="xa8-KT-ahq"/>
</constraints>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="info" imagePosition="only" alignment="center" alternateImage="infoBG" state="on" imageScaling="proportionallyDown" inset="2" id="TVV-n9-MRK">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="showInfo:" target="-2" id="OF2-Ho-YXr"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="106" translatesAutoresizingMaskIntoConstraints="NO" id="k5T-Yc-we2">
<rect key="frame" x="1259" y="3" width="25" height="12"/>
<constraints>
<constraint firstAttribute="width" constant="21" id="kTu-mW-fft"/>
<constraint firstAttribute="height" constant="12" id="pe9-mN-WeC"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="info" id="0Wf-9j-aaw">
<font key="font" size="9" name="Menlo-Regular"/>
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="kT3-0V-Fwt" firstAttribute="leading" secondItem="71C-gs-Mno" secondAttribute="trailing" constant="8" id="5IU-du-URu"/>
<constraint firstAttribute="trailing" secondItem="k5T-Yc-we2" secondAttribute="trailing" constant="19" id="JJb-oy-J0e"/>
<constraint firstItem="k5T-Yc-we2" firstAttribute="leading" secondItem="kT3-0V-Fwt" secondAttribute="trailing" constant="8" id="dOy-kF-uEl"/>
<constraint firstAttribute="trailing" secondItem="b9d-lc-cIV" secondAttribute="trailing" constant="20" id="gmk-OW-20W"/>
<constraint firstItem="71C-gs-Mno" firstAttribute="leading" secondItem="waX-25-DeA" secondAttribute="leading" constant="5" id="h2R-BV-oKU"/>
</constraints>
<connections>
<outlet property="imageView" destination="71C-gs-Mno" id="TDU-es-bpH"/>
<outlet property="textField" destination="UR5-ag-OPP" id="uTT-7d-N6D"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="-2" id="XkN-eO-Y60"/>
<outlet property="delegate" destination="-2" id="vqo-5I-Pat"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" controlSize="mini" horizontal="YES" id="YoR-S2-wC2">
<rect key="frame" x="1" y="298" width="480" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" controlSize="mini" horizontal="NO" id="SeJ-Sc-Vdr">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="BB9-Xc-q8T">
<rect key="frame" x="20" y="372" width="927" height="42"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" state="on" borderStyle="bezel" placeholderString="type search term, then press enter" drawsBackground="YES" id="L1f-RR-fvk">
<font key="font" metaFont="system" size="30"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<action selector="search:" target="-2" id="HSs-Yg-DG8"/>
<outlet property="delegate" destination="-2" id="X2H-Xx-qgK"/>
</connections>
</textField>
</subviews>
<constraints>
<constraint firstItem="8GA-gp-lIa" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" constant="70" id="IAH-UM-GVX"/>
<constraint firstAttribute="bottom" secondItem="8GA-gp-lIa" secondAttribute="bottom" constant="-1" id="RJ1-AT-aVI"/>
<constraint firstItem="8GA-gp-lIa" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="-1" id="bVx-kV-QU1"/>
<constraint firstAttribute="trailing" secondItem="8GA-gp-lIa" secondAttribute="trailing" constant="-1" id="hYI-5Z-VSU"/>
</constraints>
</view>
<connections>
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
</connections>
<point key="canvasLocation" x="634" y="91.5"/>
</window>
</objects>
<resources>
<image name="NSActionTemplate" width="14" height="14"/>
<image name="info" width="256" height="256"/>
<image name="infoBG" width="256" height="256"/>
<image name="show" width="256" height="256"/>
<image name="showBG" width="256" height="256"/>
<image name="unknown" width="256" height="256"/>
</resources>
</document>
+3 -3
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14F27" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<development version="6000" identifier="xcode"/>
@@ -47,7 +47,7 @@
<window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" showsToolbarButton="NO" animationBehavior="default" id="371">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" unifiedTitleAndToolbar="YES"/>
<rect key="contentRect" x="0.0" y="0.0" width="1354" height="665"/>
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1057"/>
<value key="minSize" type="size" width="1000" height="660"/>
<value key="maxSize" type="size" width="2000" height="660"/>
<view key="contentView" id="372">
@@ -298,7 +298,7 @@
<toolbarItem reference="y4u-t8-Acq"/>
</defaultToolbarItems>
</toolbar>
<point key="canvasLocation" x="662.5" y="342.5"/>
<point key="canvasLocation" x="662" y="342.5"/>
</window>
<customObject id="494" customClass="AppDelegate">
<connections>