2009-08-05 08:59:46 +00:00
/ *
2010-01-01 20:11:34 +00:00
Copyright 2010 Hardcoded Software ( http : // www . hardcoded . net )
2009-08-05 08:59:46 +00:00
This software is licensed under the "HS" License as described in the "LICENSE" file ,
which should be included with this package . The terms are also available at
http : // www . hardcoded . net / licenses / hs_license
* /
2009-06-01 09:55:11 +00:00
# import "ResultWindow.h"
# import "Dialogs.h"
# import "ProgressController.h"
# import "Utils.h"
# import "RegistrationInterface.h"
# import "AppDelegate.h"
# import "Consts.h"
@ implementation MatchesView
- ( void ) keyDown : ( NSEvent * ) theEvent
{
unichar key = [ [ theEvent charactersIgnoringModifiers ] characterAtIndex : 0 ] ;
// get flags and strip the lower 16 ( device dependant ) bits
2010-01-15 10:19:24 +00:00
NSUInteger flags = ( [ theEvent modifierFlags ] & 0 x00FF ) ;
2009-06-01 09:55:11 +00:00
if ( ( ( key = = NSDeleteFunctionKey ) || ( key = = NSDeleteCharacter ) ) && ( flags = = 0 ) )
[ self sendAction : @ selector ( removeSelected : ) to : [ self delegate ] ] ;
else
if ( ( key = = 0 x20 ) && ( flags = = 0 ) ) // Space
[ self sendAction : @ selector ( markSelected : ) to : [ self delegate ] ] ;
else
[ super keyDown : theEvent ] ;
}
- ( void ) outlineView : ( NSOutlineView * ) outlineView setObjectValue : ( id ) object forTableColumn : ( NSTableColumn * ) tableColumn byItem : ( id ) item
{
if ( ! [ [ tableColumn identifier ] isEqual : @ "0" ] )
return ; // We only want to cover renames .
OVNode * node = item ;
NSString * oldName = [ [ node buffer ] objectAtIndex : 0 ] ;
NSString * newName = object ;
if ( ! [ newName isEqual : oldName ] )
{
BOOL renamed = n2b ( [ ( PyDupeGuruBase * ) py renameSelected : newName ] ) ;
if ( renamed )
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsChangedNotification object : self ] ;
else
[ Dialogs showMessage : [ NSString stringWithFormat : @ "The name '%@' already exists." , newName ] ] ;
}
}
@ end
@ implementation ResultWindowBase
- ( void ) awakeFromNib
{
2010-02-09 13:50:27 +00:00
_displayDelta = NO ;
_powerMode = NO ;
2009-06-01 09:55:11 +00:00
[ self window ] ;
2009-10-30 12:56:05 +00:00
preferencesPanel = [ [ NSWindowController alloc ] initWithWindowNibName : @ "Preferences" ] ;
[ self initResultColumns ] ;
[ self fillColumnsMenu ] ;
2010-02-09 13:50:27 +00:00
[ deltaSwitch setSelectedSegment : 0 ] ;
[ pmSwitch setSelectedSegment : 0 ] ;
[ py setDisplayDeltaValues : b2n ( _displayDelta ) ] ;
[ matches setTarget : self ] ;
2010-02-09 13:55:51 +00:00
[ matches setDoubleAction : @ selector ( openClicked : ) ] ;
2010-02-09 13:50:27 +00:00
[ self refreshStats ] ;
2009-06-01 09:55:11 +00:00
[ [ NSNotificationCenter defaultCenter ] addObserver : self selector : @ selector ( registrationRequired : ) name : RegistrationRequired object : nil ] ;
2010-02-09 13:50:27 +00:00
[ [ NSNotificationCenter defaultCenter ] addObserver : self selector : @ selector ( jobCompleted : ) name : JobCompletedNotification object : nil ] ;
2009-06-01 09:55:11 +00:00
[ [ NSNotificationCenter defaultCenter ] addObserver : self selector : @ selector ( jobStarted : ) name : JobStarted object : nil ] ;
[ [ NSNotificationCenter defaultCenter ] addObserver : self selector : @ selector ( jobInProgress : ) name : JobInProgress object : nil ] ;
2010-02-09 13:50:27 +00:00
[ [ NSNotificationCenter defaultCenter ] addObserver : self selector : @ selector ( resultsMarkingChanged : ) name : ResultsMarkingChangedNotification object : nil ] ;
[ [ NSNotificationCenter defaultCenter ] addObserver : self selector : @ selector ( resultsChanged : ) name : ResultsChangedNotification object : nil ] ;
[ [ NSNotificationCenter defaultCenter ] addObserver : self selector : @ selector ( resultsUpdated : ) name : ResultsUpdatedNotification object : nil ] ;
2009-06-01 09:55:11 +00:00
}
2009-10-30 12:56:05 +00:00
- ( void ) dealloc
{
[ preferencesPanel release ] ;
[ super dealloc ] ;
}
2009-06-14 14:48:47 +00:00
/ * Helpers * /
2009-10-30 12:56:05 +00:00
- ( void ) fillColumnsMenu
{
// The columns menu is supposed to be empty and initResultColumns must have been called
for ( NSTableColumn * col in _resultColumns )
{
NSMenuItem * mi = [ columnsMenu addItemWithTitle : [ [ col headerCell ] stringValue ] action : @ selector ( toggleColumn : ) keyEquivalent : @ "" ] ;
[ mi setTag : [ [ col identifier ] integerValue ] ] ;
[ mi setTarget : self ] ;
if ( [ [ matches tableColumns ] containsObject : col ] )
[ mi setState : NSOnState ] ;
}
[ columnsMenu addItem : [ NSMenuItem separatorItem ] ] ;
NSMenuItem * mi = [ columnsMenu addItemWithTitle : @ "Reset to Default" action : @ selector ( resetColumnsToDefault : ) keyEquivalent : @ "" ] ;
[ mi setTarget : self ] ;
}
2010-01-15 10:19:24 +00:00
- ( NSTableColumn * ) getColumnForIdentifier : ( NSInteger ) aIdentifier title : ( NSString * ) aTitle width : ( NSInteger ) aWidth refCol : ( NSTableColumn * ) aColumn
2009-10-30 12:56:05 +00:00
{
2010-01-15 10:19:24 +00:00
NSNumber * n = [ NSNumber numberWithInteger : aIdentifier ] ;
2009-10-30 12:56:05 +00:00
NSTableColumn * col = [ [ NSTableColumn alloc ] initWithIdentifier : [ n stringValue ] ] ;
[ col setWidth : aWidth ] ;
[ col setEditable : NO ] ;
[ [ col dataCell ] setFont : [ [ aColumn dataCell ] font ] ] ;
[ [ col headerCell ] setStringValue : aTitle ] ;
[ col setResizingMask : NSTableColumnUserResizingMask ] ;
[ col setSortDescriptorPrototype : [ [ NSSortDescriptor alloc ] initWithKey : [ n stringValue ] ascending : YES ] ] ;
return col ;
}
2009-09-01 14:05:00 +00:00
// Returns an array of identifiers , in order .
- ( NSArray * ) getColumnsOrder
{
NSMutableArray * result = [ NSMutableArray array ] ;
2010-02-09 13:45:14 +00:00
for ( NSTableColumn * col in [ matches tableColumns ] ) {
NSString * colId = [ col identifier ] ;
2009-09-01 14:05:00 +00:00
[ result addObject : colId ] ;
}
return result ;
}
- ( NSDictionary * ) getColumnsWidth
{
NSMutableDictionary * result = [ NSMutableDictionary dictionary ] ;
2010-02-09 13:45:14 +00:00
for ( NSTableColumn * col in [ matches tableColumns ] ) {
NSString * colId = [ col identifier ] ;
NSNumber * width = [ NSNumber numberWithDouble : [ col width ] ] ;
2009-09-01 14:05:00 +00:00
[ result setObject : width forKey : colId ] ;
}
return result ;
}
2009-06-14 14:48:47 +00:00
- ( NSArray * ) getSelected : ( BOOL ) aDupesOnly
{
if ( _powerMode )
aDupesOnly = NO ;
NSIndexSet * indexes = [ matches selectedRowIndexes ] ;
NSMutableArray * nodeList = [ NSMutableArray array ] ;
OVNode * node ;
2010-01-15 10:19:24 +00:00
NSInteger i = [ indexes firstIndex ] ;
2009-06-14 14:48:47 +00:00
while ( i ! = NSNotFound )
{
node = [ matches itemAtRow : i ] ;
if ( ! aDupesOnly || ( [ node level ] > 1 ) )
[ nodeList addObject : node ] ;
i = [ indexes indexGreaterThanIndex : i ] ;
}
return nodeList ;
}
- ( NSArray * ) getSelectedPaths : ( BOOL ) aDupesOnly
{
NSMutableArray * r = [ NSMutableArray array ] ;
NSArray * selected = [ self getSelected : aDupesOnly ] ;
2010-02-09 13:45:14 +00:00
for ( OVNode * node in selected ) {
2009-06-14 14:48:47 +00:00
[ r addObject : p2a ( [ node indexPath ] ) ] ;
2010-02-09 13:45:14 +00:00
}
2009-06-14 14:48:47 +00:00
return r ;
}
2009-10-30 12:56:05 +00:00
- ( void ) initResultColumns
{
// Virtual
}
- ( void ) restoreColumnsPosition : ( NSArray * ) aColumnsOrder widths : ( NSDictionary * ) aColumnsWidth
{
2010-02-09 13:45:14 +00:00
for ( NSMenuItem * mi in [ columnsMenu itemArray ] ) {
if ( [ mi state ] = = NSOnState ) {
2009-10-30 12:56:05 +00:00
[ self toggleColumn : mi ] ;
2010-02-09 13:45:14 +00:00
}
2009-10-30 12:56:05 +00:00
}
// Add columns and set widths
2010-02-09 13:45:14 +00:00
for ( NSString * colId in aColumnsOrder ) {
if ( [ colId isEqual : @ "mark" ] ) {
continue ;
}
NSTableColumn * col = [ _resultColumns objectAtIndex : [ colId intValue ] ] ;
NSNumber * width = [ aColumnsWidth objectForKey : [ col identifier ] ] ;
NSMenuItem * mi = [ columnsMenu itemWithTag : [ colId intValue ] ] ;
if ( width ) {
[ col setWidth : [ width floatValue ] ] ;
2009-10-30 12:56:05 +00:00
}
2010-02-09 13:45:14 +00:00
[ self toggleColumn : mi ] ;
2009-10-30 12:56:05 +00:00
}
}
2009-06-16 09:07:33 +00:00
- ( void ) updatePySelection
{
2010-02-09 13:50:27 +00:00
NSArray * selection ;
2010-02-09 13:45:14 +00:00
if ( _powerMode ) {
2010-02-09 13:50:27 +00:00
selection = [ py selectedPowerMarkerNodePaths ] ;
}
2010-02-09 13:45:14 +00:00
else {
2010-02-09 13:50:27 +00:00
selection = [ py selectedResultNodePaths ] ;
}
[ matches selectNodePaths : selection ] ;
2009-06-16 09:07:33 +00:00
}
2009-06-14 14:48:47 +00:00
- ( void ) performPySelection : ( NSArray * ) aIndexPaths
{
2010-02-09 13:45:14 +00:00
if ( _powerMode ) {
2009-06-14 14:48:47 +00:00
[ py selectPowerMarkerNodePaths : aIndexPaths ] ;
2010-02-09 13:45:14 +00:00
}
else {
2009-06-14 14:48:47 +00:00
[ py selectResultNodePaths : aIndexPaths ] ;
2010-02-09 13:45:14 +00:00
}
2009-06-14 14:48:47 +00:00
}
2009-06-14 15:13:11 +00:00
- ( void ) refreshStats
{
[ stats setStringValue : [ py getStatLine ] ] ;
}
2010-02-09 13:45:14 +00:00
/ * Reload the matches outline and restore selection from py * /
- ( void ) reloadMatches
{
[ matches setDelegate : nil ] ;
[ matches reloadData ] ;
[ matches expandItem : nil expandChildren : YES ] ;
[ matches setDelegate : self ] ;
[ self updatePySelection ] ;
}
2009-06-01 09:55:11 +00:00
/ * Actions * /
2010-02-06 10:40:10 +00:00
- ( IBAction ) clearIgnoreList : ( id ) sender
{
NSInteger i = n2i ( [ py getIgnoreListCount ] ) ;
if ( ! i )
return ;
if ( [ Dialogs askYesNo : [ NSString stringWithFormat : @ "Do you really want to remove all %d items from the ignore list?" , i ] ] = = NSAlertSecondButtonReturn ) // NO
return ;
[ py clearIgnoreList ] ;
}
2009-06-01 09:55:11 +00:00
- ( IBAction ) changeDelta : ( id ) sender
{
_displayDelta = [ deltaSwitch selectedSegment ] = = 1 ;
[ py setDisplayDeltaValues : b2n ( _displayDelta ) ] ;
2010-02-09 13:45:14 +00:00
[ self reloadMatches ] ;
2009-06-01 09:55:11 +00:00
}
2009-06-16 08:04:23 +00:00
- ( IBAction ) changePowerMarker : ( id ) sender
{
_powerMode = [ pmSwitch selectedSegment ] = = 1 ;
if ( _powerMode )
[ matches setTag : 2 ] ;
else
[ matches setTag : 0 ] ;
2010-02-09 13:45:14 +00:00
[ matches expandItem : nil expandChildren : YES ] ;
2009-06-16 08:04:23 +00:00
[ self outlineView : matches didClickTableColumn : nil ] ;
2010-02-09 13:50:27 +00:00
[ self updatePySelection ] ;
2009-06-16 08:04:23 +00:00
}
2009-06-01 09:55:11 +00:00
- ( IBAction ) copyMarked : ( id ) sender
{
2010-01-15 10:19:24 +00:00
NSInteger mark_count = [ [ py getMarkCount ] intValue ] ;
2009-06-01 09:55:11 +00:00
if ( ! mark_count )
return ;
NSOpenPanel * op = [ NSOpenPanel openPanel ] ;
[ op setCanChooseFiles : NO ] ;
[ op setCanChooseDirectories : YES ] ;
[ op setCanCreateDirectories : YES ] ;
[ op setAllowsMultipleSelection : NO ] ;
[ op setTitle : @ "Select a directory to copy marked files to" ] ;
if ( [ op runModalForTypes : nil ] = = NSOKButton )
{
NSString * directory = [ [ op filenames ] objectAtIndex : 0 ] ;
NSUserDefaults * ud = [ NSUserDefaults standardUserDefaults ] ;
[ py copyOrMove : b2n ( YES ) markedTo : directory recreatePath : [ ud objectForKey : @ "recreatePathType" ] ] ;
}
}
- ( IBAction ) deleteMarked : ( id ) sender
{
2010-01-15 10:19:24 +00:00
NSInteger mark_count = [ [ py getMarkCount ] intValue ] ;
2009-06-01 09:55:11 +00:00
if ( ! mark_count )
return ;
if ( [ Dialogs askYesNo : [ NSString stringWithFormat : @ "You are about to send %d files to Trash. Continue?" , mark_count ] ] = = NSAlertSecondButtonReturn ) // NO
return ;
NSUserDefaults * ud = [ NSUserDefaults standardUserDefaults ] ;
[ py setRemoveEmptyFolders : [ ud objectForKey : @ "removeEmptyFolders" ] ] ;
[ py deleteMarked ] ;
}
2009-09-01 14:05:00 +00:00
- ( IBAction ) exportToXHTML : ( id ) sender
{
NSString * exported = [ py exportToXHTMLwithColumns : [ self getColumnsOrder ] ] ;
[ [ NSWorkspace sharedWorkspace ] openFile : exported ] ;
}
2010-02-06 10:40:10 +00:00
- ( IBAction ) filter : ( id ) sender
{
NSUserDefaults * ud = [ NSUserDefaults standardUserDefaults ] ;
[ py setEscapeFilterRegexp : b2n ( ! n2b ( [ ud objectForKey : @ "useRegexpFilter" ] ) ) ] ;
[ py applyFilter : [ filterField stringValue ] ] ;
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsChangedNotification object : self ] ;
}
- ( IBAction ) ignoreSelected : ( id ) sender
{
NSArray * nodeList = [ self getSelected : YES ] ;
if ( ! [ nodeList count ] )
return ;
2010-02-06 11:12:20 +00:00
NSString * msg = [ NSString stringWithFormat : @ "All selected %d matches are going to be ignored in all subsequent scans. Continue?" , [ nodeList count ] ] ;
if ( [ Dialogs askYesNo : msg ] = = NSAlertSecondButtonReturn ) // NO
2010-02-06 10:40:10 +00:00
return ;
[ py addSelectedToIgnoreList ] ;
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsChangedNotification object : self ] ;
}
- ( IBAction ) markAll : ( id ) sender
{
[ py markAll ] ;
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsMarkingChangedNotification object : self ] ;
}
- ( IBAction ) markInvert : ( id ) sender
{
[ py markInvert ] ;
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsMarkingChangedNotification object : self ] ;
}
- ( IBAction ) markNone : ( id ) sender
{
[ py markNone ] ;
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsMarkingChangedNotification object : self ] ;
}
- ( IBAction ) markSelected : ( id ) sender
{
[ self performPySelection : [ self getSelectedPaths : YES ] ] ;
[ py toggleSelectedMark ] ;
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsMarkingChangedNotification object : self ] ;
}
- ( IBAction ) markToggle : ( id ) sender
{
OVNode * node = [ matches itemAtRow : [ matches clickedRow ] ] ;
[ self performPySelection : [ NSArray arrayWithObject : p2a ( [ node indexPath ] ) ] ] ;
[ py toggleSelectedMark ] ;
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsMarkingChangedNotification object : self ] ;
}
2009-06-01 09:55:11 +00:00
- ( IBAction ) moveMarked : ( id ) sender
{
2010-01-15 10:19:24 +00:00
NSInteger mark_count = [ [ py getMarkCount ] intValue ] ;
2009-06-01 09:55:11 +00:00
if ( ! mark_count )
return ;
NSOpenPanel * op = [ NSOpenPanel openPanel ] ;
[ op setCanChooseFiles : NO ] ;
[ op setCanChooseDirectories : YES ] ;
[ op setCanCreateDirectories : YES ] ;
[ op setAllowsMultipleSelection : NO ] ;
[ op setTitle : @ "Select a directory to move marked files to" ] ;
if ( [ op runModalForTypes : nil ] = = NSOKButton )
{
NSString * directory = [ [ op filenames ] objectAtIndex : 0 ] ;
NSUserDefaults * ud = [ NSUserDefaults standardUserDefaults ] ;
[ py setRemoveEmptyFolders : [ ud objectForKey : @ "removeEmptyFolders" ] ] ;
[ py copyOrMove : b2n ( NO ) markedTo : directory recreatePath : [ ud objectForKey : @ "recreatePathType" ] ] ;
}
}
2010-02-09 13:55:51 +00:00
- ( IBAction ) openClicked : ( id ) sender
{
if ( [ matches clickedRow ] < 0 ) {
return ;
}
[ matches selectRowIndexes : [ NSIndexSet indexSetWithIndex : [ matches clickedRow ] ] byExtendingSelection : NO ] ;
[ py openSelected ] ;
}
2010-02-06 10:40:10 +00:00
- ( IBAction ) openSelected : ( id ) sender
{
[ self performPySelection : [ self getSelectedPaths : NO ] ] ;
[ py openSelected ] ;
}
- ( IBAction ) refresh : ( id ) sender
{
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsChangedNotification object : self ] ;
}
- ( IBAction ) removeMarked : ( id ) sender
{
int mark_count = [ [ py getMarkCount ] intValue ] ;
if ( ! mark_count )
return ;
if ( [ Dialogs askYesNo : [ NSString stringWithFormat : @ "You are about to remove %d files from results. Continue?" , mark_count ] ] = = NSAlertSecondButtonReturn ) // NO
return ;
[ py removeMarked ] ;
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsChangedNotification object : self ] ;
}
- ( IBAction ) removeSelected : ( id ) sender
{
NSArray * nodeList = [ self getSelected : YES ] ;
if ( ! [ nodeList count ] )
return ;
if ( [ Dialogs askYesNo : [ NSString stringWithFormat : @ "You are about to remove %d files from results. Continue?" , [ nodeList count ] ] ] = = NSAlertSecondButtonReturn ) // NO
return ;
[ self performPySelection : [ self getSelectedPaths : YES ] ] ;
[ py removeSelected ] ;
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsChangedNotification object : self ] ;
}
- ( IBAction ) renameSelected : ( id ) sender
{
NSInteger col = [ matches columnWithIdentifier : @ "0" ] ;
NSInteger row = [ matches selectedRow ] ;
[ matches editColumn : col row : row withEvent : [ NSApp currentEvent ] select : YES ] ;
}
2009-10-30 14:40:17 +00:00
- ( IBAction ) resetColumnsToDefault : ( id ) sender
{
// Virtual
}
2010-02-06 10:40:10 +00:00
- ( IBAction ) revealSelected : ( id ) sender
{
[ self performPySelection : [ self getSelectedPaths : NO ] ] ;
[ py revealSelected ] ;
}
2009-10-30 12:56:05 +00:00
- ( IBAction ) showPreferencesPanel : ( id ) sender
{
[ preferencesPanel showWindow : sender ] ;
}
2009-06-14 14:48:47 +00:00
- ( IBAction ) switchSelected : ( id ) sender
{
2009-09-30 16:29:50 +00:00
// It might look like a complicated way to get the length of the current dupe list on the py side
// but after a lot of fussing around , believe it or not , it actually is .
2010-01-15 10:19:24 +00:00
NSInteger matchesTag = _powerMode ? 2 : 0 ;
NSInteger startLen = [ [ py getOutlineView : matchesTag childCountsForPath : [ NSArray array ] ] count ] ;
2009-06-14 14:48:47 +00:00
[ py makeSelectedReference ] ;
2010-02-05 19:32:57 +00:00
[ self performPySelection : [ self getSelectedPaths : NO ] ] ;
2009-09-30 16:29:50 +00:00
// In some cases ( when in a filtered view in Power Marker mode , it ' s possible that the demoted
// ref is not a part of the filter , making the table smaller . In those cases , we want to do a
// complete reload of the table to avoid a crash .
if ( [ [ py getOutlineView : matchesTag childCountsForPath : [ NSArray array ] ] count ] = = startLen )
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsUpdatedNotification object : self ] ;
else
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsChangedNotification object : self ] ;
2009-06-14 14:48:47 +00:00
}
2009-10-30 12:56:05 +00:00
- ( IBAction ) toggleColumn : ( id ) sender
{
NSMenuItem * mi = sender ;
NSString * colId = [ NSString stringWithFormat : @ "%d" , [ mi tag ] ] ;
NSTableColumn * col = [ matches tableColumnWithIdentifier : colId ] ;
if ( col = = nil )
{
// Add Column
col = [ _resultColumns objectAtIndex : [ mi tag ] ] ;
[ matches addTableColumn : col ] ;
[ mi setState : NSOnState ] ;
}
else
{
// Remove column
[ matches removeTableColumn : col ] ;
[ mi setState : NSOffState ] ;
}
}
2010-02-06 10:40:10 +00:00
- ( IBAction ) toggleDelta : ( id ) sender
{
if ( [ deltaSwitch selectedSegment ] = = 1 )
[ deltaSwitch setSelectedSegment : 0 ] ;
else
[ deltaSwitch setSelectedSegment : 1 ] ;
[ self changeDelta : sender ] ;
}
2009-11-02 15:16:34 +00:00
- ( IBAction ) toggleDetailsPanel : ( id ) sender
{
[ [ ( AppDelegateBase * ) app detailsPanel ] toggleVisibility ] ;
}
2009-06-16 08:04:23 +00:00
- ( IBAction ) togglePowerMarker : ( id ) sender
{
if ( [ pmSwitch selectedSegment ] = = 1 )
[ pmSwitch setSelectedSegment : 0 ] ;
else
[ pmSwitch setSelectedSegment : 1 ] ;
[ self changePowerMarker : sender ] ;
}
2009-06-01 09:55:11 +00:00
/ * Delegate * /
- ( void ) outlineView : ( NSOutlineView * ) outlineView didClickTableColumn : ( NSTableColumn * ) tableColumn
{
if ( [ [ outlineView sortDescriptors ] count ] < 1 )
return ;
NSSortDescriptor * sd = [ [ outlineView sortDescriptors ] objectAtIndex : 0 ] ;
if ( _powerMode )
[ py sortDupesBy : i2n ( [ [ sd key ] intValue ] ) ascending : b2n ( [ sd ascending ] ) ] ;
else
[ py sortGroupsBy : i2n ( [ [ sd key ] intValue ] ) ascending : b2n ( [ sd ascending ] ) ] ;
2010-02-09 13:45:14 +00:00
[ self reloadMatches ] ;
2009-06-01 09:55:11 +00:00
}
2010-02-09 13:59:35 +00:00
- ( void ) outlineView : ( NSOutlineView * ) outlineView willDisplayCell : ( id ) cell forTableColumn : ( NSTableColumn * ) tableColumn item : ( id ) item
{
OVNode * node = item ;
if ( [ [ tableColumn identifier ] isEqual : @ "mark" ] ) {
[ cell setEnabled : [ node isMarkable ] ] ;
}
if ( [ cell isKindOfClass : [ NSTextFieldCell class ] ] ) {
// Determine if the text color will be blue due to directory being reference .
NSTextFieldCell * textCell = cell ;
if ( [ node isMarkable ] ) {
[ textCell setTextColor : [ NSColor blackColor ] ] ;
}
else {
[ textCell setTextColor : [ NSColor blueColor ] ] ;
}
if ( ( _displayDelta ) && ( _powerMode || ( [ node level ] > 1 ) ) ) {
NSInteger i = [ [ tableColumn identifier ] integerValue ] ;
if ( [ _deltaColumns containsIndex : i ] ) {
[ textCell setTextColor : [ NSColor orangeColor ] ] ;
}
}
}
}
2009-06-01 09:55:11 +00:00
/ * Notifications * /
- ( void ) windowWillClose : ( NSNotification * ) aNotification
{
[ NSApp hide : NSApp ] ;
}
- ( void ) jobCompleted : ( NSNotification * ) aNotification
{
[ [ NSNotificationCenter defaultCenter ] postNotificationName : ResultsChangedNotification object : self ] ;
2010-01-15 10:19:24 +00:00
NSInteger r = n2i ( [ py getOperationalErrorCount ] ) ;
2009-06-01 09:55:11 +00:00
id lastAction = [ [ ProgressController mainProgressController ] jobId ] ;
2010-01-13 09:39:27 +00:00
if ( [ lastAction isEqualTo : jobCopy ] ) {
2009-06-01 09:55:11 +00:00
if ( r > 0 )
[ Dialogs showMessage : [ NSString stringWithFormat : @ "%d file(s) couldn't be copied." , r ] ] ;
else
[ Dialogs showMessage : @ "All marked files were copied sucessfully." ] ;
}
2010-01-13 09:39:27 +00:00
else if ( [ lastAction isEqualTo : jobMove ] ) {
2009-06-01 09:55:11 +00:00
if ( r > 0 )
[ Dialogs showMessage : [ NSString stringWithFormat : @ "%d file(s) couldn't be moved. They were kept in the results, and still are marked." , r ] ] ;
else
[ Dialogs showMessage : @ "All marked files were moved sucessfully." ] ;
}
2010-01-13 09:39:27 +00:00
else if ( [ lastAction isEqualTo : jobDelete ] ) {
if ( r > 0 ) {
2009-12-15 16:23:02 +00:00
NSString * msg = @ "%d file(s) couldn't be sent to Trash. They were kept in the results, " \
"and still are marked. See the F.A.Q. section in the help file for details." ;
[ Dialogs showMessage : [ NSString stringWithFormat : msg , r ] ] ;
}
2009-06-01 09:55:11 +00:00
else
[ Dialogs showMessage : @ "All marked files were sucessfully sent to Trash." ] ;
}
2010-01-13 09:39:27 +00:00
else if ( [ lastAction isEqualTo : jobScan ] ) {
NSInteger groupCount = [ [ py getOutlineView : 0 childCountsForPath : [ NSArray array ] ] count ] ;
if ( groupCount = = 0 )
[ Dialogs showMessage : @ "No duplicates found." ] ;
}
2009-06-01 09:55:11 +00:00
// Re - activate toolbar items right after the progress bar stops showing instead of waiting until
// a mouse - over is performed
[ [ [ self window ] toolbar ] validateVisibleItems ] ;
}
- ( void ) jobInProgress : ( NSNotification * ) aNotification
{
[ Dialogs showMessage : @ "A previous action is still hanging in there. You can't start a new one yet. Wait a few seconds, then try again." ] ;
}
- ( void ) jobStarted : ( NSNotification * ) aNotification
{
NSDictionary * ui = [ aNotification userInfo ] ;
NSString * desc = [ ui valueForKey : @ "desc" ] ;
[ [ ProgressController mainProgressController ] setJobDesc : desc ] ;
NSString * jobid = [ ui valueForKey : @ "jobid" ] ;
[ [ ProgressController mainProgressController ] setJobId : jobid ] ;
[ [ ProgressController mainProgressController ] showSheetForParent : [ self window ] ] ;
}
- ( void ) registrationRequired : ( NSNotification * ) aNotification
{
NSString * msg = @ "This is a demo version, which only allows you 10 delete/copy/move actions per session. You cannot continue." ;
[ Dialogs showMessage : msg ] ;
}
2010-02-05 19:16:56 +00:00
- ( void ) outlineViewSelectionDidChange : ( NSNotification * ) notification
{
[ self performPySelection : [ self getSelectedPaths : NO ] ] ;
}
2009-06-14 15:13:11 +00:00
- ( void ) resultsChanged : ( NSNotification * ) aNotification
{
2010-02-09 13:45:14 +00:00
[ self reloadMatches ] ;
2009-06-14 15:13:11 +00:00
[ self refreshStats ] ;
}
2010-02-05 19:16:56 +00:00
- ( void ) resultsMarkingChanged : ( NSNotification * ) aNotification
{
[ matches invalidateMarkings ] ;
[ self refreshStats ] ;
}
2009-06-14 15:13:11 +00:00
- ( void ) resultsUpdated : ( NSNotification * ) aNotification
{
2010-02-09 13:50:27 +00:00
[ matches invalidateBuffers ] ;
2009-11-02 14:40:29 +00:00
[ matches invalidateMarkings ] ;
2009-06-14 15:13:11 +00:00
}
2009-06-01 09:55:11 +00:00
- ( BOOL ) validateToolbarItem : ( NSToolbarItem * ) theItem
{
return ! [ [ ProgressController mainProgressController ] isShown ] ;
}
- ( BOOL ) validateMenuItem : ( NSMenuItem * ) item
{
return ! [ [ ProgressController mainProgressController ] isShown ] ;
}
@ end