transmission/macosx/FileRenameSheetController.m

118 lines
3.9 KiB
Objective-C

//
// FileRenameSheetController.m
// Transmission
//
// Created by Mitchell Livingston on 1/20/13.
// Copyright (c) 2013 The Transmission Project. All rights reserved.
//
#import "FileRenameSheetController.h"
#import "FileListNode.h"
#import "Torrent.h"
typedef void (^CompletionBlock)(BOOL);
@interface FileRenameSheetController ()
@property (nonatomic, retain) Torrent * torrent;
@property (nonatomic, retain) FileListNode * node;
@property (nonatomic, copy) CompletionBlock completionHandler;
@end
@implementation FileRenameSheetController
+ (void) presentSheetForTorrent: (Torrent *) torrent modalForWindow: (NSWindow *) window completionHandler: (void (^)(BOOL didRename)) completionHandler
{
NSParameterAssert(torrent != nil);
NSParameterAssert(window != nil);
FileRenameSheetController * renamer = [[FileRenameSheetController alloc] initWithWindowNibName: @"FileRenameSheetController"];
renamer.torrent = torrent;
renamer.completionHandler = completionHandler;
[NSApp beginSheet: [renamer window] modalForWindow: window modalDelegate: self didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) contextInfo: renamer];
}
+ (void) presentSheetForFileListNode: (FileListNode *) node modalForWindow: (NSWindow *) window completionHandler: (void (^)(BOOL didRename)) completionHandler
{
NSParameterAssert(node != nil);
NSParameterAssert(window != nil);
FileRenameSheetController * renamer = [[FileRenameSheetController alloc] initWithWindowNibName: @"FileRenameSheetController"];
renamer.torrent = [node torrent];
renamer.node = node;
renamer.completionHandler = completionHandler;
[NSApp beginSheet: [renamer window] modalForWindow: window modalDelegate: self didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) contextInfo: renamer];
}
+ (void) sheetDidEnd: (NSWindow *) sheet returnCode: (NSInteger) returnCode contextInfo: (void *) contextInfo
{
FileRenameSheetController * renamer = contextInfo;
NSParameterAssert([renamer isKindOfClass:[FileRenameSheetController class]]);
renamer.completionHandler(returnCode == NSOKButton);
//TODO: retain/release logic needs to be figured out for ARC (when ARC is enabled)
[renamer release];
[sheet orderOut: self];
}
- (void) dealloc
{
[_torrent release];
[_node release];
[_completionHandler release];
[super dealloc];
}
- (void) windowDidLoad
{
[super windowDidLoad];
NSString * name = self.node ? [self.node name] : [self.torrent name];
NSString * label = [NSString stringWithFormat: NSLocalizedString(@"Rename the file \"%@\":", "rename sheet label"), name];
[self.labelField setStringValue: label];
[self.inputField setStringValue: name];
[self.renameButton setEnabled: NO];
#warning size these
[self.renameButton setStringValue: NSLocalizedString(@"Rename", "rename sheet button")];
[self.cancelButton setStringValue: NSLocalizedString(@"Cancel", "rename sheet button")];
}
- (IBAction) rename: (id) sender;
{
void (^completionHandler)(BOOL) = ^(BOOL didRename) {
if (didRename)
[NSApp endSheet: [self window] returnCode: NSOKButton];
else
{
#warning more thorough error
NSBeep();
}
};
if (self.node)
[self.torrent renameFileNode: self.node withName: [self.inputField stringValue] completionHandler: completionHandler];
else
[self.torrent renameTorrent: [self.inputField stringValue] completionHandler: completionHandler];
}
- (IBAction) cancelRename: (id) sender
{
[NSApp endSheet: [self window] returnCode: NSCancelButton];
}
- (void) controlTextDidChange: (NSNotification *) notification
{
[self.renameButton setEnabled: ![[self.inputField stringValue] isEqualToString: @""] && ![[self.inputField stringValue] isEqualToString: [self.torrent name]]];
}
@end