mirror of
https://github.com/objective-see/TaskExplorer.git
synced 2026-03-22 07:02:39 +00:00
global search window logic (work in progress!)
This commit is contained in:
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user