move the status bar into its own xib file

This commit is contained in:
Mitchell Livingston 2011-02-20 00:22:55 +00:00
parent bb00924a4c
commit 543063b4b8
8 changed files with 1802 additions and 791 deletions

View File

@ -278,6 +278,8 @@
A2E384E1130DFB3A001F501B /* utypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A2E384D9130DFB3A001F501B /* utypes.h */; };
A2E3850C130DFCCB001F501B /* StdAfx.h in Headers */ = {isa = PBXBuildFile; fileRef = A2E3850B130DFCCB001F501B /* StdAfx.h */; };
A2E38540130DFECD001F501B /* libminiupnp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE1183480CE160960002D0F3 /* libminiupnp.a */; };
A2E57ABB1310822C00A7DAB1 /* StatusBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = A2E57ABA1310822C00A7DAB1 /* StatusBarController.m */; };
A2E57AC61310831400A7DAB1 /* StatusBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2E57AC51310831400A7DAB1 /* StatusBar.xib */; };
A2E669790F5B8E5A00B4251A /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2E669780F5B8E5A00B4251A /* Security.framework */; };
A2E9AA760C249AF400085DCF /* ToolbarCreateTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A2E9AA750C249AF400085DCF /* ToolbarCreateTemplate.png */; };
A2ED7D8F0CEF431B00970975 /* FilterButton.m in Sources */ = {isa = PBXBuildFile; fileRef = A2ED7D8E0CEF431B00970975 /* FilterButton.m */; };
@ -858,6 +860,9 @@
A2E384D9130DFB3A001F501B /* utypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utypes.h; path = "third-party/libutp/utypes.h"; sourceTree = "<group>"; };
A2E3850B130DFCCB001F501B /* StdAfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StdAfx.h; path = "third-party/libutp/StdAfx.h"; sourceTree = "<group>"; };
A2E38544130DFEE3001F501B /* libutp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libutp.a; sourceTree = BUILT_PRODUCTS_DIR; };
A2E57AB91310822C00A7DAB1 /* StatusBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatusBarController.h; path = macosx/StatusBarController.h; sourceTree = "<group>"; };
A2E57ABA1310822C00A7DAB1 /* StatusBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StatusBarController.m; path = macosx/StatusBarController.m; sourceTree = "<group>"; };
A2E57AC51310831400A7DAB1 /* StatusBar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = StatusBar.xib; path = macosx/StatusBar.xib; sourceTree = "<group>"; };
A2E669780F5B8E5A00B4251A /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; };
A2E9AA750C249AF400085DCF /* ToolbarCreateTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ToolbarCreateTemplate.png; path = macosx/Images/ToolbarCreateTemplate.png; sourceTree = "<group>"; };
A2EA8E3C0CC3C9830081201C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = macosx/fr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@ -1101,6 +1106,8 @@
E1B6FBEB0C0D70AC0015FE4D /* UKKQueue */,
E138A9750C04D88F00C5426C /* ProgressGradients.h */,
E138A9760C04D88F00C5426C /* ProgressGradients.m */,
A2E57AB91310822C00A7DAB1 /* StatusBarController.h */,
A2E57ABA1310822C00A7DAB1 /* StatusBarController.m */,
A21282A50CA6C66800EAEE0F /* StatusBarView.h */,
A21282A60CA6C66800EAEE0F /* StatusBarView.m */,
A2661D3A12D0E51A004F69D5 /* FilterBarView.h */,
@ -1185,6 +1192,7 @@
A233BD320D8C6585007EE7B4 /* MessageWindow.xib */,
A233BD680D8CF2C7007EE7B4 /* StatsWindow.xib */,
A231274B0D11D0B7003F9AFF /* AboutWindow.xib */,
A2E57AC51310831400A7DAB1 /* StatusBar.xib */,
A2F7CF5413035F7B0016FF10 /* URLSheetWindow.xib */,
A2D307B00D9EC9F50051FD27 /* BlocklistStatusWindow.xib */,
A209ECA1114319C3002B02D1 /* InfoWindow.xib */,
@ -2075,6 +2083,7 @@
A209ECA2114319C3002B02D1 /* InfoWindow.xib in Resources */,
A21F15AD11729A9F00CF5A9C /* AddMagnetWindow.xib in Resources */,
A2F7CF5513035F7B0016FF10 /* URLSheetWindow.xib in Resources */,
A2E57AC61310831400A7DAB1 /* StatusBar.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2266,6 +2275,7 @@
A2661D6112D0E8D9004F69D5 /* FilterBarView.m in Sources */,
A25BB02A12F4F517004B724E /* InfoTabButtonBack.m in Sources */,
A2F7CF5F13035FFD0016FF10 /* URLSheetWindowController.m in Sources */,
A2E57ABB1310822C00A7DAB1 /* StatusBarController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@ -36,7 +36,7 @@
@class InfoWindowController;
@class MessageWindowController;
@class PrefsController;
@class StatusBarView;
@class StatusBarController;
@class Torrent;
@class TorrentTableView;
@class URLSheetWindowController;
@ -74,10 +74,7 @@ typedef enum
IBOutlet NSButton * fActionButton, * fSpeedLimitButton;
IBOutlet NSTextField * fTotalTorrentsField;
IBOutlet StatusBarView * fStatusBar;
IBOutlet NSButton * fStatusButton;
IBOutlet NSTextField * fTotalDLField, * fTotalULField;
IBOutlet NSImageView * fTotalDLImageView;
IBOutlet StatusBarController * fStatusBar;
IBOutlet FilterBarView * fFilterBar;
IBOutlet FilterButton * fNoFilterButton, * fActiveFilterButton, * fDownloadFilterButton,
@ -187,11 +184,8 @@ typedef enum
- (void) updateUI;
- (void) resizeStatusButton;
- (void) setBottomCountText: (BOOL) filtering;
- (void) updateSpeedFieldsToolTips;
- (void) updateTorrentsInQueue;
- (NSUInteger) numToStartFromQueue: (BOOL) downloadQueue;
@ -213,8 +207,6 @@ typedef enum
- (void) setFilterSearchType: (id) sender;
- (void) switchFilter: (id) sender;
- (void) setStatusLabel: (id) sender;
- (void) setGroup: (id) sender; //used by delegate-generated menu items
- (void) setGroupFilter: (id) sender;
- (void) updateGroupsFilterButton;

View File

@ -44,7 +44,7 @@
#import "GroupToolbarItem.h"
#import "ToolbarSegmentedCell.h"
#import "BlocklistDownloader.h"
#import "StatusBarView.h"
#import "StatusBarController.h"
#import "FilterBarView.h"
#import "FilterButton.h"
#import "BonjourController.h"
@ -122,11 +122,13 @@ typedef enum
#define GROUP_FILTER_ALL_TAG -2
#warning remove
#define STATUS_RATIO_TOTAL @"RatioTotal"
#define STATUS_RATIO_SESSION @"RatioSession"
#define STATUS_TRANSFER_TOTAL @"TransferTotal"
#define STATUS_TRANSFER_SESSION @"TransferSession"
#warning remove
typedef enum
{
STATUS_RATIO_TOTAL_TAG = 0,
@ -426,8 +428,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[fWindow setContentBorderThickness: NSMinY([[fTableView enclosingScrollView] frame]) forEdge: NSMinYEdge];
[fWindow setMovableByWindowBackground: YES];
[[fTotalDLField cell] setBackgroundStyle: NSBackgroundStyleRaised];
[[fTotalULField cell] setBackgroundStyle: NSBackgroundStyleRaised];
[[fTotalTorrentsField cell] setBackgroundStyle: NSBackgroundStyleRaised];
[self updateGroupsFilterButton];
@ -447,16 +447,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[self showFilterBar: [fDefaults boolForKey: @"FilterBar"] animate: NO];
//set up status bar
[fStatusBar setHidden: YES];
[self updateSpeedFieldsToolTips];
NSRect statusBarFrame = [fStatusBar frame];
statusBarFrame.size.width = windowSize.width;
[fStatusBar setFrame: statusBarFrame];
[contentView addSubview: fStatusBar];
[fStatusBar setFrameOrigin: NSMakePoint(0, NSMaxY([contentView frame]))];
[self showStatusBar: [fDefaults boolForKey: @"StatusBar"] animate: NO];
[fActionButton setToolTip: NSLocalizedString(@"Shortcuts for changing global settings.",
@ -582,10 +572,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
//update when groups change
[nc addObserver: self selector: @selector(updateGroupsFilters:)
name: @"UpdateGroups" object: nil];
//update when speed limits are changed
[nc addObserver: self selector: @selector(updateSpeedFieldsToolTips)
name: @"SpeedLimitUpdate" object: nil];
//timer to update the interface every second
[self updateUI];
@ -774,6 +760,9 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[fMessageController release];
[fPrefsController release];
[fStatusBar release];
[fFilterBar release];
[fTorrents release];
[fDisplayedTorrents release];
@ -1714,45 +1703,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
{
[self sortTorrents];
//update status bar
if (![fStatusBar isHidden])
{
//set rates
[fTotalDLField setStringValue: [NSString stringForSpeed: dlRate]];
[fTotalULField setStringValue: [NSString stringForSpeed: ulRate]];
//set status button text
NSString * statusLabel = [fDefaults stringForKey: @"StatusLabel"], * statusString;
BOOL total;
if ((total = [statusLabel isEqualToString: STATUS_RATIO_TOTAL]) || [statusLabel isEqualToString: STATUS_RATIO_SESSION])
{
tr_session_stats stats;
if (total)
tr_sessionGetCumulativeStats(fLib, &stats);
else
tr_sessionGetStats(fLib, &stats);
statusString = [NSLocalizedString(@"Ratio", "status bar -> status label") stringByAppendingFormat: @": %@",
[NSString stringForRatio: stats.ratio]];
}
else //STATUS_TRANSFER_TOTAL or STATUS_TRANSFER_SESSION
{
total = [statusLabel isEqualToString: STATUS_TRANSFER_TOTAL];
tr_session_stats stats;
if (total)
tr_sessionGetCumulativeStats(fLib, &stats);
else
tr_sessionGetStats(fLib, &stats);
statusString = [NSString stringWithFormat: @"%@: %@ %@: %@",
NSLocalizedString(@"DL", "status bar -> status label"), [NSString stringForFileSize: stats.downloadedBytes],
NSLocalizedString(@"UL", "status bar -> status label"), [NSString stringForFileSize: stats.uploadedBytes]];
}
[fStatusButton setTitle: statusString];
[self resizeStatusButton];
}
[fStatusBar updateWithDownload: dlRate upload: ulRate];
}
//update non-constant parts of info window
@ -1764,21 +1715,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[fBadger updateBadgeWithDownload: dlRate upload: ulRate];
}
- (void) resizeStatusButton
{
[fStatusButton sizeToFit];
//width ends up being too long
NSRect statusFrame = [fStatusButton frame];
statusFrame.size.width -= 25.0;
CGFloat difference = NSMaxX(statusFrame) + 5.0 - [fTotalDLImageView frame].origin.x;
if (difference > 0)
statusFrame.size.width -= difference;
[fStatusButton setFrame: statusFrame];
}
- (void) setBottomCountText: (BOOL) filtering
{
NSString * totalTorrentsString;
@ -1802,42 +1738,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[fTotalTorrentsField setStringValue: totalTorrentsString];
}
- (void) updateSpeedFieldsToolTips
{
NSString * uploadText, * downloadText;
if ([fDefaults boolForKey: @"SpeedLimit"])
{
NSString * speedString = [NSString stringWithFormat: @"%@ (%@)", NSLocalizedString(@"%d KB/s", "Status Bar -> speed tooltip"),
NSLocalizedString(@"Speed Limit", "Status Bar -> speed tooltip")];
uploadText = [NSString stringWithFormat: speedString, [fDefaults integerForKey: @"SpeedLimitUploadLimit"]];
downloadText = [NSString stringWithFormat: speedString, [fDefaults integerForKey: @"SpeedLimitDownloadLimit"]];
}
else
{
if ([fDefaults boolForKey: @"CheckUpload"])
uploadText = [NSString stringWithFormat: NSLocalizedString(@"%d KB/s", "Status Bar -> speed tooltip"),
[fDefaults integerForKey: @"UploadLimit"]];
else
uploadText = NSLocalizedString(@"unlimited", "Status Bar -> speed tooltip");
if ([fDefaults boolForKey: @"CheckDownload"])
downloadText = [NSString stringWithFormat: NSLocalizedString(@"%d KB/s", "Status Bar -> speed tooltip"),
[fDefaults integerForKey: @"DownloadLimit"]];
else
downloadText = NSLocalizedString(@"unlimited", "Status Bar -> speed tooltip");
}
uploadText = [NSLocalizedString(@"Global upload limit", "Status Bar -> speed tooltip")
stringByAppendingFormat: @": %@", uploadText];
downloadText = [NSLocalizedString(@"Global download limit", "Status Bar -> speed tooltip")
stringByAppendingFormat: @": %@", downloadText];
[fTotalULField setToolTip: uploadText];
[fTotalDLField setToolTip: downloadText];
}
- (void) updateTorrentsInQueue
{
NSUInteger desiredDownloadActive = [fDefaults boolForKey: @"Queue"] ? [self numToStartFromQueue: YES] : NSUIntegerMax,
@ -2424,32 +2324,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[self setFilter: button];
}
- (void) setStatusLabel: (id) sender
{
NSString * statusLabel;
switch ([sender tag])
{
case STATUS_RATIO_TOTAL_TAG:
statusLabel = STATUS_RATIO_TOTAL;
break;
case STATUS_RATIO_SESSION_TAG:
statusLabel = STATUS_RATIO_SESSION;
break;
case STATUS_TRANSFER_TOTAL_TAG:
statusLabel = STATUS_TRANSFER_TOTAL;
break;
case STATUS_TRANSFER_SESSION_TAG:
statusLabel = STATUS_TRANSFER_SESSION;
break;
default:
NSAssert1(NO, @"Unknown status label tag received: %d", [sender tag]);
return;
}
[fDefaults setObject: statusLabel forKey: @"StatusLabel"];
[self updateUI];
}
- (void) menuNeedsUpdate: (NSMenu *) menu
{
if (menu == fGroupsSetMenu || menu == fGroupsSetContextMenu || menu == fGroupFilterMenu)
@ -2574,7 +2448,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
- (void) speedLimitChanged: (id) sender
{
tr_sessionUseAltSpeed(fLib, [fDefaults boolForKey: @"SpeedLimit"]);
[self updateSpeedFieldsToolTips];
[fStatusBar updateSpeedFieldsToolTips];
}
//dict has been retained
@ -2583,7 +2457,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
const BOOL isLimited = [[dict objectForKey: @"Active"] boolValue];
[fDefaults setBool: isLimited forKey: @"SpeedLimit"];
[self updateSpeedFieldsToolTips];
[fStatusBar updateSpeedFieldsToolTips];
if (![[dict objectForKey: @"ByUser"] boolValue])
[GrowlApplicationBridge notifyWithTitle: isLimited
@ -3124,8 +2998,8 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
else
{
NSSize maxSize = [scrollView convertSize: [[fWindow screen] visibleFrame].size fromView: nil];
if ([fStatusBar isHidden])
maxSize.height -= [fStatusBar frame].size.height;
if (!fStatusBar)
maxSize.height -= [[fStatusBar view] frame].size.height;
if ([fFilterBar isHidden])
maxSize.height -= [fFilterBar frame].size.height;
if (windowSize.height > maxSize.height)
@ -3143,21 +3017,35 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
- (void) toggleStatusBar: (id) sender
{
[self showStatusBar: [fStatusBar isHidden] animate: YES];
[fDefaults setBool: ![fStatusBar isHidden] forKey: @"StatusBar"];
const BOOL show = fStatusBar == nil;
[self showStatusBar: show animate: YES];
[fDefaults setBool: show forKey: @"StatusBar"];
}
//doesn't save shown state
- (void) showStatusBar: (BOOL) show animate: (BOOL) animate
{
if (show != [fStatusBar isHidden])
const BOOL prevShown = fStatusBar != nil;
if (show == prevShown)
return;
if (show)
[fStatusBar setHidden: NO];
{
fStatusBar = [[StatusBarController alloc] initWithLib: fLib];
NSView * contentView = [fWindow contentView];
const NSSize windowSize = [contentView convertSize: [fWindow frame].size fromView: nil];
NSRect statusBarFrame = [[fStatusBar view] frame];
statusBarFrame.size.width = windowSize.width;
[[fStatusBar view] setFrame: statusBarFrame];
[contentView addSubview: [fStatusBar view]];
[[fStatusBar view] setFrameOrigin: NSMakePoint(0, NSMaxY([contentView frame]))];
}
NSRect frame;
CGFloat heightChange = [fStatusBar frame].size.height;
CGFloat heightChange = [[fStatusBar view] frame].size.height;
if (!show)
heightChange *= -1;
@ -3180,18 +3068,18 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
NSScrollView * scrollView = [fTableView enclosingScrollView];
//set views to not autoresize
NSUInteger statsMask = [fStatusBar autoresizingMask];
NSUInteger filterMask = [fFilterBar autoresizingMask];
NSUInteger scrollMask = [scrollView autoresizingMask];
[fStatusBar setAutoresizingMask: NSViewNotSizable];
const NSUInteger statsMask = [[fStatusBar view] autoresizingMask];
[[fStatusBar view] setAutoresizingMask: NSViewNotSizable];
const NSUInteger filterMask = [fFilterBar autoresizingMask];
[fFilterBar setAutoresizingMask: NSViewNotSizable];
const NSUInteger scrollMask = [scrollView autoresizingMask];
[scrollView setAutoresizingMask: NSViewNotSizable];
frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO];
[fWindow setFrame: frame display: YES animate: animate];
//re-enable autoresize
[fStatusBar setAutoresizingMask: statsMask];
[[fStatusBar view] setAutoresizingMask: statsMask];
[fFilterBar setAutoresizingMask: filterMask];
[scrollView setAutoresizingMask: scrollMask];
@ -3201,7 +3089,10 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[fWindow setContentMinSize: minSize];
if (!show)
[fStatusBar setHidden: YES];
{
[fStatusBar release];
fStatusBar = nil;
}
}
- (void) toggleFilterBar: (id) sender
@ -3742,32 +3633,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
return [fWindow isVisible];
}
//enable sort options
if (action == @selector(setStatusLabel:))
{
NSString * statusLabel;
switch ([menuItem tag])
{
case STATUS_RATIO_TOTAL_TAG:
statusLabel = STATUS_RATIO_TOTAL;
break;
case STATUS_RATIO_SESSION_TAG:
statusLabel = STATUS_RATIO_SESSION;
break;
case STATUS_TRANSFER_TOTAL_TAG:
statusLabel = STATUS_TRANSFER_TOTAL;
break;
case STATUS_TRANSFER_SESSION_TAG:
statusLabel = STATUS_TRANSFER_SESSION;
break;
default:
NSAssert1(NO, @"Unknown status label tag received: %d", [menuItem tag]);
}
[menuItem setState: [statusLabel isEqualToString: [fDefaults stringForKey: @"StatusLabel"]] ? NSOnState : NSOffState];
return YES;
}
if (action == @selector(setGroup:))
{
BOOL checked = NO;
@ -3865,7 +3730,7 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
//enable toggle status bar
if (action == @selector(toggleStatusBar:))
{
NSString * title = [fStatusBar isHidden] ? NSLocalizedString(@"Show Status Bar", "View menu -> Status Bar")
NSString * title = !fStatusBar ? NSLocalizedString(@"Show Status Bar", "View menu -> Status Bar")
: NSLocalizedString(@"Hide Status Bar", "View menu -> Status Bar");
[menuItem setTitle: title];
@ -4323,13 +4188,8 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
- (void) windowDidResize: (NSNotification *) notification
{
if (![fStatusBar isHidden])
[self resizeStatusButton];
if ([fFilterBar isHidden])
return;
[self resizeFilterBar];
if (![fFilterBar isHidden])
[self resizeFilterBar];
}
- (void) applicationWillUnhide: (NSNotification *) notification

View File

@ -128,6 +128,8 @@ EXTRA_DIST = \
ProgressGradients.m \
StatsWindowController.h \
StatsWindowController.m \
StatusBarController.h \
StatusBarController.m \
StatusBarView.h \
StatusBarView.m \
ToolbarSegmentedCell.h \

1368
macosx/StatusBar.xib Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2011 Transmission authors and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*****************************************************************************/
#import <Cocoa/Cocoa.h>
#import <transmission.h>
@interface StatusBarController : NSViewController
{
IBOutlet NSButton * fStatusButton;
IBOutlet NSTextField * fTotalDLField, * fTotalULField;
IBOutlet NSImageView * fTotalDLImageView;
tr_session * fLib;
}
- (id) initWithLib: (tr_session *) lib;
- (void) updateWithDownload: (CGFloat) dlRate upload: (CGFloat) ulRate;
- (void) setStatusLabel: (id) sender;
- (void) updateSpeedFieldsToolTips;
@end

