#1220 Initial Mac support for changing file and folder names. Not fully complete.

This commit is contained in:
Mitchell Livingston
2013-01-22 00:09:48 +00:00
parent 2262c7c565
commit 9236571f1c
17 changed files with 1028 additions and 118 deletions
+10
View File
@@ -169,6 +169,8 @@
A242AD9315F05D23002B3A6C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A242AD9115F05D23002B3A6C /* Localizable.strings */; };
A245030C0D6A1FB000B49D00 /* UpArrowGroupTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A245030B0D6A1FB000B49D00 /* UpArrowGroupTemplate.png */; };
A245030E0D6A1FBC00B49D00 /* DownArrowGroupTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A245030D0D6A1FBC00B49D00 /* DownArrowGroupTemplate.png */; };
A2451E6916ACE4EB00586E0E /* FileRenameSheetController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2451E6716ACE4EB00586E0E /* FileRenameSheetController.m */; };
A2451E6A16ACE4EB00586E0E /* FileRenameSheetController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2451E6816ACE4EB00586E0E /* FileRenameSheetController.xib */; };
A24621410C769D0900088E81 /* trevent.h in Headers */ = {isa = PBXBuildFile; fileRef = A24621350C769CF400088E81 /* trevent.h */; };
A24621420C769D0900088E81 /* trevent.c in Sources */ = {isa = PBXBuildFile; fileRef = A24621360C769CF400088E81 /* trevent.c */; };
A247A443114C701800547DFC /* InfoViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = A247A442114C701800547DFC /* InfoViewController.h */; };
@@ -782,6 +784,9 @@
A242AD9215F05D23002B3A6C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = macosx/QuickLookPlugin/en.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; };
A245030B0D6A1FB000B49D00 /* UpArrowGroupTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = UpArrowGroupTemplate.png; path = macosx/Images/UpArrowGroupTemplate.png; sourceTree = "<group>"; };
A245030D0D6A1FBC00B49D00 /* DownArrowGroupTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = DownArrowGroupTemplate.png; path = macosx/Images/DownArrowGroupTemplate.png; sourceTree = "<group>"; };
A2451E6616ACE4EB00586E0E /* FileRenameSheetController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileRenameSheetController.h; path = macosx/FileRenameSheetController.h; sourceTree = "<group>"; };
A2451E6716ACE4EB00586E0E /* FileRenameSheetController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FileRenameSheetController.m; path = macosx/FileRenameSheetController.m; sourceTree = "<group>"; };
A2451E6816ACE4EB00586E0E /* FileRenameSheetController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FileRenameSheetController.xib; path = macosx/FileRenameSheetController.xib; sourceTree = "<group>"; };
A24621350C769CF400088E81 /* trevent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = trevent.h; path = libtransmission/trevent.h; sourceTree = "<group>"; };
A24621360C769CF400088E81 /* trevent.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = trevent.c; path = libtransmission/trevent.c; sourceTree = "<group>"; };
A247A442114C701800547DFC /* InfoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InfoViewController.h; path = macosx/InfoViewController.h; sourceTree = "<group>"; };
@@ -1410,6 +1415,9 @@
29B97314FDCFA39411CA2CEA /* Transmission */ = {
isa = PBXGroup;
children = (
A2451E6616ACE4EB00586E0E /* FileRenameSheetController.h */,
A2451E6716ACE4EB00586E0E /* FileRenameSheetController.m */,
A2451E6816ACE4EB00586E0E /* FileRenameSheetController.xib */,
4DDBB70A09E16B3200284745 /* GUI */,
A2F35BC315C5A0A100EBF632 /* QuickLookPlugin */,
4D1838DC09DEC04A0047D688 /* libtransmission */,
@@ -2538,6 +2546,7 @@
A2DC49C2158430CB00758FF1 /* YellowDot@2x.png in Resources */,
A2DC49C4158430E200758FF1 /* YingYangGroupTemplate@2x.png in Resources */,
A2DC49C6158430FB00758FF1 /* YingYangTemplate@2x.png in Resources */,
A2451E6A16ACE4EB00586E0E /* FileRenameSheetController.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -2749,6 +2758,7 @@
A2966E8713DAF74C007B52DF /* GlobalOptionsPopoverViewController.m in Sources */,
A234EA541453563B000F3E97 /* NSImageAdditions.m in Sources */,
A2AB883E16A399A6008FAD50 /* VDKQueue.m in Sources */,
A2451E6916ACE4EB00586E0E /* FileRenameSheetController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
+2
View File
@@ -173,6 +173,8 @@ typedef enum
- (void) revealFile: (id) sender;
- (IBAction) renameSelected: (id) sender;
- (void) announceSelectedTorrents: (id) sender;
- (void) verifySelectedTorrents: (id) sender;
+16
View File
@@ -47,6 +47,7 @@
#import "BlocklistDownloader.h"
#import "StatusBarController.h"
#import "FilterBarController.h"
#import "FileRenameSheetController.h"
#import "BonjourController.h"
#import "Badger.h"
#import "DragOverlayWindow.h"
@@ -1740,6 +1741,17 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs: paths];
}
- (IBAction) renameSelected: (id) sender
{
NSArray * selected = [fTableView selectedTorrents];
NSAssert([selected count] == 1, @"1 transfer needs to be selected to rename, but %ld are selected", [selected count]);
Torrent * torrent = selected[0];
[FileRenameSheetController presentSheetForTorrent:torrent modalForWindow: fWindow completionHandler: ^(BOOL didRename) {
NSLog(@"finished");
}];
}
- (void) announceSelectedTorrents: (id) sender
{
for (Torrent * torrent in [fTableView selectedTorrents])
@@ -4285,6 +4297,10 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
//enable reveal in finder
if (action == @selector(revealFile:))
return canUseTable && [fTableView numberOfSelectedRows] > 0;
//enable renaming file/folder
if (action == @selector(renameSelectedTorrent:))
return canUseTable && [fTableView numberOfSelectedRows] == 1;
//enable remove items
if (action == @selector(removeNoDelete:) || action == @selector(removeDeleteData:))
+7 -5
View File
@@ -40,15 +40,17 @@
BOOL fIsFolder;
}
@property (nonatomic, readonly) NSString * name;
@property (nonatomic, readonly) NSString * path;
@property (nonatomic, copy, readonly) NSString * name;
@property (nonatomic, copy, readonly) NSString * path;
@property (nonatomic, readonly) Torrent * torrent;
@property (nonatomic, readonly) uint64_t size;
@property (nonatomic, readonly) NSImage * icon;
@property (nonatomic, retain, readonly) NSImage * icon;
@property (nonatomic, readonly) BOOL isFolder;
@property (nonatomic, retain, readonly) NSIndexSet * indexes;
- (id) initWithFolderName: (NSString *) name path: (NSString *) path torrent: (Torrent *) torrent;
- (id) initWithFileName: (NSString *) name path: (NSString *) path size: (uint64_t) size index: (NSUInteger) index torrent: (Torrent *) torrent;
@@ -57,8 +59,8 @@
- (NSString *) description;
- (NSIndexSet *) indexes;
- (NSMutableArray *) children;
- (BOOL) updateFromOldName: (NSString *) oldName toNewName: (NSString *) newName inPath: (NSString *) path;
@end
+42 -7
View File
@@ -39,6 +39,7 @@
@synthesize size = fSize;
@synthesize icon = fIcon;
@synthesize isFolder = fIsFolder;
@synthesize indexes = fIndexes;
- (id) initWithFolderName: (NSString *) name path: (NSString *) path torrent: (Torrent *) torrent
{
@@ -104,11 +105,6 @@
return [NSString stringWithFormat: @"%@ (folder: %@)", fName, fIndexes];
}
- (NSIndexSet *) indexes
{
return fIndexes;
}
- (NSImage *) icon
{
if (!fIcon)
@@ -124,6 +120,45 @@
return fChildren;
}
- (BOOL) updateFromOldName: (NSString *) oldName toNewName: (NSString *) newName inPath: (NSString *) path
{
NSParameterAssert(oldName != nil);
NSParameterAssert(newName != nil);
NSParameterAssert(path != nil);
NSArray * lookupPathComponents = [path pathComponents];
NSArray * thesePathComponents = [self.path pathComponents];
if ([lookupPathComponents isEqualToArray: thesePathComponents]) //this node represents what's being renamed
{
if ([oldName isEqualToString: self.name])
{
[fName release];
fName = [newName copy];
return YES;
}
}
else if ([lookupPathComponents count] < [thesePathComponents count]) //what's being renamed is part of this node's path
{
lookupPathComponents = [lookupPathComponents arrayByAddingObject: oldName];
const BOOL allSame = NSNotFound == [lookupPathComponents indexOfObjectWithOptions: NSEnumerationConcurrent passingTest: ^BOOL(NSString * name, NSUInteger idx, BOOL * stop) {
return ![name isEqualToString: thesePathComponents[idx]];
}];
if (allSame)
{
NSString * oldPathPrefix = [path stringByAppendingPathComponent: oldName];
NSString * newPathPrefix = [path stringByAppendingPathComponent: newName];
[fPath autorelease];
fPath = [[fPath stringByReplacingCharactersInRange: NSMakeRange(0, [oldPathPrefix length]) withString: newPathPrefix] retain];
return YES;
}
}
return NO;
}
@end
@implementation FileListNode (Private)
@@ -133,8 +168,8 @@
if ((self = [super init]))
{
fIsFolder = isFolder;
fName = [name retain];
fPath = [path retain];
fName = [name copy];
fPath = [path copy];
fIndexes = [[NSMutableIndexSet alloc] init];
+2
View File
@@ -53,4 +53,6 @@
- (void) revealFile: (id) sender;
- (IBAction) renameSelected: (id) sender;
@end
+43 -3
View File
@@ -24,9 +24,10 @@
#import "FileOutlineController.h"
#import "Torrent.h"
#import "FileListNode.h"
#import "FileOutlineView.h"
#import "FilePriorityCell.h"
#import "FileListNode.h"
#import "FileRenameSheetController.h"
#import "NSApplicationAdditions.h"
#import "NSMutableArrayAdditions.h"
#import "NSStringAdditions.h"
@@ -431,6 +432,31 @@ typedef enum
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs: paths];
}
- (IBAction) renameSelected: (id) sender
{
NSIndexSet * indexes = [fOutline selectedRowIndexes];
NSAssert([indexes count] == 1, @"1 file needs to be selected to rename, but %ld are selected", [indexes count]);
FileListNode * node = [fOutline itemAtRow: [indexes firstIndex]];
Torrent * torrent = [node torrent];
if (![torrent isFolder])
{
[FileRenameSheetController presentSheetForTorrent: torrent modalForWindow: [fOutline window] completionHandler: ^(BOOL didRename) {
#warning need to re-sort
if (didRename)
[[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil];
}];
}
else
{
[FileRenameSheetController presentSheetForFileListNode: node modalForWindow: [fOutline window] completionHandler: ^(BOOL didRename) {
#warning need to re-sort
if (didRename)
[[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil];
}];
}
}
#warning make real view controller (Leopard-only) so that Command-R will work
- (BOOL) validateMenuItem: (NSMenuItem *) menuItem
{
@@ -518,6 +544,11 @@ typedef enum
return canChange;
}
if (action == @selector(renameSelected:))
{
return [fOutline numberOfSelectedRows] == 1;
}
return YES;
}
@@ -529,9 +560,18 @@ typedef enum
{
NSMenu * menu = [[NSMenu alloc] initWithTitle: @"File Outline Menu"];
//rename
NSMenuItem * item = [[NSMenuItem alloc] initWithTitle: [NSLocalizedString(@"Rename", "File Outline -> Menu") stringByAppendingEllipsis]
action: @selector(renameSelected:) keyEquivalent: @""];
[item setTarget: self];
[menu addItem: item];
[item release];
[menu addItem: [NSMenuItem separatorItem]];
//check and uncheck
NSMenuItem * item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"Check Selected", "File Outline -> Menu")
action: @selector(setCheck:) keyEquivalent: @""];
item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"Check Selected", "File Outline -> Menu")
action: @selector(setCheck:) keyEquivalent: @""];
[item setTarget: self];
[item setTag: FILE_CHECK_TAG];
[menu addItem: item];
+27
View File
@@ -0,0 +1,27 @@
//
// FileRenameSheetController.h
// Transmission
//
// Created by Mitchell Livingston on 1/20/13.
// Copyright (c) 2013 The Transmission Project. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@class FileListNode;
@class Torrent;
@interface FileRenameSheetController : NSWindowController
+ (void) presentSheetForTorrent: (Torrent *) torrent modalForWindow: (NSWindow *) window completionHandler: (void (^)(BOOL didRename)) completionHandler;
+ (void) presentSheetForFileListNode: (FileListNode *) node modalForWindow: (NSWindow *) window completionHandler: (void (^)(BOOL didRename)) completionHandler;
@property (assign) IBOutlet NSTextField * labelField;
@property (assign) IBOutlet NSTextField * inputField;
@property (assign) IBOutlet NSButton * renameButton;
@property (assign) IBOutlet NSButton * cancelButton;
- (IBAction) rename: (id) sender;
- (IBAction) cancelRename: (id) sender;
@end
+118
View File
@@ -0,0 +1,118 @@
//
// 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;
if (self.node)
label = [NSString stringWithFormat: NSLocalizedString(@"Rename \"%@\":", "rename sheet label"), name];
else
label = [NSString stringWithFormat: NSLocalizedString(@"Rename the transfer \"%@\":", "rename sheet label"), name];
[self.labelField setStringValue: label];
[self.inputField setStringValue: name];
[self.renameButton setEnabled: NO];
}
- (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
+391
View File
@@ -0,0 +1,391 @@
<?xml version="1.0" encoding="UTF-8"?>
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1080</int>
<string key="IBDocument.SystemVersion">12C60</string>
<string key="IBDocument.InterfaceBuilderVersion">2844</string>
<string key="IBDocument.AppKitVersion">1187.34</string>
<string key="IBDocument.HIToolboxVersion">625.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">2844</string>
</object>
<array key="IBDocument.IntegratedClassDependencies">
<string>NSButton</string>
<string>NSButtonCell</string>
<string>NSCustomObject</string>
<string>NSTextField</string>
<string>NSTextFieldCell</string>
<string>NSView</string>
<string>NSWindowTemplate</string>
</array>
<array key="IBDocument.PluginDependencies">
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</array>
<object class="NSMutableDictionary" key="IBDocument.Metadata">
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
<integer value="1" key="NS.object.0"/>
</object>
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<object class="NSCustomObject" id="1001">
<string key="NSClassName">FileRenameSheetController</string>
</object>
<object class="NSCustomObject" id="1003">
<string key="NSClassName">FirstResponder</string>
</object>
<object class="NSCustomObject" id="1004">
<string key="NSClassName">NSApplication</string>
</object>
<object class="NSWindowTemplate" id="1005">
<int key="NSWindowStyleMask">15</int>
<int key="NSWindowBacking">2</int>
<string key="NSWindowRect">{{196, 240}, {400, 120}}</string>
<int key="NSWTFlags">544735232</int>
<string key="NSWindowTitle">Window</string>
<string key="NSWindowClass">NSWindow</string>
<nil key="NSViewClass"/>
<nil key="NSUserInterfaceItemIdentifier"/>
<string key="NSWindowContentMaxSize">{9999, 120}</string>
<string key="NSWindowContentMinSize">{300, 120}</string>
<object class="NSView" key="NSWindowView" id="1006">
<reference key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSButton" id="158751204">
<reference key="NSNextResponder" ref="1006"/>
<int key="NSvFlags">289</int>
<string key="NSFrame">{{296, 13}, {90, 32}}</string>
<reference key="NSSuperview" ref="1006"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="464989931">
<int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">134217728</int>
<string key="NSContents">Rename</string>
<object class="NSFont" key="NSSupport" id="599881464">
<string key="NSName">LucidaGrande</string>
<double key="NSSize">13</double>
<int key="NSfFlags">1044</int>
</object>
<string key="NSCellIdentifier">_NS:9</string>
<reference key="NSControlView" ref="158751204"/>
<int key="NSButtonFlags">-2038284288</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
<string type="base64-UTF8" key="NSKeyEquivalent">DQ</string>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="289188328">
<reference key="NSNextResponder" ref="1006"/>
<int key="NSvFlags">289</int>
<string key="NSFrame">{{206, 13}, {90, 32}}</string>
<reference key="NSSuperview" ref="1006"/>
<reference key="NSNextKeyView" ref="158751204"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="16195064">
<int key="NSCellFlags">67108864</int>
<int key="NSCellFlags2">134217728</int>
<string key="NSContents">Cancel</string>
<reference key="NSSupport" ref="599881464"/>
<string key="NSCellIdentifier">_NS:9</string>
<reference key="NSControlView" ref="289188328"/>
<int key="NSButtonFlags">-2038284288</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
<string type="base64-UTF8" key="NSKeyEquivalent">Gw</string>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="307156222">
<reference key="NSNextResponder" ref="1006"/>
<int key="NSvFlags">266</int>
<string key="NSFrame">{{17, 83}, {369, 17}}</string>
<reference key="NSSuperview" ref="1006"/>
<reference key="NSNextKeyView" ref="713959564"/>
<string key="NSReuseIdentifierKey">_NS:1535</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="837591060">
<int key="NSCellFlags">67108928</int>
<int key="NSCellFlags2">272632320</int>
<string key="NSContents">Rename text</string>
<reference key="NSSupport" ref="599881464"/>
<string key="NSCellIdentifier">_NS:1535</string>
<reference key="NSControlView" ref="307156222"/>
<object class="NSColor" key="NSBackgroundColor">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">controlColor</string>
<object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
</object>
</object>
<object class="NSColor" key="NSTextColor">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">controlTextColor</string>
<object class="NSColor" key="NSColor" id="586059238">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MAA</bytes>
</object>
</object>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="713959564">
<reference key="NSNextResponder" ref="1006"/>
<int key="NSvFlags">290</int>
<string key="NSFrame">{{20, 51}, {360, 22}}</string>
<reference key="NSSuperview" ref="1006"/>
<reference key="NSNextKeyView" ref="289188328"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="160440583">
<int key="NSCellFlags">-1804599231</int>
<int key="NSCellFlags2">272630784</int>
<string key="NSContents"/>
<reference key="NSSupport" ref="599881464"/>
<string key="NSCellIdentifier">_NS:9</string>
<reference key="NSControlView" ref="713959564"/>
<bool key="NSDrawsBackground">YES</bool>
<object class="NSColor" key="NSBackgroundColor">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">textBackgroundColor</string>
<object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
</object>
</object>
<object class="NSColor" key="NSTextColor">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">textColor</string>
<reference key="NSColor" ref="586059238"/>
</object>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
</array>
<string key="NSFrameSize">{400, 120}</string>
<reference key="NSSuperview"/>
<reference key="NSNextKeyView" ref="307156222"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
<string key="NSMinSize">{300, 142}</string>
<string key="NSMaxSize">{9999, 142}</string>
<string key="NSFrameAutosaveName">RenameFileWindow</string>
<bool key="NSWindowIsRestorable">NO</bool>
</object>
</array>
<object class="IBObjectContainer" key="IBDocument.Objects">
<array class="NSMutableArray" key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">window</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="1005"/>
</object>
<int key="connectionID">3</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">cancelButton</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="289188328"/>
</object>
<int key="connectionID">15</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">renameButton</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="158751204"/>
</object>
<int key="connectionID">16</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">labelField</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="307156222"/>
</object>
<int key="connectionID">17</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">cancelRename:</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="289188328"/>
</object>
<int key="connectionID">19</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">rename:</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="158751204"/>
</object>
<int key="connectionID">20</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">inputField</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="713959564"/>
</object>
<int key="connectionID">21</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">delegate</string>
<reference key="source" ref="1005"/>
<reference key="destination" ref="1001"/>
</object>
<int key="connectionID">4</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">delegate</string>
<reference key="source" ref="713959564"/>
<reference key="destination" ref="1001"/>
</object>
<int key="connectionID">22</int>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects">
<object class="IBObjectRecord">
<int key="objectID">0</int>
<array key="object" id="0"/>
<reference key="children" ref="1000"/>
<nil key="parent"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">-2</int>
<reference key="object" ref="1001"/>
<reference key="parent" ref="0"/>
<string key="objectName">File's Owner</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">-1</int>
<reference key="object" ref="1003"/>
<reference key="parent" ref="0"/>
<string key="objectName">First Responder</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">-3</int>
<reference key="object" ref="1004"/>
<reference key="parent" ref="0"/>
<string key="objectName">Application</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">1</int>
<reference key="object" ref="1005"/>
<array class="NSMutableArray" key="children">
<reference ref="1006"/>
</array>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2</int>
<reference key="object" ref="1006"/>
<array class="NSMutableArray" key="children">
<reference ref="307156222"/>
<reference ref="713959564"/>
<reference ref="158751204"/>
<reference ref="289188328"/>
</array>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">5</int>
<reference key="object" ref="158751204"/>
<array class="NSMutableArray" key="children">
<reference ref="464989931"/>
</array>
<reference key="parent" ref="1006"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">6</int>
<reference key="object" ref="464989931"/>
<reference key="parent" ref="158751204"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">9</int>
<reference key="object" ref="289188328"/>
<array class="NSMutableArray" key="children">
<reference ref="16195064"/>
</array>
<reference key="parent" ref="1006"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10</int>
<reference key="object" ref="16195064"/>
<reference key="parent" ref="289188328"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">11</int>
<reference key="object" ref="307156222"/>
<array class="NSMutableArray" key="children">
<reference ref="837591060"/>
</array>
<reference key="parent" ref="1006"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">12</int>
<reference key="object" ref="837591060"/>
<reference key="parent" ref="307156222"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">13</int>
<reference key="object" ref="713959564"/>
<array class="NSMutableArray" key="children">
<reference ref="160440583"/>
</array>
<reference key="parent" ref="1006"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">14</int>
<reference key="object" ref="160440583"/>
<reference key="parent" ref="713959564"/>
</object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="1.IBWindowTemplateEditedContentRect">{{357, 418}, {480, 270}}</string>
<boolean value="NO" key="1.NSWindowTemplate.visibleAtLaunch"/>
<string key="10.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="11.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="12.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="13.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="14.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="9.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">22</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes"/>
<int key="IBDocument.localizationMode">0</int>
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
</data>
</archive>
+13
View File
@@ -0,0 +1,13 @@
//
// FileRenameViewController.h
// Transmission
//
// Created by Mitchell Livingston on 1/20/13.
// Copyright (c) 2013 The Transmission Project. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface FileRenameViewController : NSViewController
@end
+27
View File
@@ -0,0 +1,27 @@
//
// FileRenameViewController.m
// Transmission
//
// Created by Mitchell Livingston on 1/20/13.
// Copyright (c) 2013 The Transmission Project. All rights reserved.
//
#import "FileRenameViewController.h"
@interface FileRenameViewController ()
@end
@implementation FileRenameViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Initialization code here.
}
return self;
}
@end
+123
View File
@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1070</int>
<string key="IBDocument.SystemVersion">12C60</string>
<string key="IBDocument.InterfaceBuilderVersion">2844</string>
<string key="IBDocument.AppKitVersion">1187.34</string>
<string key="IBDocument.HIToolboxVersion">625.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">2844</string>
</object>
<array key="IBDocument.IntegratedClassDependencies">
<string>NSCustomObject</string>
<string>NSCustomView</string>
</array>
<array key="IBDocument.PluginDependencies">
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</array>
<object class="NSMutableDictionary" key="IBDocument.Metadata">
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
<integer value="1" key="NS.object.0"/>
</object>
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<object class="NSCustomObject" id="1001">
<string key="NSClassName">FileRenameViewController</string>
</object>
<object class="NSCustomObject" id="1003">
<string key="NSClassName">FirstResponder</string>
</object>
<object class="NSCustomObject" id="1004">
<string key="NSClassName">NSApplication</string>
</object>
<object class="NSCustomView" id="1005">
<reference key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<array class="NSMutableArray" key="NSSubviews"/>
<string key="NSFrameSize">{480, 272}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<string key="NSClassName">NSView</string>
</object>
</array>
<object class="IBObjectContainer" key="IBDocument.Objects">
<array class="NSMutableArray" key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">view</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="1005"/>
</object>
<int key="connectionID">2</int>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects">
<object class="IBObjectRecord">
<int key="objectID">0</int>
<array key="object" id="0"/>
<reference key="children" ref="1000"/>
<nil key="parent"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">-2</int>
<reference key="object" ref="1001"/>
<reference key="parent" ref="0"/>
<string key="objectName">File's Owner</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">-1</int>
<reference key="object" ref="1003"/>
<reference key="parent" ref="0"/>
<string key="objectName">First Responder</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">-3</int>
<reference key="object" ref="1004"/>
<reference key="parent" ref="0"/>
<string key="objectName">Application</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">1</int>
<reference key="object" ref="1005"/>
<array class="NSMutableArray" key="children"/>
<reference key="parent" ref="0"/>
</object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">7</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription">
<string key="className">FileRenameViewController</string>
<string key="superclassName">NSViewController</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">./Classes/FileRenameViewController.h</string>
</object>
</object>
</array>
</object>
<int key="IBDocument.localizationMode">0</int>
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
<integer value="1070" key="NS.object.0"/>
</object>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
<bool key="IBDocument.UseAutolayout">YES</bool>
</data>
</archive>
+3
View File
@@ -2,6 +2,7 @@ EXTRA_DIST = \
Credits.rtf \
AboutWindow.xib \
BlocklistStatusWindow.xib \
FileRenameSheetController.xib \
FilterBar.xib \
InfoFileView.xib \
InfoPeersView.xib \
@@ -65,6 +66,8 @@ EXTRA_DIST = \
ExpandedPathToIconTransformer.m \
ExpandedPathToPathTransformer.h \
ExpandedPathToPathTransformer.m \
FileRenameSheetController.h \
FileRenameSheetController.m \
FileListNode.h \
FileListNode.m \
FileNameCell.h \
+3
View File
@@ -164,6 +164,9 @@ typedef enum {
- (NSString *) dataLocation;
- (NSString *) fileLocation: (FileListNode *) node;
- (void) renameTorrent: (NSString *) newName completionHandler: (void (^)(BOOL didRename)) completionHandler;
- (void) renameFileNode: (FileListNode *) node withName: (NSString *) newName completionHandler: (void (^)(BOOL didRename)) completionHandler;
- (CGFloat) progress;
- (CGFloat) progressDone;
- (CGFloat) progressLeft;
+62
View File
@@ -90,6 +90,45 @@ void metadataCallback(tr_torrent * torrent, void * torrentData)
[(Torrent *)torrentData performSelectorOnMainThread: @selector(metadataRetrieved) withObject: nil waitUntilDone: NO];
}
void renameCallback(tr_torrent * torrent, const char * oldPathCharString, const char * newNameCharString, int error, void * contextInfo)
{
@autoreleasepool
{
NSDictionary * contextDict = (NSDictionary *)contextInfo;
NSString * oldPath = [NSString stringWithUTF8String: oldPathCharString];
NSString * path = [oldPath stringByDeletingLastPathComponent];
NSString * oldName = [oldPath lastPathComponent];
NSString * newName = [NSString stringWithUTF8String: newNameCharString];
if (error == 0)
{
void (^__block updateNodeAndChildrenForRename)(FileListNode *) = ^(FileListNode * node) {
[node updateFromOldName: oldName toNewName: newName inPath: path];
if ([node isFolder]) {
[[node children] enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(FileListNode * childNode, NSUInteger idx, BOOL * stop) {
updateNodeAndChildrenForRename(childNode);
}];
}
};
NSArray * nodes = contextDict[@"Nodes"];
[nodes enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(FileListNode * node, NSUInteger idx, BOOL *stop) {
updateNodeAndChildrenForRename(node);
}];
}
else
NSLog(@"Error renaming %@ to %@", oldPath, [path stringByAppendingPathComponent: newName]);
typedef void (^RenameCompletionBlock)(BOOL);
RenameCompletionBlock completionHandler = contextDict[@"CompletionHandler"];
completionHandler(error == 0);
[contextDict release];
}
}
int trashDataFile(const char * filename)
{
@autoreleasepool
@@ -803,6 +842,29 @@ int trashDataFile(const char * filename)
}
}
- (void) renameTorrent: (NSString *) newName completionHandler: (void (^)(BOOL didRename)) completionHandler
{
NSParameterAssert(newName != nil);
NSParameterAssert(![newName isEqualToString: @""]);
NSDictionary * contextInfo = [@{ @"Nodes" : fFileList, @"CompletionHandler" : [[completionHandler copy] autorelease] } retain];
tr_torrentRenamePath(fHandle, fInfo->name, [newName UTF8String], renameCallback, contextInfo);
}
- (void) renameFileNode: (FileListNode *) node withName: (NSString *) newName completionHandler: (void (^)(BOOL didRename)) completionHandler
{
NSParameterAssert(node != nil);
NSParameterAssert([node torrent] == self);
NSParameterAssert(newName != nil);
NSParameterAssert(![newName isEqualToString: @""]);
NSDictionary * contextInfo = [@{ @"Nodes" : @[ node ], @"CompletionHandler" : [[completionHandler copy] autorelease] } retain];
NSString * oldName = [[node path] stringByAppendingPathComponent: [node name]];
tr_torrentRenamePath(fHandle, [oldName UTF8String], [newName UTF8String], renameCallback, contextInfo);
}
- (CGFloat) progress
{
return fStat->percentComplete;
+139 -103
View File
@@ -2,30 +2,30 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1060</int>
<string key="IBDocument.SystemVersion">11C74</string>
<string key="IBDocument.InterfaceBuilderVersion">1938</string>
<string key="IBDocument.AppKitVersion">1138.23</string>
<string key="IBDocument.HIToolboxVersion">567.00</string>
<string key="IBDocument.SystemVersion">12C60</string>
<string key="IBDocument.InterfaceBuilderVersion">2844</string>
<string key="IBDocument.AppKitVersion">1187.34</string>
<string key="IBDocument.HIToolboxVersion">625.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">1938</string>
<string key="NS.object.0">2844</string>
</object>
<array key="IBDocument.IntegratedClassDependencies">
<string>NSTableColumn</string>
<string>NSScroller</string>
<string>NSMenuItem</string>
<string>NSMenu</string>
<string>NSTextFieldCell</string>
<string>NSScrollView</string>
<string>NSButtonCell</string>
<string>NSButton</string>
<string>NSImageCell</string>
<string>NSOutlineView</string>
<string>NSButtonCell</string>
<string>NSCustomObject</string>
<string>NSImageCell</string>
<string>NSMenu</string>
<string>NSMenuItem</string>
<string>NSOutlineView</string>
<string>NSScrollView</string>
<string>NSScroller</string>
<string>NSTableColumn</string>
<string>NSTextField</string>
<string>NSTextFieldCell</string>
<string>NSUserDefaultsController</string>
<string>NSView</string>
<string>NSWindowTemplate</string>
<string>NSTextField</string>
<string>NSUserDefaultsController</string>
</array>
<array key="IBDocument.PluginDependencies">
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -69,7 +69,7 @@
<reference key="NSNextKeyView" ref="52857407"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="109224088">
<int key="NSCellFlags">-2080244224</int>
<int key="NSCellFlags">-2080374784</int>
<int key="NSCellFlags2">134217728</int>
<string key="NSContents"/>
<object class="NSFont" key="NSSupport" id="921632451">
@@ -78,7 +78,7 @@
<int key="NSfFlags">1044</int>
</object>
<reference key="NSControlView" ref="673219624"/>
<int key="NSButtonFlags">-935051009</int>
<int key="NSButtonFlags">-935051264</int>
<int key="NSButtonFlags2">160</int>
<object class="NSCustomResource" key="NSNormalImage">
<string key="NSClassName">NSImage</string>
@@ -89,6 +89,7 @@
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="52857407">
<reference key="NSNextResponder" ref="303120456"/>
@@ -99,12 +100,12 @@
<reference key="NSNextKeyView" ref="403739499"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="617399467">
<int key="NSCellFlags">-2080244224</int>
<int key="NSCellFlags">-2080374784</int>
<int key="NSCellFlags2">134217728</int>
<string key="NSContents"/>
<reference key="NSSupport" ref="921632451"/>
<reference key="NSControlView" ref="52857407"/>
<int key="NSButtonFlags">138690815</int>
<int key="NSButtonFlags">138690560</int>
<int key="NSButtonFlags2">160</int>
<object class="NSCustomResource" key="NSNormalImage">
<string key="NSClassName">NSImage</string>
@@ -115,6 +116,7 @@
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSButton" id="306218447">
<reference key="NSNextResponder" ref="303120456"/>
@@ -125,12 +127,12 @@
<reference key="NSNextKeyView" ref="673219624"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="751933283">
<int key="NSCellFlags">-2080244224</int>
<int key="NSCellFlags">-2080374784</int>
<int key="NSCellFlags2">134217728</int>
<string key="NSContents"/>
<reference key="NSSupport" ref="921632451"/>
<reference key="NSControlView" ref="306218447"/>
<int key="NSButtonFlags">138690815</int>
<int key="NSButtonFlags">138690560</int>
<int key="NSButtonFlags2">160</int>
<object class="NSCustomResource" key="NSNormalImage">
<string key="NSClassName">NSImage</string>
@@ -141,6 +143,7 @@
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSTextField" id="403739499">
<reference key="NSNextResponder" ref="303120456"/>
@@ -151,7 +154,7 @@
<reference key="NSNextKeyView"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="696487414">
<int key="NSCellFlags">67239488</int>
<int key="NSCellFlags">67108928</int>
<int key="NSCellFlags2">138549312</int>
<string key="NSContents">999 of 999 transfers</string>
<object class="NSFont" key="NSSupport" id="660654866">
@@ -179,6 +182,7 @@
</object>
</object>
</object>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
</object>
<object class="NSScrollView" id="87647552">
<reference key="NSNextResponder" ref="303120456"/>
@@ -196,6 +200,8 @@
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1068338331"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<bool key="NSControlAllowsExpansionToolTips">YES</bool>
<object class="_NSCornerView" key="NSCornerView">
<nil key="NSNextResponder"/>
<int key="NSvFlags">-2147483392</int>
@@ -208,7 +214,7 @@
<double key="NSMinWidth">16</double>
<double key="NSMaxWidth">3000</double>
<object class="NSTableHeaderCell" key="NSHeaderCell">
<int key="NSCellFlags">75628096</int>
<int key="NSCellFlags">75497536</int>
<int key="NSCellFlags2">2048</int>
<string key="NSContents">Color</string>
<object class="NSFont" key="NSSupport" id="26">
@@ -228,7 +234,7 @@
</object>
</object>
<object class="NSImageCell" key="NSDataCell" id="121868389">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags">134217728</int>
<int key="NSCellFlags2">33685504</int>
<object class="NSImage" key="NSContents" id="153628464">
<int key="NSImageFlags">549453824</int>
@@ -394,60 +400,61 @@ dBtdylsFt0VNsgjojBuwipKts4jFtBtdwtjNrF0lw9tdxdsNxtyzItyV11192F2IjjiVkFswoIjDiVtd
3UrFtdzBu5Q1yF2V4V4d4l4t3F45RF39t1x11tx941596AjQgIAADwEAAAMAAAABAD4AAAEBAAMAAAAB
AD4AAAECAAMAAAAEAAAkvAEDAAMAAAABAAUAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAESAAMAAAAB
AAEAAAEVAAMAAAABAAQAAAEWAAMAAAABAD4AAAEXAAQAAAABAAAj+gEcAAMAAAABAAEAAAE9AAMAAAAB
AAIAAAFSAAMAAAABAAEAAAFTAAMAAAAEAAAkxIdzAAcAAAw4AAAkzAAAAAAACAAIAAgACAABAAEAAQAB
AAAMOGFwcGwCEAAAbW50clJHQiBYWVogB9sACgAMABMALgAZYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAA
AAIAAAFSAAMAAAABAAEAAAFTAAMAAAAEAAAkxIdzAAcAAAyYAAAkzAAAAAAACAAIAAgACAABAAEAAQAB
AAAMmGFwcGwCEAAAbW50clJHQiBYWVogB90AAQAEABUAIwAiYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAARZGVzYwAAAVAAAABiZHNjbQAAAbQAAAEgY3BydAAAAtQAAAAkd3RwdAAAAvgAAAAU
clhZWgAAAwwAAAAUZ1hZWgAAAyAAAAAUYlhZWgAAAzQAAAAUclRSQwAAA0gAAAgMYWFyZwAAC1QAAAAg
dmNndAAAC3QAAAAwbmRpbgAAC6QAAAA+Y2hhZAAAC+QAAAAsbW1vZAAADBAAAAAoYlRSQwAAA0gAAAgM
Z1RSQwAAA0gAAAgMYWFiZwAAC1QAAAAgYWFnZwAAC1QAAAAgZGVzYwAAAAAAAAAIRGlzcGxheQAAAAAA
AAAAAAAAAAAAAAARZGVzYwAAAVAAAABiZHNjbQAAAbQAAAGAY3BydAAAAzQAAAAkd3RwdAAAA1gAAAAU
clhZWgAAA2wAAAAUZ1hZWgAAA4AAAAAUYlhZWgAAA5QAAAAUclRSQwAAA6gAAAgMYWFyZwAAC7QAAAAg
dmNndAAAC9QAAAAwbmRpbgAADAQAAAA+Y2hhZAAADEQAAAAsbW1vZAAADHAAAAAoYlRSQwAAA6gAAAgM
Z1RSQwAAA6gAAAgMYWFiZwAAC7QAAAAgYWFnZwAAC7QAAAAgZGVzYwAAAAAAAAAIRGlzcGxheQAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAFgAAAAxwdEJSAAAACAAAARhpdElUAAAACAAAARhodUhV
AAAACAAAARh6aFRXAAAACAAAARhuYk5PAAAACAAAARhjc0NaAAAACAAAARhrb0tSAAAACAAAARhkZURF
AAAACAAAARhzdlNFAAAACAAAARh6aENOAAAACAAAARhqYUpQAAAACAAAARhhcgAAAAAACAAAARhwdFBU
AAAACAAAARhubE5MAAAACAAAARhmckZSAAAACAAAARhlc0VTAAAACAAAARh0clRSAAAACAAAARhmaUZJ
AAAACAAAARhwbFBMAAAACAAAARhydVJVAAAACAAAARhlblVTAAAACAAAARhkYURLAAAACAAAARgAaQBN
AGEAY3RleHQAAAAAQ29weXJpZ2h0IEFwcGxlLCBJbmMuLCAyMDExAFhZWiAAAAAAAADzFgABAAAAARbK
WFlaIAAAAAAAAHHAAAA5igAAAWdYWVogAAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAAAL3Q
Y3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQBy
AHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwEN
ARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHh
AekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMA
AwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRx
BH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3
BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRgha
CG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc
CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3D
Dd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RET
ETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTO
FPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6
GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2Z
HcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKv
It0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/
KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5M
LoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTY
NRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvo
PCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9
Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0ua
S+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRC
VI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114
XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9
Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGV
cfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB
fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gE
iGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQg
lIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDY
oUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4t
rqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7wh
vJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3
yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx
2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ
6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX
+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QAAAAA
AAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AAAFWA
AABMwAAAnsAAACWAAAAMwAAAUAAAAFRAAAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIAAAX4
///zHQAAB7oAAP1y///7nf///aQAAAPZAADAcW1tb2QAAAAAAAAGEAAAoAcAAAAAySceAAAAAAAAAAAA
AAAAAAAAAAA</bytes>
AAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAHgAAAAxza1NLAAAACAAAAXhjYUVTAAAACAAAAXhoZUlM
AAAACAAAAXhwdEJSAAAACAAAAXhpdElUAAAACAAAAXhodUhVAAAACAAAAXh1a1VBAAAACAAAAXhrb0tS
AAAACAAAAXhuYk5PAAAACAAAAXhjc0NaAAAACAAAAXh6aFRXAAAACAAAAXhkZURFAAAACAAAAXhyb1JP
AAAACAAAAXhzdlNFAAAACAAAAXh6aENOAAAACAAAAXhqYUpQAAAACAAAAXhhcgAAAAAACAAAAXhlbEdS
AAAACAAAAXhwdFBUAAAACAAAAXhubE5MAAAACAAAAXhmckZSAAAACAAAAXhlc0VTAAAACAAAAXh0aFRI
AAAACAAAAXh0clRSAAAACAAAAXhmaUZJAAAACAAAAXhockhSAAAACAAAAXhwbFBMAAAACAAAAXhydVJV
AAAACAAAAXhlblVTAAAACAAAAXhkYURLAAAACAAAAXgAaQBNAGEAY3RleHQAAAAAQ29weXJpZ2h0IEFw
cGxlLCBJbmMuLCAyMDEzAFhZWiAAAAAAAADzFgABAAAAARbKWFlaIAAAAAAAAHHAAAA5igAAAWdYWVog
AAAAAAAAYSMAALnmAAAT9lhZWiAAAAAAAAAj8gAADJAAAL3QY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZ
AB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACt
ALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZ
AWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJL
AlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOK
A5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUc
BSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcH
BxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglP
CWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5
DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8J
DyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKE
EqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs
Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrF
GuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+U
H78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTa
JQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqb
Ks8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDb
MRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec
N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7g
PyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0ar
RvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08A
T0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfg
WC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFP
YaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tP
a6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXh
dj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEK
gWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zK
jTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkk
mZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa
poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOu
tCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hj
wl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC6
0TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A2
4L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY
8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJh
AAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKDnZjZ3QAAAAAAAAAAQABAAAAAAAAAAEAAAABAAAAAAAA
AAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAAp0AAAFWAAABMwAAAnsAAACWAAAAMwAAAUAAAAFRA
AAIzMwACMzMAAjMzAAAAAAAAAABzZjMyAAAAAAABDHIAAAX4///zHQAAB7oAAP1y///7nf///aQAAAPZ
AADAcW1tb2QAAAAAAAAGEAAAoAcAAAAAySceAAAAAAAAAAAAAAAAAAAAAAA</bytes>
</object>
<string key="NSCacheWindowColorSpace">NSCalibratedRGBColorSpace</string>
<int key="NSCacheWindowBPS">8</int>
@@ -461,7 +468,6 @@ AAAAAAAAAAA</bytes>
<bytes key="NSWhite">MCAwAA</bytes>
</object>
</object>
<reference key="NSSupport" ref="26"/>
<int key="NSAlign">0</int>
<int key="NSScale">0</int>
<int key="NSStyle">0</int>
@@ -475,7 +481,7 @@ AAAAAAAAAAA</bytes>
<double key="NSMinWidth">48</double>
<double key="NSMaxWidth">3.4028229999999999e+38</double>
<object class="NSTableHeaderCell" key="NSHeaderCell">
<int key="NSCellFlags">75628096</int>
<int key="NSCellFlags">75497536</int>
<int key="NSCellFlags2">2048</int>
<string key="NSContents">Group</string>
<reference key="NSSupport" ref="26"/>
@@ -491,7 +497,7 @@ AAAAAAAAAAA</bytes>
<reference key="NSTextColor" ref="441405713"/>
</object>
<object class="NSTextFieldCell" key="NSDataCell" id="787380903">
<int key="NSCellFlags">69336641</int>
<int key="NSCellFlags">69206081</int>
<int key="NSCellFlags2">4196352</int>
<string key="NSContents">Text Cell</string>
<object class="NSFont" key="NSSupport">
@@ -513,7 +519,7 @@ AAAAAAAAAAA</bytes>
<double key="NSMinWidth">10</double>
<double key="NSMaxWidth">10</double>
<object class="NSTableHeaderCell" key="NSHeaderCell">
<int key="NSCellFlags">75628096</int>
<int key="NSCellFlags">75497536</int>
<int key="NSCellFlags2">2048</int>
<string key="NSContents"/>
<reference key="NSSupport" ref="26"/>
@@ -521,10 +527,9 @@ AAAAAAAAAAA</bytes>
<reference key="NSTextColor" ref="441405713"/>
</object>
<object class="NSImageCell" key="NSDataCell" id="266712038">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags">134217728</int>
<int key="NSCellFlags2">33685504</int>
<reference key="NSContents" ref="153628464"/>
<reference key="NSSupport" ref="26"/>
<int key="NSAlign">8</int>
<int key="NSScale">0</int>
<int key="NSStyle">0</int>
@@ -538,7 +543,7 @@ AAAAAAAAAAA</bytes>
<double key="NSMinWidth">64</double>
<double key="NSMaxWidth">64</double>
<object class="NSTableHeaderCell" key="NSHeaderCell">
<int key="NSCellFlags">75628096</int>
<int key="NSCellFlags">75497536</int>
<int key="NSCellFlags2">2048</int>
<string key="NSContents">DL Speed</string>
<reference key="NSSupport" ref="26"/>
@@ -546,7 +551,7 @@ AAAAAAAAAAA</bytes>
<reference key="NSTextColor" ref="441405713"/>
</object>
<object class="NSTextFieldCell" key="NSDataCell" id="837967890">
<int key="NSCellFlags">69336641</int>
<int key="NSCellFlags">69206081</int>
<int key="NSCellFlags2">2048</int>
<string key="NSContents">Text Cell</string>
<reference key="NSSupport" ref="660654866"/>
@@ -567,7 +572,7 @@ AAAAAAAAAAA</bytes>
<double key="NSMinWidth">10</double>
<double key="NSMaxWidth">10</double>
<object class="NSTableHeaderCell" key="NSHeaderCell">
<int key="NSCellFlags">75628096</int>
<int key="NSCellFlags">75497536</int>
<int key="NSCellFlags2">2048</int>
<string key="NSContents"/>
<reference key="NSSupport" ref="26"/>
@@ -575,10 +580,9 @@ AAAAAAAAAAA</bytes>
<reference key="NSTextColor" ref="441405713"/>
</object>
<object class="NSImageCell" key="NSDataCell" id="358871970">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags">134217728</int>
<int key="NSCellFlags2">33685504</int>
<reference key="NSContents" ref="153628464"/>
<reference key="NSSupport" ref="26"/>
<int key="NSAlign">8</int>
<int key="NSScale">0</int>
<int key="NSStyle">0</int>
@@ -592,7 +596,7 @@ AAAAAAAAAAA</bytes>
<double key="NSMinWidth">64</double>
<double key="NSMaxWidth">64</double>
<object class="NSTableHeaderCell" key="NSHeaderCell">
<int key="NSCellFlags">75628096</int>
<int key="NSCellFlags">75497536</int>
<int key="NSCellFlags2">2048</int>
<string key="NSContents">UL Speed</string>
<reference key="NSSupport" ref="26"/>
@@ -600,7 +604,7 @@ AAAAAAAAAAA</bytes>
<reference key="NSTextColor" ref="441405713"/>
</object>
<object class="NSTextFieldCell" key="NSDataCell" id="774159814">
<int key="NSCellFlags">69336641</int>
<int key="NSCellFlags">69206081</int>
<int key="NSCellFlags2">2048</int>
<string key="NSContents">Text Cell</string>
<reference key="NSSupport" ref="660654866"/>
@@ -647,6 +651,7 @@ AAAAAAAAAAA</bytes>
<reference key="NSSuperview" ref="87647552"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="306218447"/>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<reference key="NSTarget" ref="87647552"/>
<string key="NSAction">_doScroller:</string>
<double key="NSPercent">0.98089171974522293</double>
@@ -658,6 +663,7 @@ AAAAAAAAAAA</bytes>
<reference key="NSSuperview" ref="87647552"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="306237956"/>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSsFlags">1</int>
<reference key="NSTarget" ref="87647552"/>
<string key="NSAction">_doScroller:</string>
@@ -673,6 +679,9 @@ AAAAAAAAAAA</bytes>
<reference key="NSHScroller" ref="365285506"/>
<reference key="NSContentView" ref="306237956"/>
<bytes key="NSScrollAmts">AAAAAAAAAABCggAAQoIAAA</bytes>
<double key="NSMinMagnification">0.25</double>
<double key="NSMaxMagnification">4</double>
<double key="NSMagnification">1</double>
</object>
</array>
<string key="NSFrameSize">{515, 248}</string>
@@ -680,7 +689,7 @@ AAAAAAAAAAA</bytes>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="87647552"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1440}}</string>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
<string key="NSMinSize">{350, 27}</string>
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
<string key="NSFrameAutosaveName">TransmissionWindow</string>
@@ -1549,6 +1558,15 @@ AAAAAAAAAAA</bytes>
<reference key="NSOnImage" ref="246127200"/>
<reference key="NSMixedImage" ref="330170270"/>
</object>
<object class="NSMenuItem" id="822231323">
<reference key="NSMenu" ref="335948734"/>
<string key="NSTitle">Rename…</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="246127200"/>
<reference key="NSMixedImage" ref="330170270"/>
</object>
<object class="NSMenuItem" id="219482367">
<reference key="NSMenu" ref="335948734"/>
<string key="NSTitle">Update Tracker</string>
@@ -3652,6 +3670,14 @@ AAAAAAAAAAA</bytes>
</object>
<int key="connectionID">3440</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">renameSelected:</string>
<reference key="source" ref="30116300"/>
<reference key="destination" ref="822231323"/>
</object>
<int key="connectionID">3444</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">delegate</string>
@@ -4449,6 +4475,7 @@ AAAAAAAAAAA</bytes>
<reference ref="349340971"/>
<reference ref="245039314"/>
<reference ref="96633809"/>
<reference ref="822231323"/>
</array>
<reference key="parent" ref="249425108"/>
</object>
@@ -5459,6 +5486,11 @@ AAAAAAAAAAA</bytes>
<reference key="object" ref="751933283"/>
<reference key="parent" ref="306218447"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">3441</int>
<reference key="object" ref="822231323"/>
<reference key="parent" ref="335948734"/>
</object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -5680,6 +5712,7 @@ AAAAAAAAAAA</bytes>
<string key="3432.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="3435.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="3436.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="3441.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="418.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="456.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="457.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -5705,24 +5738,27 @@ AAAAAAAAAAA</bytes>
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">3440</int>
<int key="maxID">3444</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription">
<string key="className">Controller</string>
<string key="superclassName">NSObject</string>
<object class="NSMutableDictionary" key="actions">
<string key="NS.key.0">showGlobalPopover:</string>
<string key="NS.object.0">id</string>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
<string key="NS.key.0">showGlobalPopover:</string>
<object class="IBActionInfo" key="NS.object.0">
<dictionary class="NSMutableDictionary" key="actions">
<string key="renameSelected:">id</string>
<string key="showGlobalPopover:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<object class="IBActionInfo" key="renameSelected:">
<string key="name">renameSelected:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="showGlobalPopover:">
<string key="name">showGlobalPopover:</string>
<string key="candidateClassName">id</string>
</object>
</object>
</dictionary>
<dictionary class="NSMutableDictionary" key="outlets">
<string key="fActionButton">NSButton</string>
<string key="fActionMenu">NSMenu</string>
@@ -5975,15 +6011,15 @@ AAAAAAAAAAA</bytes>
</object>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
<real value="1070" key="NS.object.0"/>
<real value="1080" key="NS.object.0"/>
</object>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
<dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
<string key="CleanupTemplate">{128, 128}</string>
<string key="NSActionTemplate">{15, 15}</string>
<string key="NSMenuCheckmark">{9, 8}</string>
<string key="NSMenuMixedState">{7, 2}</string>
<string key="NSMenuCheckmark">{11, 11}</string>
<string key="NSMenuMixedState">{10, 3}</string>
<string key="PriorityHighTemplate">{128, 128}</string>
<string key="PriorityLowTemplate">{128, 128}</string>
<string key="PriorityNormalTemplate">{128, 128}</string>