View File

@ -0,0 +1,249 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2011 Transmission authors and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*****************************************************************************/
#import "StatusBarController.h"
#import "NSStringAdditions.h"
#import "transmission.h"
#define STATUS_RATIO_TOTAL @"RatioTotal"
#define STATUS_RATIO_SESSION @"RatioSession"
#define STATUS_TRANSFER_TOTAL @"TransferTotal"
#define STATUS_TRANSFER_SESSION @"TransferSession"
typedef enum
{
STATUS_RATIO_TOTAL_TAG = 0,
STATUS_RATIO_SESSION_TAG = 1,
STATUS_TRANSFER_TOTAL_TAG = 2,
STATUS_TRANSFER_SESSION_TAG = 3
} statusTag;
@interface StatusBarController (Private)
- (void) resizeStatusButton;
@end
@implementation StatusBarController
- (id) initWithLib: (tr_session *) lib
{
if (self = [super initWithNibName: @"StatusBar" bundle: nil])
{
fLib = lib;
}
return self;
}
- (void) awakeFromNib
{
//localize menu items
[[[fStatusButton menu] itemWithTag: STATUS_RATIO_TOTAL_TAG] setTitle: NSLocalizedString(@"Total Ratio",
"Status Bar -> status menu")];
[[[fStatusButton menu] itemWithTag: STATUS_RATIO_SESSION_TAG] setTitle: NSLocalizedString(@"Session Ratio",
"Status Bar -> status menu")];
[[[fStatusButton menu] itemWithTag: STATUS_TRANSFER_TOTAL_TAG] setTitle: NSLocalizedString(@"Total Transfer",
"Status Bar -> status menu")];
[[[fStatusButton menu] itemWithTag: STATUS_TRANSFER_SESSION_TAG] setTitle: NSLocalizedString(@"Session Transfer",
"Status Bar -> status menu")];
[[fTotalDLField cell] setBackgroundStyle: NSBackgroundStyleRaised];
[[fTotalULField cell] setBackgroundStyle: NSBackgroundStyleRaised];
[self updateSpeedFieldsToolTips];
//update when speed limits are changed
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateSpeedFieldsToolTips)
name: @"SpeedLimitUpdate" object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(resizeStatusButton)
name: NSWindowDidResizeNotification object: [[self view] window]];
}
- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver: self];
[super dealloc];
}
- (void) updateWithDownload: (CGFloat) dlRate upload: (CGFloat) ulRate
{
//set rates
[fTotalDLField setStringValue: [NSString stringForSpeed: dlRate]];
[fTotalULField setStringValue: [NSString stringForSpeed: ulRate]];
//set status button text
NSString * statusLabel = [[NSUserDefaults standardUserDefaults] stringForKey: @"StatusLabel"], * statusString;
BOOL total;
if ((total = [statusLabel isEqualToString: STATUS_RATIO_TOTAL]) || [statusLabel isEqualToString: STATUS_RATIO_SESSION])
{
tr_session_stats stats;
if (total)
tr_sessionGetCumulativeStats(fLib, &stats);
else
tr_sessionGetStats(fLib, &stats);
statusString = [NSLocalizedString(@"Ratio", "status bar -> status label") stringByAppendingFormat: @": %@",
[NSString stringForRatio: stats.ratio]];
}
else //STATUS_TRANSFER_TOTAL or STATUS_TRANSFER_SESSION
{
total = [statusLabel isEqualToString: STATUS_TRANSFER_TOTAL];
tr_session_stats stats;
if (total)
tr_sessionGetCumulativeStats(fLib, &stats);
else
tr_sessionGetStats(fLib, &stats);
statusString = [NSString stringWithFormat: @"%@: %@ %@: %@",
NSLocalizedString(@"DL", "status bar -> status label"), [NSString stringForFileSize: stats.downloadedBytes],
NSLocalizedString(@"UL", "status bar -> status label"), [NSString stringForFileSize: stats.uploadedBytes]];
}
[fStatusButton setTitle: statusString];
[self resizeStatusButton];
}
- (void) setStatusLabel: (id) sender
{
NSString * statusLabel;
switch ([sender tag])
{
case STATUS_RATIO_TOTAL_TAG:
statusLabel = STATUS_RATIO_TOTAL;
break;
case STATUS_RATIO_SESSION_TAG:
statusLabel = STATUS_RATIO_SESSION;
break;
case STATUS_TRANSFER_TOTAL_TAG:
statusLabel = STATUS_TRANSFER_TOTAL;
break;
case STATUS_TRANSFER_SESSION_TAG:
statusLabel = STATUS_TRANSFER_SESSION;
break;
default:
NSAssert1(NO, @"Unknown status label tag received: %d", [sender tag]);
return;
}
[[NSUserDefaults standardUserDefaults] setObject: statusLabel forKey: @"StatusLabel"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil];
}
- (void) updateSpeedFieldsToolTips
{
NSString * uploadText, * downloadText;
if ([[NSUserDefaults standardUserDefaults] boolForKey: @"SpeedLimit"])
{
NSString * speedString = [NSString stringWithFormat: @"%@ (%@)", NSLocalizedString(@"%d KB/s", "Status Bar -> speed tooltip"),
NSLocalizedString(@"Speed Limit", "Status Bar -> speed tooltip")];
uploadText = [NSString stringWithFormat: speedString,
[[NSUserDefaults standardUserDefaults] integerForKey: @"SpeedLimitUploadLimit"]];
downloadText = [NSString stringWithFormat: speedString,
[[NSUserDefaults standardUserDefaults] integerForKey: @"SpeedLimitDownloadLimit"]];
}
else
{
if ([[NSUserDefaults standardUserDefaults] boolForKey: @"CheckUpload"])
uploadText = [NSString stringWithFormat: NSLocalizedString(@"%d KB/s", "Status Bar -> speed tooltip"),
[[NSUserDefaults standardUserDefaults] integerForKey: @"UploadLimit"]];
else
uploadText = NSLocalizedString(@"unlimited", "Status Bar -> speed tooltip");
if ([[NSUserDefaults standardUserDefaults] boolForKey: @"CheckDownload"])
downloadText = [NSString stringWithFormat: NSLocalizedString(@"%d KB/s", "Status Bar -> speed tooltip"),
[[NSUserDefaults standardUserDefaults] integerForKey: @"DownloadLimit"]];
else
downloadText = NSLocalizedString(@"unlimited", "Status Bar -> speed tooltip");
}
uploadText = [NSLocalizedString(@"Global upload limit", "Status Bar -> speed tooltip")
stringByAppendingFormat: @": %@", uploadText];
downloadText = [NSLocalizedString(@"Global download limit", "Status Bar -> speed tooltip")
stringByAppendingFormat: @": %@", downloadText];
[fTotalULField setToolTip: uploadText];
[fTotalDLField setToolTip: downloadText];
}
- (BOOL) validateMenuItem: (NSMenuItem *) menuItem
{
const SEL action = [menuItem action];
//enable sort options
if (action == @selector(setStatusLabel:))
{
NSString * statusLabel;
switch ([menuItem tag])
{
case STATUS_RATIO_TOTAL_TAG:
statusLabel = STATUS_RATIO_TOTAL;
break;
case STATUS_RATIO_SESSION_TAG:
statusLabel = STATUS_RATIO_SESSION;
break;
case STATUS_TRANSFER_TOTAL_TAG:
statusLabel = STATUS_TRANSFER_TOTAL;
break;
case STATUS_TRANSFER_SESSION_TAG:
statusLabel = STATUS_TRANSFER_SESSION;
break;
default:
NSAssert1(NO, @"Unknown status label tag received: %d", [menuItem tag]);
}
[menuItem setState: [statusLabel isEqualToString: [[NSUserDefaults standardUserDefaults] stringForKey: @"StatusLabel"]]
? NSOnState : NSOffState];
return YES;
}
return YES;
}
@end
@implementation StatusBarController (Private)
- (void) resizeStatusButton
{
[fStatusButton sizeToFit];
//width ends up being too long
NSRect statusFrame = [fStatusButton frame];
statusFrame.size.width -= 25.0;
const CGFloat difference = NSMaxX(statusFrame) + 5.0 - NSMinX([fTotalDLImageView frame]);
if (difference > 0)
statusFrame.size.width -= difference;
[fStatusButton setFrame: statusFrame];
}
@end

View File

@ -12,9 +12,9 @@
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
<integer value="29"/>
<integer value="589"/>
<integer value="21"/>
<integer value="29"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -2190,178 +2190,6 @@ AAAAAAAAAAAAAAAAA</bytes>
</object>
<string key="NSName"/>
</object>
<object class="NSCustomView" id="492482618">
<nil key="NSNextResponder"/>
<int key="NSvFlags">266</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTextField" id="1015813640">
<reference key="NSNextResponder" ref="492482618"/>
<int key="NSvFlags">257</int>
<string key="NSFrame">{{258, 4}, {64, 14}}</string>
<reference key="NSSuperview" ref="492482618"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="7712611">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">4325376</int>
<string key="NSContents">999.9 KB/s</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="1015813640"/>
<reference key="NSBackgroundColor" ref="969793804"/>
<reference key="NSTextColor" ref="911300388"/>
</object>
</object>
<object class="NSTextField" id="719542199">
<reference key="NSNextResponder" ref="492482618"/>
<int key="NSvFlags">257</int>
<string key="NSFrame">{{336, 4}, {64, 14}}</string>
<reference key="NSSuperview" ref="492482618"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="551795479">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">272760832</int>
<string key="NSContents">999.9 KB/s</string>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="719542199"/>
<reference key="NSBackgroundColor" ref="969793804"/>
<reference key="NSTextColor" ref="911300388"/>
</object>
</object>
<object class="NSImageView" id="300960961">
<reference key="NSNextResponder" ref="492482618"/>
<int key="NSvFlags">257</int>
<object class="NSMutableSet" key="NSDragTypes">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="set.sortedObjects">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>Apple PDF pasteboard type</string>
<string>Apple PICT pasteboard type</string>
<string>Apple PNG pasteboard type</string>
<string>NSFilenamesPboardType</string>
<string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
<string>NeXT TIFF v4.0 pasteboard type</string>
</object>
</object>
<string key="NSFrame">{{325, 5}, {8, 12}}</string>
<reference key="NSSuperview" ref="492482618"/>
<bool key="NSEnabled">YES</bool>
<object class="NSImageCell" key="NSCell" id="507285438">
<int key="NSCellFlags">130560</int>
<int key="NSCellFlags2">33554432</int>
<object class="NSCustomResource" key="NSContents">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">UpArrowTemplate</string>
</object>
<int key="NSAlign">0</int>
<int key="NSScale">1</int>
<int key="NSStyle">0</int>
<bool key="NSAnimates">YES</bool>
</object>
<bool key="NSEditable">YES</bool>
</object>
<object class="NSImageView" id="508355629">
<reference key="NSNextResponder" ref="492482618"/>
<int key="NSvFlags">257</int>
<object class="NSMutableSet" key="NSDragTypes">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="set.sortedObjects">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>Apple PDF pasteboard type</string>
<string>Apple PICT pasteboard type</string>
<string>Apple PNG pasteboard type</string>
<string>NSFilenamesPboardType</string>
<string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
<string>NeXT TIFF v4.0 pasteboard type</string>
</object>
</object>
<string key="NSFrame">{{247, 5}, {8, 12}}</string>
<reference key="NSSuperview" ref="492482618"/>
<bool key="NSEnabled">YES</bool>
<object class="NSImageCell" key="NSCell" id="268918248">
<int key="NSCellFlags">130560</int>
<int key="NSCellFlags2">33554432</int>
<object class="NSCustomResource" key="NSContents">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">DownArrowTemplate</string>
</object>
<int key="NSAlign">0</int>
<int key="NSScale">1</int>
<int key="NSStyle">0</int>
<bool key="NSAnimates">YES</bool>
</object>
<bool key="NSEditable">YES</bool>
</object>
<object class="NSPopUpButton" id="387610893">
<reference key="NSNextResponder" ref="492482618"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{5, 2}, {103, 17}}</string>
<reference key="NSSuperview" ref="492482618"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="9693266">
<int key="NSCellFlags">-2076049856</int>
<int key="NSCellFlags2">133120</int>
<reference key="NSSupport" ref="660654866"/>
<reference key="NSControlView" ref="387610893"/>
<int key="NSButtonFlags">-1229438721</int>
<int key="NSButtonFlags2">45</int>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
<object class="NSMenuItem" key="NSMenuItem" id="872140291">
<reference key="NSMenu" ref="941456853"/>
<bool key="NSIsHidden">YES</bool>
<string key="NSTitle">Ratio: 999.9</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<int key="NSState">1</int>
<reference key="NSOnImage" ref="322614661"/>
<reference key="NSMixedImage" ref="3851078"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="9693266"/>
</object>
<bool key="NSMenuItemRespectAlignment">YES</bool>
<object class="NSMenu" key="NSMenu" id="941456853">
<string key="NSTitle">OtherViews</string>
<object class="NSMutableArray" key="NSMenuItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="872140291"/>
<object class="NSMenuItem" id="474717273">
<reference key="NSMenu" ref="941456853"/>
<string key="NSTitle">Item 2</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="322614661"/>
<reference key="NSMixedImage" ref="3851078"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="9693266"/>
</object>
<object class="NSMenuItem" id="391930248">
<reference key="NSMenu" ref="941456853"/>
<string key="NSTitle">Item 3</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="322614661"/>
<reference key="NSMixedImage" ref="3851078"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="9693266"/>
</object>
</object>
</object>
<bool key="NSPullDown">YES</bool>
<int key="NSPreferredEdge">1</int>
<bool key="NSUsesItemFromMenu">YES</bool>
<bool key="NSAltersState">YES</bool>
</object>
</object>
</object>
<string key="NSFrameSize">{400, 21}</string>
<string key="NSClassName">StatusBarView</string>
<string key="NSExtension">NSView</string>
</object>
<object class="NSCustomView" id="793806362">
<nil key="NSNextResponder"/>
<int key="NSvFlags">266</int>
@ -3232,65 +3060,6 @@ AAAAAAAAAAAAAAAAA</bytes>
</object>
<string key="NSName"/>
</object>
<object class="NSMenu" id="235340910">
<string key="NSTitle">StatusMenu</string>
<object class="NSMutableArray" key="NSMenuItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSMenuItem" id="1033464046">
<reference key="NSMenu" ref="235340910"/>
<string key="NSTitle"/>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<object class="NSCustomResource" key="NSImage">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">YingYangTemplate</string>
</object>
<reference key="NSOnImage" ref="322614661"/>
<reference key="NSMixedImage" ref="3851078"/>
<int key="NSTag">-1</int>
</object>
<object class="NSMenuItem" id="534231875">
<reference key="NSMenu" ref="235340910"/>
<string key="NSTitle">Total Ratio</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="322614661"/>
<reference key="NSMixedImage" ref="3851078"/>
</object>
<object class="NSMenuItem" id="681676781">
<reference key="NSMenu" ref="235340910"/>
<string key="NSTitle">Session Ratio</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="322614661"/>
<reference key="NSMixedImage" ref="3851078"/>
<int key="NSTag">1</int>
</object>
<object class="NSMenuItem" id="459079778">
<reference key="NSMenu" ref="235340910"/>
<string key="NSTitle">Total Transfer</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="322614661"/>
<reference key="NSMixedImage" ref="3851078"/>
<int key="NSTag">2</int>
</object>
<object class="NSMenuItem" id="455205239">
<reference key="NSMenu" ref="235340910"/>
<string key="NSTitle">Session Transfer</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="322614661"/>
<reference key="NSMixedImage" ref="3851078"/>
<int key="NSTag">3</int>
</object>
</object>
</object>
<object class="NSMenu" id="1051299321">
<string key="NSTitle">StatusMenu</string>
<object class="NSMutableArray" key="NSMenuItems">
@ -4245,78 +4014,6 @@ AAAAAAAAAAAAAAAAA</bytes>
</object>
<int key="connectionID">2327</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">fTotalDLField</string>
<reference key="source" ref="30116300"/>
<reference key="destination" ref="1015813640"/>
</object>
<int key="connectionID">2474</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">fTotalULField</string>
<reference key="source" ref="30116300"/>
<reference key="destination" ref="719542199"/>
</object>
<int key="connectionID">2475</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">fStatusBar</string>
<reference key="source" ref="30116300"/>
<reference key="destination" ref="492482618"/>
</object>
<int key="connectionID">2524</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">fStatusButton</string>
<reference key="source" ref="30116300"/>
<reference key="destination" ref="387610893"/>
</object>
<int key="connectionID">2557</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">menu</string>
<reference key="source" ref="387610893"/>
<reference key="destination" ref="235340910"/>
</object>
<int key="connectionID">2563</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">setStatusLabel:</string>
<reference key="source" ref="30116300"/>
<reference key="destination" ref="534231875"/>
</object>
<int key="connectionID">2565</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">setStatusLabel:</string>
<reference key="source" ref="30116300"/>
<reference key="destination" ref="681676781"/>
</object>
<int key="connectionID">2566</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">setStatusLabel:</string>
<reference key="source" ref="30116300"/>
<reference key="destination" ref="459079778"/>
</object>
<int key="connectionID">2567</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">setStatusLabel:</string>
<reference key="source" ref="30116300"/>
<reference key="destination" ref="455205239"/>
</object>
<int key="connectionID">2568</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">menu</string>
@ -4709,14 +4406,6 @@ AAAAAAAAAAAAAAAAA</bytes>
</object>
<int key="connectionID">3153</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">fTotalDLImageView</string>
<reference key="source" ref="30116300"/>
<reference key="destination" ref="508355629"/>
</object>
<int key="connectionID">3154</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">toggleStatusString:</string>
@ -6081,65 +5770,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<reference key="object" ref="247408388"/>
<reference key="parent" ref="354817592"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1480</int>
<reference key="object" ref="492482618"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="1015813640"/>
<reference ref="719542199"/>
<reference ref="300960961"/>
<reference ref="508355629"/>
<reference ref="387610893"/>
</object>
<reference key="parent" ref="0"/>
<string key="objectName">StatusBar</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">2061</int>
<reference key="object" ref="1015813640"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="7712611"/>
</object>
<reference key="parent" ref="492482618"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2062</int>
<reference key="object" ref="719542199"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="551795479"/>
</object>
<reference key="parent" ref="492482618"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2410</int>
<reference key="object" ref="300960961"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="507285438"/>
</object>
<reference key="parent" ref="492482618"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2412</int>
<reference key="object" ref="508355629"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="268918248"/>
</object>
<reference key="parent" ref="492482618"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2551</int>
<reference key="object" ref="387610893"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="9693266"/>
</object>
<reference key="parent" ref="492482618"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1603</int>
<reference key="object" ref="793806362"/>
@ -6390,45 +6020,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<reference key="object" ref="1006001887"/>
<reference key="parent" ref="242528882"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2547</int>
<reference key="object" ref="235340910"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="1033464046"/>
<reference ref="534231875"/>
<reference ref="681676781"/>
<reference ref="459079778"/>
<reference ref="455205239"/>
</object>
<reference key="parent" ref="0"/>
<string key="objectName">StatusMenu</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">2548</int>
<reference key="object" ref="1033464046"/>
<reference key="parent" ref="235340910"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2560</int>
<reference key="object" ref="534231875"/>
<reference key="parent" ref="235340910"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2561</int>
<reference key="object" ref="681676781"/>
<reference key="parent" ref="235340910"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2562</int>
<reference key="object" ref="459079778"/>
<reference key="parent" ref="235340910"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2564</int>
<reference key="object" ref="455205239"/>
<reference key="parent" ref="235340910"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2942</int>
<reference key="object" ref="1051299321"/>
@ -6475,35 +6066,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<reference key="object" ref="696487414"/>
<reference key="parent" ref="403739499"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">3050</int>
<reference key="object" ref="7712611"/>
<reference key="parent" ref="1015813640"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">3051</int>
<reference key="object" ref="551795479"/>
<reference key="parent" ref="719542199"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">3052</int>
<reference key="object" ref="507285438"/>
<reference key="parent" ref="300960961"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">3053</int>
<reference key="object" ref="268918248"/>
<reference key="parent" ref="508355629"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">3054</int>
<reference key="object" ref="9693266"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="941456853"/>
</object>
<reference key="parent" ref="387610893"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">3057</int>
<reference key="object" ref="186597542"/>
@ -6569,32 +6131,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<reference key="object" ref="420710921"/>
<reference key="parent" ref="97165992"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2553</int>
<reference key="object" ref="941456853"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="391930248"/>
<reference ref="474717273"/>
<reference ref="872140291"/>
</object>
<reference key="parent" ref="9693266"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2556</int>
<reference key="object" ref="391930248"/>
<reference key="parent" ref="941456853"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2555</int>
<reference key="object" ref="474717273"/>
<reference key="parent" ref="941456853"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2554</int>
<reference key="object" ref="872140291"/>
<reference key="parent" ref="941456853"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2978</int>
<reference key="object" ref="135534639"/>
@ -7019,10 +6555,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>144.ImportedFromIB2</string>
<string>145.IBPluginDependency</string>
<string>145.ImportedFromIB2</string>
<string>1480.IBEditorWindowLastContentRect</string>
<string>1480.IBPluginDependency</string>
<string>1480.ImportedFromIB2</string>
<string>1480.editorWindowContentRectSynchronizationRect</string>
<string>149.IBPluginDependency</string>
<string>149.ImportedFromIB2</string>
<string>150.IBPluginDependency</string>
@ -7251,10 +6783,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>2045.IBPluginDependency</string>
<string>2045.ImportedFromIB2</string>
<string>206.ImportedFromIB2</string>
<string>2061.IBPluginDependency</string>
<string>2061.ImportedFromIB2</string>
<string>2062.IBPluginDependency</string>
<string>2062.ImportedFromIB2</string>
<string>2071.IBPluginDependency</string>
<string>2071.ImportedFromIB2</string>
<string>21.IBEditorWindowLastContentRect</string>
@ -7292,32 +6820,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>2324.ImportedFromIB2</string>
<string>2326.IBPluginDependency</string>
<string>2326.ImportedFromIB2</string>
<string>2410.IBPluginDependency</string>
<string>2410.ImportedFromIB2</string>
<string>2412.IBPluginDependency</string>
<string>2412.ImportedFromIB2</string>
<string>2547.IBPluginDependency</string>
<string>2547.ImportedFromIB2</string>
<string>2548.IBPluginDependency</string>
<string>2548.ImportedFromIB2</string>
<string>2551.IBPluginDependency</string>
<string>2551.ImportedFromIB2</string>
<string>2553.IBPluginDependency</string>
<string>2553.ImportedFromIB2</string>
<string>2554.IBPluginDependency</string>
<string>2554.ImportedFromIB2</string>
<string>2555.IBPluginDependency</string>
<string>2555.ImportedFromIB2</string>
<string>2556.IBPluginDependency</string>
<string>2556.ImportedFromIB2</string>
<string>2560.IBPluginDependency</string>
<string>2560.ImportedFromIB2</string>
<string>2561.IBPluginDependency</string>
<string>2561.ImportedFromIB2</string>
<string>2562.IBPluginDependency</string>
<string>2562.ImportedFromIB2</string>
<string>2564.IBPluginDependency</string>
<string>2564.ImportedFromIB2</string>
<string>2681.IBPluginDependency</string>
<string>2681.IBViewBoundsToFrameTransform</string>
<string>2681.ImportedFromIB2</string>
@ -7390,11 +6892,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>3047.IBPluginDependency</string>
<string>3048.IBPluginDependency</string>
<string>3049.IBPluginDependency</string>
<string>3050.IBPluginDependency</string>
<string>3051.IBPluginDependency</string>
<string>3052.IBPluginDependency</string>
<string>3053.IBPluginDependency</string>
<string>3054.IBPluginDependency</string>
<string>3057.IBPluginDependency</string>
<string>3058.IBPluginDependency</string>
<string>3059.IBPluginDependency</string>
@ -7619,10 +7116,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>{{208, 808}, {400, 21}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>{{0, 974}, {400, 21}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -7853,10 +7346,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>{{71, 712}, {515, 248}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{71, 712}, {515, 248}}</string>
@ -7893,32 +7382,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSAffineTransform">
<bytes key="NSTransformStruct">P4AAAL+AAABAwAAAwZgAAA</bytes>
</object>
@ -8001,11 +7464,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
@ -8189,7 +7647,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>setSort:</string>
<string>setSortByGroup:</string>
<string>setSortReverse:</string>
<string>setStatusLabel:</string>
<string>showAboutWindow:</string>
<string>showInfo:</string>
<string>showMainWindow:</string>
@ -8265,7 +7722,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
@ -8306,7 +7762,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>setSort:</string>
<string>setSortByGroup:</string>
<string>setSortReverse:</string>
<string>setStatusLabel:</string>
<string>showAboutWindow:</string>
<string>showInfo:</string>
<string>showMainWindow:</string>
@ -8465,10 +7920,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<string key="name">setSortReverse:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">setStatusLabel:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">showAboutWindow:</string>
<string key="candidateClassName">id</string>
@ -8578,12 +8029,8 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>fSeedFilterButton</string>
<string>fSpeedLimitButton</string>
<string>fStatusBar</string>
<string>fStatusButton</string>
<string>fTableView</string>
<string>fTotalDLField</string>
<string>fTotalDLImageView</string>
<string>fTotalTorrentsField</string>
<string>fTotalULField</string>
<string>fUploadLimitItem</string>
<string>fUploadMenu</string>
<string>fUploadNoLimitItem</string>
@ -8617,13 +8064,9 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>NSSearchField</string>
<string>FilterButton</string>
<string>NSButton</string>
<string>StatusBarView</string>
<string>NSButton</string>
<string>StatusBarController</string>
<string>TorrentTableView</string>
<string>NSTextField</string>
<string>NSImageView</string>
<string>NSTextField</string>
<string>NSTextField</string>
<string>NSMenuItem</string>
<string>NSMenu</string>
<string>NSMenuItem</string>
@ -8661,12 +8104,8 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>fSeedFilterButton</string>
<string>fSpeedLimitButton</string>
<string>fStatusBar</string>
<string>fStatusButton</string>
<string>fTableView</string>
<string>fTotalDLField</string>
<string>fTotalDLImageView</string>
<string>fTotalTorrentsField</string>
<string>fTotalULField</string>
<string>fUploadLimitItem</string>
<string>fUploadMenu</string>
<string>fUploadNoLimitItem</string>
@ -8780,32 +8219,16 @@ AAAAAAAAAAAAAAAAA</bytes>
</object>
<object class="IBToOneOutletInfo">
<string key="name">fStatusBar</string>
<string key="candidateClassName">StatusBarView</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">fStatusButton</string>
<string key="candidateClassName">NSButton</string>
<string key="candidateClassName">StatusBarController</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">fTableView</string>
<string key="candidateClassName">TorrentTableView</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">fTotalDLField</string>
<string key="candidateClassName">NSTextField</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">fTotalDLImageView</string>
<string key="candidateClassName">NSImageView</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">fTotalTorrentsField</string>
<string key="candidateClassName">NSTextField</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">fTotalULField</string>
<string key="candidateClassName">NSTextField</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">fUploadLimitItem</string>
<string key="candidateClassName">NSMenuItem</string>
@ -9236,19 +8659,68 @@ AAAAAAAAAAAAAAAAA</bytes>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">StatusBarView</string>
<string key="superclassName">NSView</string>
<string key="className">StatusBarController</string>
<string key="superclassName">NSViewController</string>
<object class="NSMutableDictionary" key="actions">
<string key="NS.key.0">setStatusLabel:</string>
<string key="NS.object.0">id</string>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
<string key="NS.key.0">setStatusLabel:</string>
<object class="IBActionInfo" key="NS.object.0">
<string key="name">setStatusLabel:</string>
<string key="candidateClassName">id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>fStatusButton</string>
<string>fTotalDLField</string>
<string>fTotalDLImageView</string>
<string>fTotalULField</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSButton</string>
<string>NSTextField</string>
<string>NSImageView</string>
<string>NSTextField</string>
</object>
</object>
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>fStatusButton</string>
<string>fTotalDLField</string>
<string>fTotalDLImageView</string>
<string>fTotalULField</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBToOneOutletInfo">
<string key="name">fStatusButton</string>
<string key="candidateClassName">NSButton</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">fTotalDLField</string>
<string key="candidateClassName">NSTextField</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">fTotalDLImageView</string>
<string key="candidateClassName">NSImageView</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">fTotalULField</string>
<string key="candidateClassName">NSTextField</string>
</object>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">macosx/StatusBarView.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">StatusBarView</string>
<string key="superclassName">NSView</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBUserSource</string>
<string key="minorKey"/>
<string key="minorKey">macosx/StatusBarController.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
@ -10170,6 +9642,25 @@ AAAAAAAAAAAAAAAAA</bytes>
<string key="superclassName">NSResponder</string>
<reference key="sourceIdentifier" ref="543656968"/>
</object>
<object class="IBPartialClassDescription">
<string key="className">NSViewController</string>
<string key="superclassName">NSResponder</string>
<object class="NSMutableDictionary" key="outlets">
<string key="NS.key.0">view</string>
<string key="NS.object.0">NSView</string>
</object>
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
<string key="NS.key.0">view</string>
<object class="IBToOneOutletInfo" key="NS.object.0">
<string key="name">view</string>
<string key="candidateClassName">NSView</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBFrameworkSource</string>
<string key="minorKey">AppKit.framework/Headers/NSViewController.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">NSWindow</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
@ -10401,7 +9892,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>DownArrowTemplate</string>
<string>NSActionTemplate</string>
<string>NSMenuCheckmark</string>
<string>NSMenuMixedState</string>
@ -10409,12 +9899,9 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>PriorityLow</string>
<string>PriorityNormal</string>
<string>TurtleTemplate</string>
<string>UpArrowTemplate</string>
<string>YingYangTemplate</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>{8, 12}</string>
<string>{15, 15}</string>
<string>{9, 8}</string>
<string>{7, 2}</string>
@ -10422,8 +9909,6 @@ AAAAAAAAAAAAAAAAA</bytes>
<string>{14, 14}</string>
<string>{14, 14}</string>
<string>{64, 64}</string>
<string>{8, 12}</string>
<string>{10, 12}</string>
</object>
</object>
</data>