this better work

This commit is contained in:
Mitchell Livingston 2007-09-16 01:02:06 +00:00
parent a950a0afd8
commit 844341faef
382 changed files with 26354 additions and 0 deletions

1
.gitignore vendored
View File

@ -17,6 +17,7 @@ gtk/transmission-gtk
libtransmission/*.a
libtransmission/.depend
libtransmission/version.h
macosx/English.lproj/*~.nib
macosx/Info.plist
macosx/Transmission.app
mk/config.mk

View File

@ -0,0 +1,39 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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>
@interface AboutWindowController : NSWindowController
{
IBOutlet NSTextView * fTextView, * fLicenseView;
IBOutlet NSTextField * fVersionField, * fCopyrightField;
IBOutlet NSPanel * fLicenseSheet;
}
+ (AboutWindowController *) aboutController;
- (IBAction) showLicense: (id) sender;
- (IBAction) hideLicense: (id) sender;
@end

View File

@ -0,0 +1,72 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "AboutWindowController.h"
@implementation AboutWindowController
AboutWindowController * fAboutBoxInstance = nil;
+ (AboutWindowController *) aboutController
{
if (!fAboutBoxInstance)
fAboutBoxInstance = [[self alloc] initWithWindowNibName: @"AboutWindow"];
return fAboutBoxInstance;
}
#warning make completely localized
- (void) windowDidLoad
{
NSDictionary * info = [[NSBundle mainBundle] infoDictionary];
[fVersionField setStringValue: [NSString stringWithFormat: @"%@ (%@)",
[info objectForKey: @"CFBundleShortVersionString"], [info objectForKey: (NSString *)kCFBundleVersionKey]]];
[fCopyrightField setStringValue: [[NSBundle mainBundle] localizedStringForKey: @"NSHumanReadableCopyright"
value: nil table: @"InfoPlist"]];
[[fTextView textStorage] setAttributedString: [[[NSAttributedString alloc] initWithPath:
[[NSBundle mainBundle] pathForResource: @"Credits" ofType: @"rtf"] documentAttributes: nil] autorelease]];
[[self window] center];
}
- (void) windowWillClose: (id)sender
{
[fAboutBoxInstance release];
fAboutBoxInstance = nil;
}
- (IBAction) showLicense: (id) sender
{
[fLicenseView setString: [NSString stringWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"LICENSE" ofType: nil]]];
[NSApp beginSheet: fLicenseSheet modalForWindow: [self window] modalDelegate: nil didEndSelector: nil contextInfo: nil];
}
- (IBAction) hideLicense: (id) sender
{
[fLicenseSheet orderOut: nil];
[NSApp endSheet: fLicenseSheet];
}
@end

View File

@ -0,0 +1,31 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 <Foundation/Foundation.h>
@interface ActionMenuRatioToDisplayRatioTransformer : NSValueTransformer
{
}
@end

View File

@ -0,0 +1,45 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "ActionMenuRatioToDisplayRatioTransformer.h"
@implementation ActionMenuRatioToDisplayRatioTransformer
+ (Class) transformedValueClass
{
return [NSString class];
}
+ (BOOL) allowsReverseTransformation
{
return NO;
}
- (id) transformedValue: (id) value
{
return value == nil ? nil : [NSString stringWithFormat: NSLocalizedString(@"Stop at Ratio (%.2f)",
"Action context menu -> ratio stop"), [value floatValue]];
}
@end

View File

@ -0,0 +1,31 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 <Foundation/Foundation.h>
@interface ActionMenuSpeedToDisplayLimitTransformer : NSValueTransformer
{
}
@end

View File

@ -0,0 +1,45 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "ActionMenuSpeedToDisplayLimitTransformer.h"
@implementation ActionMenuSpeedToDisplayLimitTransformer
+ (Class) transformedValueClass
{
return [NSString class];
}
+ (BOOL) allowsReverseTransformation
{
return NO;
}
- (id) transformedValue: (id) value
{
return value == nil ? nil : [NSString stringWithFormat: NSLocalizedString(@"Limit (%d KB/s)",
"Action context menu -> upload/download limit"), [value intValue]];
}
@end

View File

@ -0,0 +1,31 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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>
@interface ActionPopUpButton : NSPopUpButton
{
NSImage * fImage, * fImagePressed;
}
@end

View File

@ -0,0 +1,47 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "ActionPopUpButton.h"
@implementation ActionPopUpButton
- (id) initWithCoder: (NSCoder *) coder
{
if ((self = [super initWithCoder: coder]))
{
fImage = [NSImage imageNamed: @"ActionButton.png"];
[fImage setFlipped: YES];
fImagePressed = [NSImage imageNamed: @"ActionButtonPressed.png"];
[fImagePressed setFlipped: YES];
}
return self;
}
- (void) drawRect: (NSRect) rect
{
NSImage * image = [[self cell] isHighlighted] ? fImagePressed : fImage;
[image drawInRect: [self bounds] fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0];
}
@end

Binary file not shown.

50
macosx/Badger.h Normal file
View File

@ -0,0 +1,50 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2006-2007 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.
*****************************************************************************/
#ifndef BADGER_H
#define BADGER_H
#import <Cocoa/Cocoa.h>
#import <transmission.h>
@interface Badger : NSObject
{
tr_handle_t * fLib;
NSImage * fDockIcon, * fBadge, * fUploadBadge, * fDownloadBadge;
NSDictionary * fAttributes;
int fCompleted, fCompletedBadged;
BOOL fSpeedBadge;
}
- (id) initWithLib: (tr_handle_t *) lib;
- (void) updateBadge;
- (void) incrementCompleted;
- (void) clearCompleted;
- (void) clearBadge;
@end
#endif

239
macosx/Badger.m Normal file
View File

@ -0,0 +1,239 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2006-2007 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 "Badger.h"
#import "NSStringAdditions.h"
@interface Badger (Private)
- (void) badgeString: (NSString *) string forRect: (NSRect) rect;
@end
@implementation Badger
- (id) initWithLib: (tr_handle_t *) lib
{
if ((self = [super init]))
{
fLib = lib;
fCompleted = 0;
fCompletedBadged = 0;
fSpeedBadge = NO;
}
return self;
}
- (void) dealloc
{
[fDockIcon release];
[fAttributes release];
[super dealloc];
}
- (void) updateBadge
{
//set completed badge to top right
BOOL baseChange;
if (baseChange = (fCompleted != fCompletedBadged))
{
fCompletedBadged = fCompleted;
//force image to reload - copy does not work
NSImage * icon = [[NSImage imageNamed: @"NSApplicationIcon"] copy];
NSSize iconSize = [icon size];
if (fDockIcon)
[fDockIcon release];
fDockIcon = [[NSImage alloc] initWithSize: iconSize];
[fDockIcon addRepresentation: [icon bestRepresentationForDevice: nil]];
[icon release];
if (fCompleted > 0)
{
if (!fBadge)
fBadge = [NSImage imageNamed: @"Badge"];
NSRect badgeRect;
badgeRect.size = [fBadge size];
badgeRect.origin.x = iconSize.width - badgeRect.size.width;
badgeRect.origin.y = iconSize.height - badgeRect.size.height;
[fDockIcon lockFocus];
//place badge
[fBadge compositeToPoint: badgeRect.origin operation: NSCompositeSourceOver];
//ignore shadow of badge when placing string
float badgeBottomExtra = 5.0;
badgeRect.size.height -= badgeBottomExtra;
badgeRect.origin.y += badgeBottomExtra;
//place badge text
[self badgeString: [NSString stringWithFormat: @"%d", fCompleted] forRect: badgeRect];
[fDockIcon unlockFocus];
}
}
//set upload and download rate badges
NSString * downloadRateString = nil, * uploadRateString = nil;
BOOL checkDownload = [[NSUserDefaults standardUserDefaults] boolForKey: @"BadgeDownloadRate"],
checkUpload = [[NSUserDefaults standardUserDefaults] boolForKey: @"BadgeUploadRate"];
if (checkDownload || checkUpload)
{
float downloadRate, uploadRate;
tr_torrentRates(fLib, &downloadRate, &uploadRate);
if (checkDownload && downloadRate >= 0.1)
downloadRateString = [NSString stringForSpeedAbbrev: downloadRate];
if (checkUpload && uploadRate >= 0.1)
uploadRateString = [NSString stringForSpeedAbbrev: uploadRate];
}
NSImage * dockIcon = nil;
BOOL speedChange;
if ((speedChange = (uploadRateString || downloadRateString)))
{
if (!fDockIcon)
fDockIcon = [[NSImage imageNamed: @"NSApplicationIcon"] copy];
dockIcon = [fDockIcon copy];
if (!fUploadBadge)
fUploadBadge = [NSImage imageNamed: @"UploadBadge"];
if (!fDownloadBadge)
fDownloadBadge = [NSImage imageNamed: @"DownloadBadge"];
NSRect badgeRect;
badgeRect.size = [fUploadBadge size];
badgeRect.origin = NSZeroPoint;
//ignore shadow of badge when placing string
NSRect stringRect = badgeRect;
float badgeBottomExtra = 2.0;
stringRect.size.height -= badgeBottomExtra;
stringRect.origin.y += badgeBottomExtra;
[dockIcon lockFocus];
if (uploadRateString)
{
//place badge
[fUploadBadge compositeToPoint: badgeRect.origin operation: NSCompositeSourceOver];
//place badge text
[self badgeString: uploadRateString forRect: stringRect];
}
if (downloadRateString)
{
//download rate above upload rate
if (uploadRateString)
{
float spaceBetween = badgeRect.size.height + 2.0;
badgeRect.origin.y += spaceBetween;
stringRect.origin.y += spaceBetween;
}
//place badge
[fDownloadBadge compositeToPoint: badgeRect.origin operation: NSCompositeSourceOver];
//place badge text
[self badgeString: downloadRateString forRect: stringRect];
}
[dockIcon unlockFocus];
}
//update dock badge
if (baseChange || fSpeedBadge || speedChange)
{
[NSApp setApplicationIconImage: dockIcon ? dockIcon : fDockIcon];
if (dockIcon)
[dockIcon release];
fSpeedBadge = speedChange;
}
}
- (void) incrementCompleted
{
fCompleted++;
[self updateBadge];
}
- (void) clearCompleted
{
if (fCompleted != 0)
{
fCompleted = 0;
[self updateBadge];
}
}
- (void) clearBadge
{
fCompleted = 0;
fCompletedBadged = 0;
fSpeedBadge = NO;
[NSApp setApplicationIconImage: [NSImage imageNamed: @"NSApplicationIcon"]];
}
@end
@implementation Badger (Private)
//dock icon must have locked focus
- (void) badgeString: (NSString *) string forRect: (NSRect) rect
{
if (!fAttributes)
{
NSShadow * stringShadow = [[NSShadow alloc] init];
[stringShadow setShadowOffset: NSMakeSize(2.0, -2.0)];
[stringShadow setShadowBlurRadius: 4.0];
NSFont * boldFont = [[NSFontManager sharedFontManager] convertFont:
[NSFont fontWithName: @"Helvetica" size: 28.0] toHaveTrait: NSBoldFontMask];
fAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSColor whiteColor], NSForegroundColorAttributeName,
boldFont, NSFontAttributeName, stringShadow, NSShadowAttributeName, nil];
[stringShadow release];
}
NSSize stringSize = [string sizeWithAttributes: fAttributes];
//string is in center of image
rect.origin.x += (rect.size.width - stringSize.width) * 0.5;
rect.origin.y += (rect.size.height - stringSize.height) * 0.5;
[string drawAtPoint: rect.origin withAttributes: fAttributes];
}
@end

View File

@ -0,0 +1,74 @@
//
// CTGradient.h
//
// Created by Chad Weider on 2/14/07.
// Copyright (c) 2007 Chad Weider.
// Some rights reserved: <http://creativecommons.org/licenses/by/2.5/>
//
// Version: 1.6
#import <Cocoa/Cocoa.h>
typedef struct _CTGradientElement
{
float red, green, blue, alpha;
float position;
struct _CTGradientElement *nextElement;
} CTGradientElement;
typedef enum _CTBlendingMode
{
CTLinearBlendingMode,
CTChromaticBlendingMode,
CTInverseChromaticBlendingMode
} CTGradientBlendingMode;
@interface CTGradient : NSObject <NSCopying, NSCoding>
{
CTGradientElement* elementList;
CTGradientBlendingMode blendingMode;
CGFunctionRef gradientFunction;
}
+ (id)gradientWithBeginningColor:(NSColor *)begin endingColor:(NSColor *)end;
+ (id)aquaSelectedGradient;
+ (id)aquaNormalGradient;
+ (id)aquaPressedGradient;
+ (id)unifiedSelectedGradient;
+ (id)unifiedNormalGradient;
+ (id)unifiedPressedGradient;
+ (id)unifiedDarkGradient;
+ (id)sourceListSelectedGradient;
+ (id)sourceListUnselectedGradient;
+ (id)rainbowGradient;
+ (id)hydrogenSpectrumGradient;
- (CTGradient *)gradientWithAlphaComponent:(float)alpha;
- (void)addElement:(CTGradientElement*)newElement;
- (CTGradient *)addColorStop:(NSColor *)color atPosition:(float)position; //positions given relative to [0,1]
- (CTGradient *)removeColorStopAtIndex:(unsigned)index;
- (CTGradient *)removeColorStopAtPosition:(float)position;
- (CTGradientBlendingMode)blendingMode;
- (NSColor *)colorStopAtIndex:(unsigned)index;
- (NSColor *)colorAtPosition:(float)position;
- (void)drawSwatchInRect:(NSRect)rect;
- (void)fillRect:(NSRect)rect angle:(float)angle; //fills rect with axial gradient
// angle in degrees
- (void)radialFillRect:(NSRect)rect; //fills rect with radial gradient
// gradient from center outwards
- (void)fillBezierPath:(NSBezierPath *)path angle:(float)angle;
- (void)radialFillBezierPath:(NSBezierPath *)path;
@end

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,49 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "CTGradient.h"
@interface CTGradient (ActionBarView)
+ (CTGradient *)actionNormalGradient;
+ (CTGradient *)actionPressedGradient;
@end
@interface CTGradient (ProgressBar)
+ (CTGradient *)progressWhiteGradient;
+ (CTGradient *)progressGrayGradient;
+ (CTGradient *)progressLightGrayGradient;
+ (CTGradient *)progressBlueGradient;
+ (CTGradient *)progressDarkBlueGradient;
+ (CTGradient *)progressGreenGradient;
+ (CTGradient *)progressLightGreenGradient;
+ (CTGradient *)progressDarkGreenGradient;
+ (CTGradient *)progressYellowGradient;
+ (CTGradient *)progressTransparentGradient;
@end
@interface CTGradient (MiddleColour)
+ (CTGradient *)gradientWithBeginningColor:(NSColor *)begin middleColor:(NSColor *)middle endingColor:(NSColor *)end;
+ (CTGradient *)gradientWithBeginningColor:(NSColor *)begin middleColor1:(NSColor *)middle1
middleColor2:(NSColor *)middle2 endingColor:(NSColor *)end;
@end

View File

@ -0,0 +1,540 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "CTGradientAdditions.h"
@implementation CTGradient (ActionBar)
+ (CTGradient *)actionNormalGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = color1.green = color1.blue = 0.9;
color1.alpha = 1.00;
color1.position = 0;
CTGradientElement color2;
color2.red = color2.green = color2.blue = 0.9;
color2.alpha = 1.00;
color2.position = 0.5;
CTGradientElement color3;
color3.red = color3.green = color3.blue = 0.95;
color3.alpha = 1.00;
color3.position = 0.5;
CTGradientElement color4;
color4.red = color4.green = color4.blue = 1.0;
color4.alpha = 1.00;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
+ (CTGradient *)actionPressedGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = color1.green = color1.blue = 0.80;
color1.alpha = 1.00;
color1.position = 0;
CTGradientElement color2;
color2.red = color2.green = color2.blue = 0.64;
color2.alpha = 1.00;
color2.position = 11.5/23;
CTGradientElement color3;
color3.red = color3.green = color3.blue = 0.80;
color3.alpha = 1.00;
color3.position = 11.5/23;
CTGradientElement color4;
color4.red = color4.green = color4.blue = 0.77;
color4.alpha = 1.00;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
@end
@implementation CTGradient (ProgressBar)
+ (CTGradient *)progressWhiteGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = color1.green = color1.blue = 0.95;
color1.alpha = 1.00;
color1.position = 0;
CTGradientElement color2;
color2.red = color2.green = color2.blue = 0.83;
color2.alpha = 1.00;
color2.position = 11.5/23;
CTGradientElement color3;
color3.red = color3.green = color3.blue = 0.95;
color3.alpha = 1.00;
color3.position = 11.5/23;
CTGradientElement color4;
color4.red = color4.green = color4.blue = 0.92;
color4.alpha = 1.00;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
+ (CTGradient *)progressGrayGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = color1.green = color1.blue = 0.7;
color1.alpha = 1.00;
color1.position = 0;
CTGradientElement color2;
color2.red = color2.green = color2.blue = 0.6;
color2.alpha = 1.00;
color2.position = 0.5;
CTGradientElement color3;
color3.red = color3.green = color3.blue = 0.7;
color3.alpha = 1.00;
color3.position = 0.5;
CTGradientElement color4;
color4.red = color4.green = color4.blue = 0.7;
color4.alpha = 1.00;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
+ (CTGradient *)progressLightGrayGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = color1.green = color1.blue = 0.87;
color1.alpha = 1.00;
color1.position = 0;
CTGradientElement color2;
color2.red = color2.green = color2.blue = 0.754;
color2.alpha = 1.00;
color2.position = 0.5;
CTGradientElement color3;
color3.red = color3.green = color3.blue = 0.87;
color3.alpha = 1.00;
color3.position = 0.5;
CTGradientElement color4;
color4.red = color4.green = color4.blue = 0.87;
color4.alpha = 1.00;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
+ (CTGradient *)progressBlueGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = 0.416;
color1.green = 0.788;
color1.blue = 0.97;
color1.alpha = 1.00;
color1.position = 0;
CTGradientElement color2;
color2.red = 0.274;
color2.green = 0.52;
color2.blue = 0.94;
color2.alpha = 1.00;
color2.position = 0.5;
CTGradientElement color3;
color3.red = 0.372;
color3.green = 0.635;
color3.blue = 0.98;
color3.alpha = 1.00;
color3.position = 0.5;
CTGradientElement color4;
color4.red = 0.396;
color4.green = 0.66;
color4.blue = 1.00;
color4.alpha = 1.00;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
+ (CTGradient *)progressDarkBlueGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = 0.616;
color1.green = 0.722;
color1.blue = 0.776;
color1.alpha = 1.00;
color1.position = 0;
CTGradientElement color2;
color2.red = 0.525;
color2.green = 0.631;
color2.blue = 0.737;
color2.alpha = 1.00;
color2.position = 0.5;
CTGradientElement color3;
color3.red = 0.651;
color3.green = 0.725;
color3.blue = 0.804;
color3.alpha = 1.00;
color3.position = 0.5;
CTGradientElement color4;
color4.red = 0.659;
color4.green = 0.733;
color4.blue = 0.800;
color4.alpha = 1.00;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
+ (CTGradient *)progressGreenGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = 0.270;
color1.green = 0.89;
color1.blue = 0.35;
color1.alpha = 1.00;
color1.position = 0;
CTGradientElement color2;
color2.red = 0.180;
color2.green = 0.71;
color2.blue = 0.23;
color2.alpha = 1.00;
color2.position = 0.5;
CTGradientElement color3;
color3.red = 0.420;
color3.green = 0.86;
color3.blue = 0.32;
color3.alpha = 1.00;
color3.position = 0.5;
CTGradientElement color4;
color4.red = 0.466;
color4.green = 0.89;
color4.blue = 0.34;
color4.alpha = 1.00;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
+ (CTGradient *)progressLightGreenGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = 0.522;
color1.green = 0.894;
color1.blue = 0.565;
color1.alpha = 1.00;
color1.position = 0;
CTGradientElement color2;
color2.red = 0.373;
color2.green = 0.780;
color2.blue = 0.408;
color2.alpha = 1.00;
color2.position = 0.5;
CTGradientElement color3;
color3.red = 0.659;
color3.green = 0.918;
color3.blue = 0.604;
color3.alpha = 1.00;
color3.position = 0.5;
CTGradientElement color4;
color4.red = 0.678;
color4.green = 0.929;
color4.blue = 0.608;
color4.alpha = 1.00;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
+ (CTGradient *)progressDarkGreenGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = 0.627;
color1.green = 0.714;
color1.blue = 0.639;
color1.alpha = 1.00;
color1.position = 0;
CTGradientElement color2;
color2.red = 0.545;
color2.green = 0.635;
color2.blue = 0.561;
color2.alpha = 1.00;
color2.position = 0.5;
CTGradientElement color3;
color3.red = 0.690;
color3.green = 0.745;
color3.blue = 0.675;
color3.alpha = 1.00;
color3.position = 0.5;
CTGradientElement color4;
color4.red = 0.694;
color4.green = 0.741;
color4.blue = 0.678;
color4.alpha = 1.00;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
+ (CTGradient *)progressYellowGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = 0.933;
color1.green = 0.831;
color1.blue = 0.227;
color1.alpha = 1.00;
color1.position = 1;
CTGradientElement color2;
color2.red = 0.965;
color2.green = 0.737;
color2.blue = 0.086;
color2.alpha = 1.00;
color2.position = 0.5;
CTGradientElement color3;
color3.red = 0.965;
color3.green = 0.831;
color3.blue = 0.169;
color3.alpha = 1.00;
color3.position = 0.5;
CTGradientElement color4;
color4.red = 0.965;
color4.green = 0.831;
color4.blue = 0.169;
color4.alpha = 1.00;
color4.position = 0;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
+ (CTGradient *)progressTransparentGradient
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
color1.red = color1.green = color1.blue = 1.0;
color1.alpha = 0.65;
color1.position = 0;
CTGradientElement color2;
color2.red = color2.green = color2.blue = 1.0;
color2.alpha = 0.05;
color2.position = 0.5;
CTGradientElement color3;
color3.red = color3.green = color3.blue = 1.0;
color3.alpha = 0.4;
color3.position = 0.5;
CTGradientElement color4;
color4.red = color4.green = color4.blue = 1.0;
color4.alpha = 0.4;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
@end
@implementation CTGradient (MiddleColour)
+ (CTGradient *)gradientWithBeginningColor:(NSColor *)begin middleColor:(NSColor *)middle endingColor:(NSColor *)end
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
CTGradientElement color2;
CTGradientElement color3;
[[begin colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&color1.red
green:&color1.green
blue:&color1.blue
alpha:&color1.alpha];
[[middle colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&color2.red
green:&color2.green
blue:&color2.blue
alpha:&color2.alpha];
[[end colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&color3.red
green:&color3.green
blue:&color3.blue
alpha:&color3.alpha];
color1.position = 0;
color2.position = 0.5;
color3.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
return [newInstance autorelease];
}
+ (CTGradient *)gradientWithBeginningColor:(NSColor *)begin middleColor1:(NSColor *)middle1
middleColor2:(NSColor *)middle2 endingColor:(NSColor *)end
{
CTGradient *newInstance = [[[self class] alloc] init];
CTGradientElement color1;
CTGradientElement color2;
CTGradientElement color3;
CTGradientElement color4;
[[begin colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&color1.red
green:&color1.green
blue:&color1.blue
alpha:&color1.alpha];
[[middle1 colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&color2.red
green:&color2.green
blue:&color2.blue
alpha:&color2.alpha];
[[middle2 colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&color3.red
green:&color3.green
blue:&color3.blue
alpha:&color3.alpha];
[[end colorUsingColorSpaceName:NSCalibratedRGBColorSpace] getRed:&color4.red
green:&color4.green
blue:&color4.blue
alpha:&color4.alpha];
color1.position = 0;
color2.position = 0.5;
color3.position = 0.5;
color4.position = 1;
[newInstance addElement:&color1];
[newInstance addElement:&color2];
[newInstance addElement:&color3];
[newInstance addElement:&color4];
return [newInstance autorelease];
}
@end

241
macosx/Controller.h Normal file
View File

@ -0,0 +1,241 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2005-2007 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.
*****************************************************************************/
#ifndef CONTROLLER_H
#define CONTROLLER_H
#import <Cocoa/Cocoa.h>
#import <transmission.h>
#import "PrefsController.h"
#import "InfoWindowController.h"
#import "MessageWindowController.h"
#import "DragOverlayWindow.h"
#import "Badger.h"
#import "ImageBackgroundView.h"
#import "FilterBarView.h"
#import "IPCController.h"
#import <Growl/Growl.h>
@class TorrentTableView;
@interface Controller : NSObject <GrowlApplicationBridgeDelegate>
{
tr_handle_t * fLib;
NSMutableArray * fTorrents, * fDisplayedTorrents;
PrefsController * fPrefsController;
NSUserDefaults * fDefaults;
InfoWindowController * fInfoController;
MessageWindowController * fMessageController;
IPCController * fIPCController;
IBOutlet NSWindow * fWindow;
DragOverlayWindow * fOverlayWindow;
IBOutlet NSScrollView * fScrollView;
IBOutlet TorrentTableView * fTableView;
IBOutlet NSMenuItem * fOpenIgnoreDownloadFolder;
IBOutlet ImageBackgroundView * fBottomBar;
IBOutlet NSButton * fActionButton, * fSpeedLimitButton;
NSTimer * fSpeedLimitTimer;
IBOutlet ImageBackgroundView * fStatusBar;
IBOutlet NSTextField * fTotalDLField, * fTotalULField, * fTotalTorrentsField;
IBOutlet NSMenuItem * fNameSortItem, * fStateSortItem, * fProgressSortItem,
* fTrackerSortItem, * fDateSortItem, * fOrderSortItem,
* fNameSortActionItem, * fStateSortActionItem, * fProgressSortActionItem,
* fTrackerSortActionItem, * fDateSortActionItem, * fOrderSortActionItem;
IBOutlet FilterBarView * fFilterBar;
IBOutlet FilterBarButton * fNoFilterButton, * fDownloadFilterButton,
* fSeedFilterButton, * fPauseFilterButton;
IBOutlet NSSearchField * fSearchFilterField;
IBOutlet NSMenuItem * fNextFilterItem, * fPrevFilterItem;
IBOutlet NSMenuItem * fNextInfoTabItem, * fPrevInfoTabItem;
IBOutlet NSMenu * fUploadMenu, * fDownloadMenu;
IBOutlet NSMenuItem * fUploadLimitItem, * fUploadNoLimitItem,
* fDownloadLimitItem, * fDownloadNoLimitItem;
IBOutlet NSWindow * fURLSheetWindow;
IBOutlet NSTextField * fURLSheetTextField;
io_connect_t fRootPort;
NSTimer * fTimer;
IBOutlet SUUpdater * fUpdater;
BOOL fUpdateInProgress;
Badger * fBadger;
IBOutlet NSMenu * fDockMenu;
NSMutableArray * fAutoImportedNames;
NSTimer * fAutoImportTimer;
NSMutableDictionary * fPendingTorrentDownloads;
NSMutableArray * fTempTorrentFiles;
BOOL fRemoteQuit;
}
- (void) openFiles: (NSArray *) filenames;
- (void) openFiles: (NSArray *) filenames forcePath: (NSString *) path ignoreDownloadFolder: (BOOL) ignore
deleteTorrentFile: (torrentFileState) deleteTorrent;
- (void) openCreatedFile: (NSNotification *) notification;
- (void) openFilesWithDict: (NSDictionary *) dictionary;
- (void) openFilesAsk: (NSMutableArray *) files deleteTorrentFile: (torrentFileState) deleteTorrent;
- (void) openFilesAskWithDict: (NSDictionary *) dictionary;
- (void) openShowSheet: (id) sender;
- (void) duplicateOpenAlert: (NSString *) name;
- (void) openURL: (NSURL *) torrentURL;
- (void) openURLEndSheet: (id) sender;
- (void) openURLCancelEndSheet: (id) sender;
- (void) openURLShowSheet: (id) sender;
- (void) quitSheetDidEnd: (NSWindow *) sheet returnCode: (int) returnCode contextInfo: (void *) contextInfo;
- (void) createFile: (id) sender;
- (void) resumeSelectedTorrents: (id) sender;
- (void) resumeAllTorrents: (id) sender;
- (void) resumeTorrents: (NSArray *) torrents;
- (void) resumeSelectedTorrentsNoWait: (id) sender;
- (void) resumeWaitingTorrents: (id) sender;
- (void) resumeTorrentsNoWait: (NSArray *) torrents;
- (void) stopSelectedTorrents: (id) sender;
- (void) stopAllTorrents: (id) sender;
- (void) stopTorrents: (NSArray *) torrents;
- (void) removeTorrents: (NSArray *) torrents
deleteData: (BOOL) deleteData deleteTorrent: (BOOL) deleteData;
- (void) removeSheetDidEnd: (NSWindow *) sheet returnCode: (int) returnCode
contextInfo: (NSDictionary *) dict;
- (void) confirmRemoveTorrents: (NSArray *) torrents
deleteData: (BOOL) deleteData deleteTorrent: (BOOL) deleteTorrent;
- (void) removeNoDelete: (id) sender;
- (void) removeDeleteData: (id) sender;
- (void) removeDeleteTorrent: (id) sender;
- (void) removeDeleteDataAndTorrent: (id) sender;
- (void) moveDataFiles: (id) sender;
- (void) moveDataFileChoiceClosed: (NSOpenPanel *) panel returnCode: (int) code contextInfo: (NSArray *) torrents;
- (void) copyTorrentFiles: (id) sender;
- (void) copyTorrentFileForTorrents: (NSMutableArray *) torrents;
- (void) revealFile: (id) sender;
- (void) announceSelectedTorrents: (id) sender;
- (void) resetCacheForSelectedTorrents: (id) sender;
- (void) showPreferenceWindow: (id) sender;
- (void) showAboutWindow: (id) sender;
- (void) showInfo: (id) sender;
- (void) setInfoTab: (id) sender;
- (void) showMessageWindow: (id) sender;
- (void) updateControlTint: (NSNotification *) notification;
- (void) updateUI;
- (void) updateTorrentsInQueue;
- (int) numToStartFromQueue: (BOOL) downloadQueue;
- (void) torrentFinishedDownloading: (NSNotification *) notification;
- (void) torrentRestartedDownloading: (NSNotification *) notification;
- (void) updateTorrentHistory;
- (void) sortTorrents;
- (void) sortTorrentsIgnoreSelected;
- (void) setSort: (id) sender;
- (void) setSortReverse: (id) sender;
- (void) applyFilter: (id) sender;
- (void) setFilter: (id) sender;
- (void) setFilterSearchType: (id) sender;
- (void) switchFilter: (id) sender;
- (void) applySpeedLimit: (id) sender;
- (void) toggleSpeedLimit: (id) sender;
- (void) autoSpeedLimitChange: (NSNotification *) notification;
- (void) autoSpeedLimit;
- (void) setLimitGlobalEnabled: (id) sender;
- (void) setQuickLimitGlobal: (id) sender;
- (void) setQuickRatioGlobal: (id) sender;
- (void) torrentStoppedForRatio: (NSNotification *) notification;
- (void) changeAutoImport;
- (void) checkAutoImportDirectory;
- (void) beginCreateFile: (NSNotification *) notification;
- (void) sleepCallBack: (natural_t) messageType argument: (void *) messageArgument;
- (void) torrentTableViewSelectionDidChange: (NSNotification *) notification;
- (void) toggleSmallView: (id) sender;
- (void) toggleStatusBar: (id) sender;
- (void) showStatusBar: (BOOL) show animate: (BOOL) animate;
- (void) toggleFilterBar: (id) sender;
- (void) showFilterBar: (BOOL) show animate: (BOOL) animate;
- (void) toggleAdvancedBar: (id) sender;
- (void) doNothing: (id) sender; //needed for menu items that use bindings with no associated action
- (void) updateDockBadge: (NSNotification *) notification;
- (void) setWindowSizeToFit;
- (NSRect) sizedWindowFrame;
- (void) showMainWindow: (id) sender;
- (void) linkHomepage: (id) sender;
- (void) linkForums: (id) sender;
- (void) linkDonate: (id) sender;
- (void) prepareForUpdate: (NSNotification *) notification;
- (NSString *) applicationSupportFolder;
@end
#endif

3440
macosx/Controller.m Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,59 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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"
#import "makemeta.h"
@interface CreatorWindowController : NSWindowController
{
IBOutlet NSImageView * fIconView;
IBOutlet NSTextField * fNameField, * fStatusField, * fPiecesField, * fTrackerField, * fLocationField;
IBOutlet NSTextView * fCommentView;
IBOutlet NSButton * fPrivateCheck, * fOpenCheck;
IBOutlet NSView * fProgressView;
IBOutlet NSProgressIndicator * fProgressIndicator;
tr_metainfo_builder_t * fInfo;
NSString * fPath, * fLocation;
BOOL fOpenTorrent;
NSTimer * fTimer;
BOOL fStarted;
NSUserDefaults * fDefaults;
}
+ (void) createTorrentFile: (tr_handle_t *) handle;
+ (void) createTorrentFile: (tr_handle_t *) handle forFile: (NSString *) file;
- (id) initWithWindowNibName: (NSString *) name handle: (tr_handle_t *) handle path: (NSString *) path;
- (void) setLocation: (id) sender;
- (void) create: (id) sender;
- (void) cancelCreateWindow: (id) sender;
- (void) cancelCreateProgress: (id) sender;
@end

View File

@ -0,0 +1,378 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "CreatorWindowController.h"
#import "NSStringAdditions.h"
@interface CreatorWindowController (Private)
+ (NSString *) chooseFile;
- (void) locationSheetClosed: (NSSavePanel *) openPanel returnCode: (int) code contextInfo: (void *) info;
- (void) checkProgress;
- (void) failureSheetClosed: (NSAlert *) alert returnCode: (int) code contextInfo: (void *) info;
@end
@implementation CreatorWindowController
+ (void) createTorrentFile: (tr_handle_t *) handle
{
//get file/folder for torrent
NSString * path;
if (!(path = [CreatorWindowController chooseFile]))
return;
CreatorWindowController * creator = [[self alloc] initWithWindowNibName: @"Creator" handle: handle path: path];
[creator showWindow: nil];
}
+ (void) createTorrentFile: (tr_handle_t *) handle forFile: (NSString *) file
{
CreatorWindowController * creator = [[self alloc] initWithWindowNibName: @"Creator" handle: handle path: file];
[creator showWindow: nil];
}
- (id) initWithWindowNibName: (NSString *) name handle: (tr_handle_t *) handle path: (NSString *) path
{
if ((self = [super initWithWindowNibName: name]))
{
fStarted = NO;
fPath = [path retain];
fInfo = tr_metaInfoBuilderCreate(handle, [fPath UTF8String]);
if (fInfo->fileCount == 0)
{
NSAlert * alert = [[NSAlert alloc] init];
[alert addButtonWithTitle: NSLocalizedString(@"OK", "Create torrent -> no files -> button")];
[alert setMessageText: NSLocalizedString(@"This folder contains no files.",
"Create torrent -> no files -> title")];
[alert setInformativeText: NSLocalizedString(@"There must be at least one file in a folder to create a torrent file.",
"Create torrent -> no files -> warning")];
[alert setAlertStyle: NSWarningAlertStyle];
[alert runModal];
[alert release];
[self release];
return nil;
}
if (fInfo->totalSize == 0)
{
NSAlert * alert = [[NSAlert alloc] init];
[alert addButtonWithTitle: NSLocalizedString(@"OK", "Create torrent -> zero size -> button")];
[alert setMessageText: NSLocalizedString(@"The total file size is zero bytes.",
"Create torrent -> zero size -> title")];
[alert setInformativeText: NSLocalizedString(@"A torrent file cannot be created for files with no size.",
"Create torrent -> zero size -> warning")];
[alert setAlertStyle: NSWarningAlertStyle];
[alert runModal];
[alert release];
[self release];
return nil;
}
fDefaults = [NSUserDefaults standardUserDefaults];
}
return self;
}
- (void) awakeFromNib
{
NSString * name = [fPath lastPathComponent];
[[self window] setTitle: name];
[fNameField setStringValue: name];
[fNameField setToolTip: fPath];
BOOL multifile = !fInfo->isSingleFile;
NSImage * icon = [[NSWorkspace sharedWorkspace] iconForFileType: multifile
? NSFileTypeForHFSTypeCode('fldr') : [fPath pathExtension]];
[icon setSize: [fIconView frame].size];
[fIconView setImage: icon];
NSString * statusString = [NSString stringForFileSize: fInfo->totalSize];
if (multifile)
{
NSString * fileString;
int count = fInfo->fileCount;
if (count != 1)
fileString = [NSString stringWithFormat: NSLocalizedString(@"%d Files, ", "Create torrent -> info"), count];
else
fileString = NSLocalizedString(@"1 File, ", "Create torrent -> info");
statusString = [fileString stringByAppendingString: statusString];
}
[fStatusField setStringValue: statusString];
NSString * piecesCountString;
int piecesCount = fInfo->pieceCount;
if (piecesCount == 1)
piecesCountString = NSLocalizedString(@"1 piece", "Create torrent -> info");
else
piecesCountString = [NSString stringWithFormat: NSLocalizedString(@"%d pieces", "Create torrent -> info"),
piecesCount];
[fPiecesField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@, %@ each", "Create torrent -> info"),
piecesCountString, [NSString stringForFileSize: fInfo->pieceSize]]];
fLocation = [[[[fDefaults stringForKey: @"CreatorLocation"] stringByExpandingTildeInPath] stringByAppendingPathComponent:
[name stringByAppendingPathExtension: @"torrent"]] retain];
[fLocationField setStringValue: [fLocation stringByAbbreviatingWithTildeInPath]];
[fLocationField setToolTip: fLocation];
//set previously saved values
NSString * tracker;
if ((tracker = [fDefaults stringForKey: @"CreatorTracker"]))
[fTrackerField setStringValue: tracker];
if ([fDefaults objectForKey: @"CreatorPrivate"])
[fPrivateCheck setState: [fDefaults boolForKey: @"CreatorPrivate"] ? NSOnState : NSOffState];
if ([fDefaults objectForKey: @"CreatorOpen"])
[fOpenCheck setState: [fDefaults boolForKey: @"CreatorOpen"] ? NSOnState : NSOffState];
}
- (void) dealloc
{
[fPath release];
[fLocation release];
if (fInfo)
tr_metaInfoBuilderFree(fInfo);
if (fTimer)
[fTimer invalidate];
[super dealloc];
}
- (void) setLocation: (id) sender
{
NSSavePanel * panel = [NSSavePanel savePanel];
[panel setPrompt: @"Select"];
[panel setRequiredFileType: @"torrent"];
[panel setCanSelectHiddenExtension: YES];
[panel beginSheetForDirectory: nil file: [fLocation lastPathComponent] modalForWindow: [self window] modalDelegate: self
didEndSelector: @selector(locationSheetClosed:returnCode:contextInfo:) contextInfo: nil];
}
- (void) create: (id) sender
{
//parse tracker string
NSString * trackerString = [fTrackerField stringValue];
if ([trackerString rangeOfString: @"://"].location != NSNotFound)
{
if (![trackerString hasPrefix: @"http://"])
{
NSAlert * alert = [[[NSAlert alloc] init] autorelease];
[alert addButtonWithTitle: NSLocalizedString(@"OK", "Create torrent -> http warning -> button")];
[alert setMessageText: NSLocalizedString(@"The tracker address must begin with \"http://\".",
"Create torrent -> http warning -> title")];
[alert setInformativeText: NSLocalizedString(@"Change the tracker address to create the torrent.",
"Create torrent -> http warning -> warning")];
[alert setAlertStyle: NSWarningAlertStyle];
[alert beginSheetModalForWindow: [self window] modalDelegate: self didEndSelector: nil contextInfo: nil];
return;
}
}
else
trackerString = [@"http://" stringByAppendingString: trackerString];
//don't allow blank addresses
if ([trackerString length] <= 7)
{
NSAlert * alert = [[[NSAlert alloc] init] autorelease];
[alert addButtonWithTitle: NSLocalizedString(@"OK", "Create torrent -> no url warning -> button")];
[alert setMessageText: NSLocalizedString(@"The tracker address cannot be blank.",
"Create torrent -> no url warning -> title")];
[alert setInformativeText: NSLocalizedString(@"Change the tracker address to create the torrent.",
"Create torrent -> no url warning -> warning")];
[alert setAlertStyle: NSWarningAlertStyle];
[alert beginSheetModalForWindow: [self window] modalDelegate: self didEndSelector: nil contextInfo: nil];
return;
}
//check if a file with the same name and location already exists
if ([[NSFileManager defaultManager] fileExistsAtPath: fLocation])
{
NSArray * pathComponents = [fLocation pathComponents];
int count = [pathComponents count];
NSAlert * alert = [[[NSAlert alloc] init] autorelease];
[alert addButtonWithTitle: NSLocalizedString(@"OK", "Create torrent -> file already exists warning -> button")];
[alert setMessageText: NSLocalizedString(@"A torrent file with this name and directory cannot be created.",
"Create torrent -> file already exists warning -> title")];
[alert setInformativeText: [NSString stringWithFormat:
NSLocalizedString(@"A file with the name \"%@\" already exists in the directory \"%@\". "
"Choose a new name or directory to create the torrent.",
"Create torrent -> file already exists warning -> warning"),
[pathComponents objectAtIndex: count-1], [pathComponents objectAtIndex: count-2]]];
[alert setAlertStyle: NSWarningAlertStyle];
[alert beginSheetModalForWindow: [self window] modalDelegate: self didEndSelector: nil contextInfo: nil];
return;
}
fOpenTorrent = [fOpenCheck state] == NSOnState;
//store values
[fDefaults setObject: trackerString forKey: @"CreatorTracker"];
[fDefaults setBool: [fPrivateCheck state] == NSOnState forKey: @"CreatorPrivate"];
[fDefaults setBool: fOpenTorrent forKey: @"CreatorOpen"];
[fDefaults setObject: [fLocation stringByDeletingLastPathComponent] forKey: @"CreatorLocation"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"BeginCreateTorrentFile" object: fLocation userInfo: nil];
tr_makeMetaInfo(fInfo, [fLocation UTF8String], [trackerString UTF8String], [[fCommentView string] UTF8String],
[fPrivateCheck state] == NSOnState);
fTimer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(checkProgress)
userInfo: nil repeats: YES];
}
- (void) cancelCreateWindow: (id) sender
{
[[self window] close];
}
- (void) windowWillClose: (NSNotification *) notification
{
[self release];
}
- (void) cancelCreateProgress: (id) sender
{
fInfo->abortFlag = 1;
[fTimer fire];
}
@end
@implementation CreatorWindowController (Private)
+ (NSString *) chooseFile
{
NSOpenPanel * panel = [NSOpenPanel openPanel];
[panel setTitle: NSLocalizedString(@"Create Torrent File", "Create torrent -> select file")];
[panel setPrompt: NSLocalizedString(@"Select", "Create torrent -> select file")];
[panel setAllowsMultipleSelection: NO];
[panel setCanChooseFiles: YES];
[panel setCanChooseDirectories: YES];
[panel setCanCreateDirectories: NO];
[panel setMessage: NSLocalizedString(@"Select a file or folder for the torrent file.", "Create torrent -> select file")];
BOOL success = [panel runModal] == NSOKButton;
return success ? [[panel filenames] objectAtIndex: 0] : nil;
}
- (void) locationSheetClosed: (NSSavePanel *) panel returnCode: (int) code contextInfo: (void *) info
{
if (code == NSOKButton)
{
[fLocation release];
fLocation = [[panel filename] retain];
[fLocationField setStringValue: [fLocation stringByAbbreviatingWithTildeInPath]];
[fLocationField setToolTip: fLocation];
}
}
- (void) checkProgress
{
if (fInfo->isDone)
{
[fTimer invalidate];
fTimer = nil;
if (fInfo->failed)
{
if (!fInfo->abortFlag)
{
NSAlert * alert = [[[NSAlert alloc] init] autorelease];
[alert addButtonWithTitle: NSLocalizedString(@"OK", "Create torrent -> failed -> button")];
[alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"Creation of \"%@\" failed.",
"Create torrent -> failed -> title"), [fLocation lastPathComponent]]];
[alert setInformativeText: NSLocalizedString(@"There was an error parsing the data file. "
"The torrent file was not created.", "Create torrent -> failed -> warning")];
[alert setAlertStyle: NSWarningAlertStyle];
[alert beginSheetModalForWindow: [self window] modalDelegate: self
didEndSelector: @selector(failureSheetClosed:returnCode:contextInfo:) contextInfo: nil];
return;
}
}
else
{
if (fOpenTorrent)
{
NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys: fLocation, @"File",
[fPath stringByDeletingLastPathComponent], @"Path", nil];
[[NSNotificationCenter defaultCenter] postNotificationName: @"OpenCreatedTorrentFile" object: self userInfo: dict];
}
}
[[self window] close];
}
else
{
[fProgressIndicator setDoubleValue: (double)fInfo->pieceIndex / fInfo->pieceCount];
if (!fStarted)
{
NSWindow * window = [self window];
NSRect windowRect = [window frame];
float difference = [fProgressView frame].size.height - [[window contentView] frame].size.height;
windowRect.origin.y -= difference;
windowRect.size.height += difference;
//don't allow vertical resizing
float height = windowRect.size.height;
[window setMinSize: NSMakeSize([window minSize].width, height)];
[window setMaxSize: NSMakeSize([window maxSize].width, height)];
[window setContentView: fProgressView];
[window setFrame: windowRect display: YES animate: YES];
[fProgressView setHidden: NO];
fStarted = YES;
}
}
}
- (void) failureSheetClosed: (NSAlert *) alert returnCode: (int) code contextInfo: (void *) info
{
[[alert window] orderOut: nil];
[[self window] close];
}
@end

144
macosx/Credits.rtf Normal file
View File

@ -0,0 +1,144 @@
{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf440
{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;}
{\colortbl;\red255\green255\blue255;\red127\green127\blue127;}
\vieww9000\viewh8400\viewkind0
\pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40\qc
\f0\b\fs28 \cf0 The Transmission Project
\fs24 \
\pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40\qc
\f1\b0 \cf0 http://transmission.m0k.org/
\f0\b \
\pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40\ql\qnatural
\cf0 \
Lead Developers
\f1\b0 <transmission-dev@m0k.org>\
Eric Petit <titer@m0k.org>
\fs20 \cf2 (Creator)\
\fs24 \cf0 Josh Elsasser <josh@elsasser.org>
\fs20 \cf2 (Back-end, GTK+ interface, Daemon interface)
\fs24 \cf0 \
Mitchell Livingston <livings124@gmail.com>
\fs20 \cf2 (Mac OS X interface, Back-end)
\fs24 \cf0 \
Charles Kerr <charles@rebelbase.com>
\fs20 \cf2 (Back-end, GTK+ interface)
\fs24 \cf0 \
Bryan Varner <bryan@varnernet.com>
\fs20 \cf2 (BeOS interface)
\fs24 \cf0 \
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 \
\pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40\ql\qnatural
\f0\b \cf0 Project Contributors
\f1\b0 \
Nick Pucius
\fs20 \cf2 (Mac OS X Help documentation)\
\fs24 \cf0 Hugo van Heuven, madebysofa
\fs20 \cf2 (Icon design, Mac toolbar icons)
\fs24 \cf0 \
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 \
\pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40\ql\qnatural
\f0\b \cf0 Translators
\f1\b0 \cf2 \
\cf0 Mac OS X, current release:\
Jorge Carrasco Perez \cf2
\fs20 (Spanish)\
\fs24 \cf0 Etienne Samson
\fs20 \cf2 (French)\
\fs24 \cf0 Marco Cavazzuti
\fs20 \cf2 (Italian)
\fs24 \cf0 \
Thermaikos
\fs20 \cf2 (Greek)\
\fs24 \cf0 Jaewoo Chung
\fs20 \cf2 (Korean)\
\fs24 \cf0 Anton Sotkov
\fs20 \cf2 (Russian)\
\fs24 \cf0 Alexander Bykov
\fs20 \cf2 (Russian)
\fs24 \cf0 \
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 \
\pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40\qc
\f0\b\fs28 \cf0 Special Thanks\
\pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40\ql\qnatural
\fs24 \cf0 \
Image Contributors\
\f1\b0 FOOOD
\f0\b \
\f1\b0 Martin Stadtmueller
\fs20 \cf2 (Icon tweaking)
\f0\b\fs24 \cf0 \
\f1\b0 Mike Matas <http://www.mikematas.com/>
\fs20 \cf2 (Previous toolbar icons)
\fs24 \cf0 \
Jonas Rask
\fs20 \cf2 (Globe icon)
\fs24 \cf0 \
George Tsotsos\
Rashid Eissing
\fs20 \cf2 (Transfers preferences icon)
\fs24 \cf0 \
\
\f0\b Other Contributors
\f1\b0 \
Omar and Adrien
\fs20 \cf2 (Beta testing)
\fs24 \cf0 \
BitTorrent Protocol Specification <http://wiki.theory.org/BitTorrentSpecification>\
vi@nwr.jp
\fs20 \cf2 (Free SHA1 implementation)\
\fs24 \cf0 Ahmad M. Afuni
\fs20 \cf2 (NetBSD patch)\
\fs24 \cf0 Jeremy Messenger
\fs20 \cf2 (FreeBSD patch)
\fs24 \cf0 \
John Blitch
\fs20 \cf2 (Mac OS X patch)\
\fs24 \cf0 Michael Demars <keul@m0k.org>
\fs20 \cf2 (Mac OS X patches)\
\fs24 \cf0 Fredrik Mod\'8een
\fs20 \cf2 (BeOS patches)
\fs24 \cf0 \
Deanna Phillips
\fs20 \cf2 (transmissioncli manpage)
\fs24 \cf0 \
Nicholas Shanks
\fs20 \cf2 (Mac OS X patches)\
\fs24 \cf0 TooMuchTime
\fs20 \cf2 (Technical Advice)
\fs24 \cf0 \
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural
\cf0 \
\pard\tx440\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li100\slleading40\sb40\ql\qnatural
\f0\b \cf0 Third-Party Resources\
\f1\b0 Thanks to:\
Niels Provos for libevent. <http://monkey.org/~provos/libevent/>\
The Growl Development Team for use of Growl. <http://growl.info/>\
Andy Matuschak for use of Sparkle. <http://sparkle.andymatuschak.org/>\
M. Uli Kusterer for use of UKKQueue.}

128
macosx/Defaults.plist Normal file
View File

@ -0,0 +1,128 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AutoImport</key>
<false/>
<key>AutoSize</key>
<false/>
<key>AutoStartDownload</key>
<true/>
<key>BadgeDownloadRate</key>
<true/>
<key>BadgeUploadRate</key>
<true/>
<key>BindPort</key>
<integer>9090</integer>
<key>CheckDownload</key>
<false/>
<key>CheckForUpdates</key>
<true/>
<key>CheckQuit</key>
<true/>
<key>CheckQuitDownloading</key>
<false/>
<key>CheckRemove</key>
<true/>
<key>CheckRemoveDownloading</key>
<false/>
<key>CheckStalled</key>
<false/>
<key>CheckUpload</key>
<true/>
<key>CreatorLocation</key>
<string>~/Desktop</string>
<key>DeleteOriginalTorrent</key>
<false/>
<key>DownloadChoice</key>
<string>Constant</string>
<key>DownloadFolder</key>
<string>~/Desktop</string>
<key>DownloadLimit</key>
<integer>100</integer>
<key>DownloadSound</key>
<string>Glass</string>
<key>EncryptionRequire</key>
<false/>
<key>Filter</key>
<string>None</string>
<key>FilterBar</key>
<false/>
<key>FilterSearchType</key>
<string>Name</string>
<key>IncompleteDownloadFolder</key>
<string>~/Desktop</string>
<key>InfoVisible</key>
<false/>
<key>InspectorSelected</key>
<string>Info</string>
<key>MessageLevel</key>
<integer>1</integer>
<key>MoveChoice</key>
<string>Constant</string>
<key>MoveFolder</key>
<string>~/Desktop</string>
<key>NatTraversal</key>
<true/>
<key>PiecesViewShowAvailability</key>
<false/>
<key>PlayDownloadSound</key>
<true/>
<key>PlaySeedingSound</key>
<false/>
<key>Queue</key>
<false/>
<key>QueueDownloadNumber</key>
<integer>3</integer>
<key>QueueSeed</key>
<false/>
<key>QueueSeedNumber</key>
<integer>3</integer>
<key>RatioCheck</key>
<false/>
<key>RatioLimit</key>
<integer>2</integer>
<key>SeedingSound</key>
<string>Submarine</string>
<key>ShowInspector</key>
<false/>
<key>SleepPrevent</key>
<true/>
<key>SmallStatusRegular</key>
<true/>
<key>SmallView</key>
<false/>
<key>Sort</key>
<string>Order</string>
<key>SortReverse</key>
<false/>
<key>SpeedLimit</key>
<false/>
<key>SpeedLimitAuto</key>
<false/>
<key>SpeedLimitAutoOffDate</key>
<date>2000-01-01T13:00:00Z</date>
<key>SpeedLimitAutoOnDate</key>
<date>2000-01-01T03:00:00Z</date>
<key>SpeedLimitDownloadLimit</key>
<integer>10</integer>
<key>SpeedLimitUploadLimit</key>
<integer>10</integer>
<key>StalledMinutes</key>
<integer>30</integer>
<key>StatusBar</key>
<true/>
<key>UploadLimit</key>
<integer>20</integer>
<key>UseAdvancedBar</key>
<false/>
<key>UseIncompleteDownloadFolder</key>
<false/>
<key>WarningDebug</key>
<true/>
<key>WarningDuplicate</key>
<true/>
<key>WarningRemainingSpace</key>
<true/>
</dict>
</plist>

36
macosx/DragOverlayView.h Normal file
View File

@ -0,0 +1,36 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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>
@interface DragOverlayView : NSView
{
NSImage * fBadge, * fBackBadge, * fAppIcon;
NSDictionary * fMainLineAttributes, * fSubLineAttributes;
}
- (void) setOverlay: (NSImage *) icon mainLine: (NSString *) mainLine subLine: (NSString *) subLine;
@end

151
macosx/DragOverlayView.m Normal file
View File

@ -0,0 +1,151 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "DragOverlayView.h"
#import "NSBezierPathAdditions.h"
@implementation DragOverlayView
- (id) initWithFrame: (NSRect) frame
{
if ((self = [super initWithFrame: frame]))
{
//create badge
NSRect badgeRect = NSMakeRect(0, 0, 325.0, 84.0);
NSBezierPath * bp = [NSBezierPath bezierPathWithRoundedRect: badgeRect radius: 15.0];
fBackBadge = [[NSImage alloc] initWithSize: badgeRect.size];
[fBackBadge lockFocus];
[[NSColor colorWithCalibratedWhite: 0.0 alpha: 0.75] set];
[bp fill];
[fBackBadge unlockFocus];
//create attributes
NSShadow * stringShadow = [[NSShadow alloc] init];
[stringShadow setShadowOffset: NSMakeSize(2.0, -2.0)];
[stringShadow setShadowBlurRadius: 4.0];
NSFont * bigFont = [[NSFontManager sharedFontManager] convertFont:
[NSFont fontWithName: @"Lucida Grande" size: 18.0] toHaveTrait: NSBoldFontMask],
* smallFont = [NSFont fontWithName: @"Lucida Grande" size: 14.0];
NSMutableParagraphStyle * paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[paragraphStyle setLineBreakMode: NSLineBreakByTruncatingTail];
fMainLineAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSColor whiteColor], NSForegroundColorAttributeName,
bigFont, NSFontAttributeName, stringShadow, NSShadowAttributeName,
paragraphStyle, NSParagraphStyleAttributeName, nil];
fSubLineAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSColor whiteColor], NSForegroundColorAttributeName,
smallFont, NSFontAttributeName, stringShadow, NSShadowAttributeName,
paragraphStyle, NSParagraphStyleAttributeName, nil];
[stringShadow release];
}
return self;
}
- (void) dealloc
{
[fBackBadge release];
[fBadge release];
[fAppIcon release];
[fMainLineAttributes release];
[fSubLineAttributes release];
[super dealloc];
}
- (void) setOverlay: (NSImage *) icon mainLine: (NSString *) mainLine subLine: (NSString *) subLine
{
if (fBadge)
[fBadge release];
fBadge = [fBackBadge copy];
NSSize badgeSize = [fBadge size];
//get icon
NSSize iconSize = NSMakeSize(64.0, 64.0);
if (!icon)
{
if (!fAppIcon)
{
fAppIcon = [[NSImage imageNamed: @"TransmissionDocument.icns"] copy];
[fAppIcon setScalesWhenResized: YES];
[fAppIcon setSize: iconSize];
}
icon = [fAppIcon retain];
}
else
{
icon = [icon copy];
[icon setScalesWhenResized: YES];
[icon setSize: iconSize];
}
float padding = 10.0;
[fBadge lockFocus];
//place icon
[icon compositeToPoint: NSMakePoint(padding, (badgeSize.height - iconSize.height) * 0.5)
operation: NSCompositeSourceOver];
[icon release];
//place main text
NSSize mainLineSize = [mainLine sizeWithAttributes: fMainLineAttributes];
NSSize subLineSize = [subLine sizeWithAttributes: fSubLineAttributes];
NSRect lineRect = NSMakeRect(padding + iconSize.width + 5.0,
(badgeSize.height + (subLineSize.height + 2.0 - mainLineSize.height)) * 0.5,
badgeSize.width - (padding + iconSize.width + 2.0) - padding, mainLineSize.height);
[mainLine drawInRect: lineRect withAttributes: fMainLineAttributes];
//place sub text
lineRect.origin.y -= subLineSize.height + 2.0;
lineRect.size.height = subLineSize.height;
[subLine drawInRect: lineRect withAttributes: fSubLineAttributes];
[fBadge unlockFocus];
[self setNeedsDisplay: YES];
}
-(void) drawRect: (NSRect) rect
{
if (fBadge)
{
NSRect frame = [self frame];
NSSize imageSize = [fBadge size];
[fBadge compositeToPoint: NSMakePoint((frame.size.width - imageSize.width) * 0.5,
(frame.size.height - imageSize.height) * 0.5) operation: NSCompositeSourceOver];
}
}
@end

View File

@ -0,0 +1,44 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 DragOverlayWindow : NSWindow
{
tr_handle_t * fLib;
NSViewAnimation * fFadeInAnimation, * fFadeOutAnimation;
}
- (id) initWithLib: (tr_handle_t *) lib forWindow: (NSWindow *) window;
- (void) setTorrents: (NSArray *) files;
- (void) setFile: (NSString *) file;
- (void) setURL: (NSString *) url;
- (void) fadeIn;
- (void) fadeOut;
@end

170
macosx/DragOverlayWindow.m Normal file
View File

@ -0,0 +1,170 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "DragOverlayWindow.h"
#import "DragOverlayView.h"
#import "NSStringAdditions.h"
@implementation DragOverlayWindow
- (id) initWithLib: (tr_handle_t *) lib forWindow: (NSWindow *) window
{
if (self = ([super initWithContentRect: NSMakeRect(0, 0, 1.0, 1.0) styleMask: NSBorderlessWindowMask
backing: NSBackingStoreBuffered defer: NO]))
{
fLib = lib;
[self setBackgroundColor: [NSColor colorWithCalibratedWhite: 0.0 alpha: 0.5]];
[self setAlphaValue: 0.0];
[self setOpaque: NO];
[self setHasShadow: NO];
DragOverlayView * view = [[DragOverlayView alloc] initWithFrame: [self frame]];
[self setContentView: view];
[view release];
[self setReleasedWhenClosed: NO];
[self setIgnoresMouseEvents: YES];
fFadeInAnimation = [[NSViewAnimation alloc] initWithViewAnimations: [NSArray arrayWithObject:
[NSDictionary dictionaryWithObjectsAndKeys: self, NSViewAnimationTargetKey,
NSViewAnimationFadeInEffect, NSViewAnimationEffectKey, nil]]];
[fFadeInAnimation setDuration: 0.15];
fFadeOutAnimation = [[NSViewAnimation alloc] initWithViewAnimations: [NSArray arrayWithObject:
[NSDictionary dictionaryWithObjectsAndKeys: self, NSViewAnimationTargetKey,
NSViewAnimationFadeOutEffect, NSViewAnimationEffectKey, nil]]];
[fFadeOutAnimation setDuration: 0.5];
[fFadeOutAnimation setAnimationBlockingMode: NSAnimationNonblockingThreaded];
[window addChildWindow: self ordered: NSWindowAbove];
}
return self;
}
- (void) dealloc
{
[fFadeInAnimation release];
[fFadeOutAnimation release];
[super dealloc];
}
- (void) setTorrents: (NSArray *) files
{
uint64_t size = 0;
int count = 0;
NSString * name;
BOOL folder;
int fileCount = 0;
NSString * file;
NSEnumerator * enumerator = [files objectEnumerator];
tr_info_t info;
while ((file = [enumerator nextObject]))
{
if (tr_torrentParse(fLib, [file UTF8String], NULL, &info) == TR_OK)
{
count++;
size += info.totalSize;
fileCount += info.fileCount;
//only useful when one torrent
if (count == 1)
{
name = [NSString stringWithUTF8String: info.name];
folder = info.multifile;
}
}
tr_metainfoFree(&info);
}
if (count <= 0)
return;
//set strings and icon
NSImage * icon = nil;
NSString * secondString = [NSString stringForFileSize: size];
if (count > 1 || folder)
{
NSString * fileString;
if (fileCount == 1)
fileString = NSLocalizedString(@"1 File, ", "Drag overlay -> torrents");
else
fileString= [NSString stringWithFormat: NSLocalizedString(@"%d Files, ", "Drag overlay -> torrents"), fileCount];
secondString = [fileString stringByAppendingString: secondString];
}
if (count == 1)
icon = [[NSWorkspace sharedWorkspace] iconForFileType: folder ? NSFileTypeForHFSTypeCode('fldr') : [name pathExtension]];
else
{
name = [NSString stringWithFormat: NSLocalizedString(@"%d Torrent Files", "Drag overlay -> torrents"), count];
secondString = [secondString stringByAppendingString: @" Total"];
}
[[self contentView] setOverlay: icon mainLine: name subLine: secondString];
[self fadeIn];
}
- (void) setFile: (NSString *) file
{
[[self contentView] setOverlay: [NSImage imageNamed: @"CreateLarge.png"]
mainLine: NSLocalizedString(@"Create a Torrent File", "Drag overlay -> file") subLine: file];
[self fadeIn];
}
- (void) setURL: (NSString *) url
{
[[self contentView] setOverlay: [NSImage imageNamed: @"Globe.png"]
mainLine: NSLocalizedString(@"Web Address", "Drag overlay -> url") subLine: url];
[self fadeIn];
}
- (void) fadeIn
{
//stop other animation and set to same progress
if ([fFadeOutAnimation isAnimating])
{
[fFadeOutAnimation stopAnimation];
[fFadeInAnimation setCurrentProgress: 1.0 - [fFadeOutAnimation currentProgress]];
}
[self setFrame: [[self parentWindow] frame] display: YES];
[fFadeInAnimation startAnimation];
}
- (void) fadeOut
{
//stop other animation and set to same progress
if ([fFadeInAnimation isAnimating])
{
[fFadeInAnimation stopAnimation];
[fFadeOutAnimation setCurrentProgress: 1.0 - [fFadeInAnimation currentProgress]];
}
[fFadeOutAnimation startAnimation];
}
@end

View File

@ -0,0 +1,19 @@
{
IBClasses = (
{
ACTIONS = {hideLicense = id; showLicense = id; };
CLASS = AboutWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fCopyrightField = NSTextField;
fLicenseSheet = NSPanel;
fLicenseView = NSTextView;
fTextView = NSTextView;
fVersionField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
);
IBVersion = 1;
}

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>17 91 356 240 0 0 1152 842 </string>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBOpenObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBSystem Version</key>
<string>8R218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,30 @@
{
IBClasses = (
{
ACTIONS = {
cancelCreateProgress = id;
cancelCreateWindow = id;
create = id;
setLocation = id;
};
CLASS = CreatorWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fCommentView = NSTextView;
fIconView = NSImageView;
fLocationField = NSTextField;
fNameField = NSTextField;
fOpenCheck = NSButton;
fPiecesField = NSTextField;
fPrivateCheck = NSButton;
fProgressIndicator = NSProgressIndicator;
fProgressView = NSView;
fStatusField = NSTextField;
fTrackerField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
);
IBVersion = 1;
}

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>52 61 356 240 0 0 1152 842 </string>
<key>IBEditorPositions</key>
<dict>
<key>56</key>
<string>392 515 368 126 0 0 1152 842 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBOpenObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBSystem Version</key>
<string>8R218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,4 @@
/* Localized versions of Info.plist keys */
CFBundleName = "Transmission";
NSHumanReadableCopyright = "Copyright 2005-2007 The Transmission Project";

View File

@ -0,0 +1,87 @@
{
IBClasses = (
{CLASS = FileOutlineView; LANGUAGE = ObjC; SUPERCLASS = NSOutlineView; },
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {
revealDataFile = id;
revealFile = id;
revealTorrentFile = id;
setCheck = id;
setOnlySelectedCheck = id;
setPex = id;
setPiecesView = id;
setPriority = id;
setRatioLimit = id;
setRatioSetting = id;
setSpeedLimit = id;
setSpeedMode = id;
};
CLASS = InfoWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fCommentView = NSTextView;
fCompletedFromTrackerField = NSTextField;
fConnectedPeersField = NSTextField;
fCreatorField = NSTextField;
fDataLocationField = NSTextField;
fDateActivityField = NSTextField;
fDateAddedField = NSTextField;
fDateCompletedField = NSTextField;
fDateCreatedField = NSTextField;
fDownloadLimitField = NSTextField;
fDownloadLimitLabel = NSTextField;
fDownloadLimitPopUp = NSPopUpButton;
fDownloadedTotalField = NSTextField;
fDownloadedValidField = NSTextField;
fDownloadingFromField = NSTextField;
fErrorMessageView = NSTextView;
fFileCheckItem = NSMenuItem;
fFileOutline = FileOutlineView;
fFilePriorityHigh = NSMenuItem;
fFilePriorityLow = NSMenuItem;
fFilePriorityNormal = NSMenuItem;
fFileTableStatusField = NSTextField;
fFileUncheckItem = NSMenuItem;
fHashField = NSTextField;
fImageView = NSImageView;
fLeechersField = NSTextField;
fNameField = NSTextField;
fPeerTable = NSTableView;
fPexCheck = NSButton;
fPiecesControl = NSSegmentedControl;
fPiecesField = NSTextField;
fPiecesView = PiecesView;
fProgressField = NSTextField;
fRatioField = NSTextField;
fRatioLimitField = NSTextField;
fRatioPopUp = NSPopUpButton;
fRevealDataButton = NSButton;
fRevealTorrentButton = NSButton;
fSecureField = NSTextField;
fSeedersField = NSTextField;
fSizeField = NSTextField;
fStateField = NSTextField;
fSwarmSpeedField = NSTextField;
fTabView = NSTabView;
fTorrentLocationField = NSTextField;
fTrackerField = NSTextField;
fUploadLimitField = NSTextField;
fUploadLimitLabel = NSTextField;
fUploadLimitPopUp = NSPopUpButton;
fUploadedTotalField = NSTextField;
fUploadingToField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = NSLevelIndicatorCell; LANGUAGE = ObjC; SUPERCLASS = NSActionCell; },
{CLASS = NSSegmentedControl; LANGUAGE = ObjC; SUPERCLASS = NSControl; },
{
CLASS = PeerProgressIndicatorCell;
LANGUAGE = ObjC;
SUPERCLASS = NSLevelIndicatorCell;
},
{CLASS = PiecesView; LANGUAGE = ObjC; SUPERCLASS = NSImageView; }
);
IBVersion = 1;
}

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>58 88 356 240 0 0 1680 1028 </string>
<key>IBEditorPositions</key>
<dict>
<key>549</key>
<string>565 283 174 149 0 0 1152 842 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBLockedObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBLockedTabItems</key>
<array>
<integer>332</integer>
</array>
<key>IBOpenObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBSystem Version</key>
<string>8R4031</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,619 @@
/* Torrent -> progress string */
" - %@ remaining" = " - %@ remaining";
/* Torrent -> progress string */
" - remaining time unknown" = " - remaining time unknown";
/* File size (beware of leading space) */
" GB" = " GB";
/* File size (beware of leading space) */
" KB" = " KB";
/* File size (beware of leading space) */
" MB" = " MB";
/* Removal confirm panel -> message part 2 */
" Once removed, continuing the transfers will require the torrent files. Do you really want to remove them?" = " Once removed, continuing the transfers will require the torrent files. Do you really want to remove them?";
/* Inspector -> Activity tab -> progress */
"%.2f%% (%.2f%% selected)" = "%1$.2f%% (%2$.2f%% selected)";
/* Inspector -> Files tab -> file status string */
"%.2f%% of %@" = "%1$.2f%% of %2$@";
/* Torrent -> progress string */
"%@ of %@ (%.2f%%)" = "%1$@ of %2$@ (%3$.2f%%)";
/* Torrent -> progress string */
"%@ of %@ (%.2f%%), uploaded %@ (Ratio: %@)" = "%1$@ of %2$@ (%3$.2f%%), uploaded %4$@ (Ratio: %5$@)";
/* Inspector -> above tabs -> total size (several torrents selected) */
"%@ Total" = "%@ Total";
/* Create torrent -> info */
"%@, %@ each" = "%1$@, %2$@ each";
/* Torrent -> progress string */
"%@, uploaded %@ (Ratio: %@)" = "%1$@, uploaded %2$@ (Ratio: %3$@)";
/* Inspector -> Peers tab -> peers */
"%d cache" = "%d cache";
/* Inspector -> Peers tab -> peers */
"%d Connected" = "%d Connected";
/* Torrent -> remaining time */
"%d days %d hr" = "%1$d days %2$d hr";
/* Dock item - Downloading */
"%d Downloading" = "%d Downloading";
/* Inspector -> Files tab -> bottom text (number of files) */
"%d files total" = "%d files total";
/* Drag overlay -> torrents
Create torrent -> info */
"%d Files, " = "%d Files, ";
/* Torrent -> remaining time */
"%d hr %d min" = "%1$d hr %2$d min";
/* Inspector -> Peers tab -> peers */
"%d incoming" = "%d incoming";
/* Torrent -> remaining time */
"%d min %d sec" = "%1$d min %2$d sec";
/* Inspector -> Peers tab -> peers */
"%d PEX" = "%d PEX";
/* Create torrent -> info */
"%d pieces" = "%d pieces";
/* Torrent -> remaining time */
"%d sec" = "%d sec";
/* Dock item - Seeding */
"%d Seeding" = "%d Seeding";
/* Drag overlay -> torrents */
"%d Torrent Files" = "%d Torrent Files";
/* Inspector -> above tabs -> selected torrents */
"%d Torrents Selected" = "%d Torrents Selected";
/* Inspector -> Peers tab -> peers */
"%d tracker" = "%d tracker";
/* Filter Bar Button -> tool tip
Status bar transfer count */
"%d Transfers" = "%d Transfers";
/* File size */
"%lld bytes" = "%lld bytes";
/* Torrent -> error string unreadable */
"(unreadable error)" = "(unreadable error)";
/* Torrent -> remaining time */
"1 day %d hr" = "1 day %d hr";
/* Inspector -> Files tab -> bottom text (number of files) */
"1 file total" = "1 file total";
/* Drag overlay -> torrents
Create torrent -> info */
"1 File, " = "1 File, ";
/* Create torrent -> info */
"1 piece" = "1 piece";
/* Filter Bar Button -> tool tip
Status bar transfer count */
"1 Transfer" = "1 Transfer";
/* Move folder cannot be found alert -> message */
"\"%@\" cannot be found. The file will remain in its current location." = "\"%@\" cannot be found. The file will remain in its current location.";
/* Folder cannot be found alert -> message */
"\"%@\" cannot be found. The transfer will be paused." = "\"%@\" cannot be found. The transfer will be paused.";
/* Create torrent -> file already exists warning -> warning */
"A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent." = "A file with the name \"%1$@\" already exists in the directory \"%2$@\". Choose a new name or directory to create the torrent.";
/* Move inside itself alert -> title */
"A folder cannot be moved to inside itself." = "A folder cannot be moved to inside itself.";
/* Create torrent -> zero size -> warning */
"A torrent file cannot be created for files with no size." = "A torrent file cannot be created for files with no size.";
/* Create torrent -> file already exists warning -> title */
"A torrent file with this name and directory cannot be created." = "A torrent file with this name and directory cannot be created.";
/* Open duplicate alert -> title */
"A transfer of \"%@\" is already running." = "A transfer of \"%@\" is already running.";
/* Torrent file disk space alert -> button */
"Always Download" = "Always Download";
/* Transfer speed (Bytes per second) */
"B/s" = "B/s";
/* Preferences -> Bandwidth toolbar item title */
"Bandwidth" = "Bandwidth";
/* Growl notification description */
"Bandwidth settings changed" = "Bandwidth settings changed";
/* Removal confirm panel -> button
Confirm Quit panel -> button */
"Cancel" = "Cancel";
/* Create torrent -> no url warning -> warning
Create torrent -> http warning -> warning */
"Change the tracker address to create the torrent." = "Change the tracker address to create the torrent.";
/* Torrent -> status string */
"Checking existing data (%.2f%%)" = "Checking existing data (%.2f%%)";
/* Preferences -> Network -> port status */
"Checking port status" = "Checking port status";
/* Folder cannot be found alert -> location button */
"Choose New Location" = "Choose New Location";
/* Confirm Quit panel -> title */
"Confirm Quit" = "Confirm Quit";
/* Removal confirm panel -> title */
"Confirm Removal of %d Transfers" = "Confirm Removal of %d Transfers";
/* Removal confirm panel -> title */
"Confirm Removal of \"%@\"" = "Confirm Removal of \"%@\"";
/* Debug log alert -> informative message */
"Continuous use at this level might increase memory usage. This setting can be changed in the Message Log window (accessible from the Window menu)." = "Continuous use at this level might increase memory usage. This setting can be changed in the Message Log window (accessible from the Window menu).";
/* Torrent file copy alert -> title */
"Copy of \"%@\" Cannot Be Created" = "Copy of \"%@\" Cannot Be Created";
/* Create toolbar item -> label */
"Create" = "Create";
/* Drag overlay -> file */
"Create a Torrent File" = "Create a Torrent File";
/* Create toolbar item -> tooltip */
"Create torrent file" = "Create torrent file";
/* Create toolbar item -> palette label */
"Create Torrent File" = "Create Torrent File";
/* Create torrent -> failed -> title */
"Creation of \"%@\" failed." = "Creation of \"%@\" failed.";
/* Torrent -> status string */
"DL: %@, " = "DL: %@, ";
/* Debug log alert -> button
Open duplicate alert -> button */
"Don't Alert Again" = "Don't Alert Again";
/* Inspector -> files tab -> tooltip */
"Don't Download" = "Don't Download";
/* Inspector -> files tab -> tooltip */
"Download" = "Download";
/* Torrent file disk space alert -> button */
"Download Anyway" = "Download Anyway";
/* Growl notification title */
"Download Complete" = "Download Complete";
/* Inspector -> files tab -> tooltip */
"Download Some" = "Download Some";
/* Torrent -> status string */
"Downloading" = "Downloading";
/* Torrent -> status string */
"Downloading from %d of %d peers" = "Downloading from %1$d of %2$d peers";
/* Torrent -> status string */
"Downloading from %d of 1 peer" = "Downloading from %d of 1 peer";
/* Transfer speed invalid
Ratio invalid */
"error" = "error";
/* Preferences -> Network -> port map status */
"Error mapping port" = "Error mapping port";
/* Torrent -> status string */
"Error: " = "Error: ";
/* Filter toolbar item -> label */
"Filter" = "Filter";
/* Inspector -> Peers tab -> table row tooltip */
"From: cache" = "From: cache";
/* Inspector -> Peers tab -> table row tooltip */
"From: incoming connection" = "From: incoming connection";
/* Inspector -> Peers tab -> table row tooltip */
"From: peer exchange" = "From: peer exchange";
/* Inspector -> Peers tab -> table row tooltip */
"From: tracker" = "From: tracker";
/* Preferences -> General toolbar item title */
"General" = "General";
/* View menu -> Filter Bar */
"Hide Filter Bar" = "Hide Filter Bar";
/* View menu -> Inspector */
"Hide Inspector" = "Hide Inspector";
/* View menu -> Status Bar */
"Hide Status Bar" = "Hide Status Bar";
/* Inspector -> files tab -> tooltip */
"High Priority" = "High Priority";
/* Inspector -> Peers tab -> peers
Inspector -> Files tab -> bottom text (number of files) */
"info not available" = "info not available";
/* Inspector toolbar item -> label */
"Inspector" = "Inspector";
/* Download not a torrent -> message */
"It appears that the file \"%@\" from %@ is not a torrent file." = "It appears that the file \"%1$@\" from %2$@ is not a torrent file.";
/* Action context menu -> upload/download limit */
"Limit (%d KB/s)" = "Limit (%d KB/s)";
/* Save log alert panel -> title */
"Log Could Not Be Saved" = "Log Could Not Be Saved";
/* Inspector -> files tab -> tooltip */
"Low Priority" = "Low Priority";
/* Inspector -> files tab -> tooltip */
"Multiple Priorities" = "Multiple Priorities";
/* No Ratio
Torrent -> status string */
"N/A" = "N/A";
/* Preferences -> Network toolbar item title */
"Network" = "Network";
/* Inspector -> above tabs -> selected torrents */
"No Torrents Selected" = "No Torrents Selected";
/* Inspector -> files tab -> tooltip */
"Normal Priority" = "Normal Priority";
/* Torrent file disk space alert -> title */
"Not enough remaining disk space to download \"%@\" completely." = "Not enough remaining disk space to download \"%@\" completely.";
/* Open duplicate alert -> button
Create torrent -> no files -> button
Create torrent -> file already exists warning -> button
Torrent file copy alert -> button
Move folder cannot be found alert -> button
Folder cannot be found alert -> button
Torrent file disk space alert -> button
Create torrent -> no url warning -> button
Torrent download failed -> button
Create torrent -> failed -> button
Move error alert -> button
Debug log alert -> button
Download not a torrent -> button
Create torrent -> zero size -> button
Move inside itself alert -> button
Save log alert panel -> button
Create torrent -> http warning -> button */
"OK" = "OK";
/* Open toolbar item -> label */
"Open" = "Open";
/* Open toolbar item -> palette label */
"Open Torrent Files" = "Open Torrent Files";
/* Open toolbar item -> tooltip */
"Open torrent files" = "Open torrent files";
/* Pause toolbar item -> label */
"Pause" = "Pause";
/* Pause All toolbar item -> label */
"Pause All" = "Pause All";
/* Pause All toolbar item -> tooltip */
"Pause all transfers" = "Pause all transfers";
/* Pause toolbar item -> palette label */
"Pause Selected" = "Pause Selected";
/* Pause toolbar item -> tooltip */
"Pause selected transfers" = "Pause selected transfers";
/* Torrent -> status string */
"Paused" = "Paused";
/* Preferences -> Network -> port status */
"Port is closed" = "Port is closed";
/* Preferences -> Network -> port status */
"Port is open" = "Port is open";
/* Preferences -> Network -> port status */
"Port is stealth" = "Port is stealth";
/* Preferences -> Network -> port map status */
"Port successfully mapped" = "Port successfully mapped";
/* Inspector -> Peers tab -> table row tooltip */
"Port: %d" = "Port: %d";
/* Inspector -> Peers tab -> table row tooltip */
"Port: N/A" = "Port: N/A";
/* Inspector -> files tab -> tooltip */
"Priority Not Available" = "Priority Not Available";
/* Inspector -> is private torrent */
"Private Torrent, PEX disabled" = "Private Torrent, PEX disabled";
/* Inspector -> Peers tab -> table row tooltip */
"Progress: %.1f%%" = "Progress: %.1f%%";
/* Inspector -> is not private torrent */
"Public Torrent" = "Public Torrent";
/* Transmission already running alert -> button
OS update needed -> button
Confirm Quit panel -> button */
"Quit" = "Quit";
/* Torrent -> status string */
"Ratio: " = "Ratio: ";
/* Torrent -> status string */
"Ratio: %@, " = "Ratio: %@, ";
/* Removal confirm panel -> button
Remove toolbar item -> label */
"Remove" = "Remove";
/* Remove toolbar item -> palette label */
"Remove Selected" = "Remove Selected";
/* Remove toolbar item -> tooltip */
"Remove selected transfers" = "Remove selected transfers";
/* Resume toolbar item -> label */
"Resume" = "Resume";
/* Resume All toolbar item -> label */
"Resume All" = "Resume All";
/* Resume All toolbar item -> tooltip */
"Resume all transfers" = "Resume all transfers";
/* Resume toolbar item -> palette label */
"Resume Selected" = "Resume Selected";
/* Resume toolbar item -> tooltip */
"Resume selected transfers" = "Resume selected transfers";
/* Torrent -> status string */
"Seeding" = "Seeding";
/* Torrent -> status string */
"Seeding complete" = "Seeding complete";
/* Growl notification title */
"Seeding Complete" = "Seeding Complete";
/* Torrent -> status string */
"Seeding to %d of %d peers" = "Seeding to %1$d of %2$d peers";
/* Torrent -> status string */
"Seeding to %d of 1 peer" = "Seeding to %d of 1 peer";
/* Folder cannot be found alert -> prompt
Default folder cannot be found alert -> prompt
Open torrent -> prompt
Move torrent -> prompt
Default incomplete folder cannot be found alert -> prompt
Create torrent -> select file */
"Select" = "Select";
/* Create torrent -> select file */
"Select a file or folder for the torrent file." = "Select a file or folder for the torrent file.";
/* Folder cannot be found alert -> select destination folder
Open torrent -> select destination folder */
"Select the download folder for \"%@\"" = "Select the download folder for \"%@\"";
/* Move torrent -> select destination folder */
"Select the new folder for %d data files." = "Select the new folder for %d data files.";
/* Move torrent -> select destination folder */
"Select the new folder for \"%@\"." = "Select the new folder for \"%@\".";
/* Main window -> 1st bottom left button (action) tooltip */
"Shortcuts for changing global settings." = "Shortcuts for changing global settings.";
/* View menu -> Filter Bar */
"Show Filter Bar" = "Show Filter Bar";
/* View menu -> Inspector */
"Show Inspector" = "Show Inspector";
/* View menu -> Status Bar */
"Show Status Bar" = "Show Status Bar";
/* Growl notification title */
"Speed Limit Auto Disabled" = "Speed Limit Auto Disabled";
/* Growl notification title */
"Speed Limit Auto Enabled" = "Speed Limit Auto Enabled";
/* Main window -> 2nd bottom left button (turtle) tooltip */
"Speed Limit overrides the total bandwidth limits with its own limits." = "Speed Limit overrides the total bandwidth limits with its own limits.";
/* Torrent -> status string */
"Stalled, " = "Stalled, ";
/* Action context menu -> ratio stop */
"Stop at Ratio (%.2f)" = "Stop at Ratio (%.2f)";
/* Torrent -> status string */
"Stopping" = "Stopping";
/* Default folder cannot be found alert -> message */
"The download folder cannot be found. Choose a new location." = "The download folder cannot be found. Choose a new location.";
/* Folder cannot be found alert -> title */
"The folder for downloading \"%@\" cannot be found." = "The folder for downloading \"%@\" cannot be found.";
/* Move folder cannot be found alert -> title */
"The folder for moving the completed \"%@\" cannot be found." = "The folder for moving the completed \"%@\" cannot be found.";
/* Default incomplete folder cannot be found alert -> message */
"The incomplete folder cannot be found. Choose a new location or cancel for none." = "The incomplete folder cannot be found. Choose a new location or cancel for none.";
/* Debug log alert -> message */
"The Message Log is set to \"Debug\"" = "The Message Log is set to \"Debug\"";
/* Move inside itself alert -> message
Move error alert -> message */
"The move operation of \"%@\" cannot be done." = "The move operation of \"%@\" cannot be done.";
/* Torrent download failed -> message */
"The torrent could not be downloaded from %@ because an error occurred (%@)." = "The torrent could not be downloaded from %1$@ because an error occurred (%2$@).";
/* Torrent file copy alert -> message */
"The torrent file (%@) cannot be found." = "The torrent file (%@) cannot be found.";
/* Open duplicate alert -> message */
"The torrent file cannot be opened because it is a duplicate of an already running transfer." = "The torrent file cannot be opened because it is a duplicate of an already running transfer.";
/* Create torrent -> zero size -> title */
"The total file size is zero bytes." = "The total file size is zero bytes.";
/* Create torrent -> no url warning -> title */
"The tracker address cannot be blank." = "The tracker address cannot be blank.";
/* Create torrent -> http warning -> title */
"The tracker address must begin with \"http://\"." = "The tracker address must begin with \"http://\".";
/* Torrent file disk space alert -> message */
"The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue." = "The transfer will be paused. Clear up space on %@ or deselect files in the torrent inspector to continue.";
/* Removal confirm panel -> message part 1 */
"There are %d active transfers." = "There are %d active transfers.";
/* Confirm Quit panel -> message */
"There are %d active transfers. Do you really want to quit?" = "There are %d active transfers. Do you really want to quit?";
/* Removal confirm panel -> message part 1 */
"There are %d transfers (%d active)." = "There are %1$d transfers (%2$d active).";
/* Transmission already running alert -> message */
"There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "There is already a copy of Transmission running. This copy cannot be opened until that instance is quit.";
/* Confirm Quit panel -> message */
"There is an active transfer. Do you really want to quit?" = "There is an active transfer. Do you really want to quit?";
/* Create torrent -> no files -> warning */
"There must be at least one file in a folder to create a torrent file." = "There must be at least one file in a folder to create a torrent file.";
/* Save log alert panel -> message */
"There was a problem creating the file \"%@\"." = "There was a problem creating the file \"%@\".";
/* Move error alert -> title */
"There was an error moving the data file." = "There was an error moving the data file.";
/* Create torrent -> failed -> warning */
"There was an error parsing the data file. The torrent file was not created." = "There was an error parsing the data file. The torrent file was not created.";
/* Create torrent -> no files -> title */
"This folder contains no files." = "This folder contains no files.";
/* Removal confirm panel -> message */
"This transfer is active. Once removed, continuing the transfer will require the torrent file. Do you really want to remove it?" = "This transfer is active. Once removed, continuing the transfer will require the torrent file. Do you really want to remove it?";
/* Filter toolbar item -> palette label */
"Toggle Filter" = "Toggle Filter";
/* Inspector toolbar item -> palette label */
"Toggle Inspector" = "Toggle Inspector";
/* Filter toolbar item -> tooltip */
"Toggle the filter bar" = "Toggle the filter bar";
/* Inspector toolbar item -> tooltip */
"Toggle the torrent inspector" = "Toggle the torrent inspector";
/* Torrent download error -> title
Download not a torrent -> title */
"Torrent download failed" = "Torrent download failed";
/* Growl notification title */
"Torrent File Auto Added" = "Torrent File Auto Added";
/* Status bar -> total download */
"Total DL: " = "Total DL: ";
/* Status bar -> total upload */
"Total UL: " = "Total UL: ";
/* Preferences -> Transfers toolbar item title */
"Transfers" = "Transfers";
/* OS update needed -> message */
"Transmission has features that require a more up-to-date operating system. The operating system must be updated before this version can run." = "Transmission has features that require a more up-to-date operating system. The operating system must be updated before this version can run.";
/* Transmission already running alert -> title */
"Transmission is already running." = "Transmission is already running.";
/* OS update needed -> title */
"Transmission requires Mac OS X 10.4 or greater." = "Transmission requires Mac OS X 10.4 or greater.";
/* Torrent -> location when deleting original */
"Transmission Support Folder" = "Transmission Support Folder";
/* Torrent -> status string */
"UL: " = "UL: ";
/* Preferences -> Network -> port status */
"Unable to check port status" = "Unable to check port status";
/* Torrent -> remaining time */
"Unknown" = "Unknown";
/* Save log panel -> default file name */
"untitled" = "untitled";
/* Torrent -> status string */
"Waiting to check existing data" = "Waiting to check existing data";
/* Torrent -> status string */
"Waiting to download" = "Waiting to download";
/* Torrent -> status string */
"Waiting to seed" = "Waiting to seed";
/* Drag overlay -> url */
"Web Address" = "Web Address";

View File

@ -0,0 +1,205 @@
{
IBClasses = (
{CLASS = ActionPopUpButton; LANGUAGE = ObjC; SUPERCLASS = NSPopUpButton; },
{
ACTIONS = {
announceSelectedTorrents = id;
applyFilter = id;
applySpeedLimit = id;
copyTorrentFiles = id;
createFile = id;
doNothing = id;
linkDonate = id;
linkForums = id;
linkHomepage = id;
moveDataFiles = id;
openShowSheet = id;
openURLCancelEndSheet = id;
openURLEndSheet = id;
openURLShowSheet = id;
removeDeleteData = id;
removeDeleteDataAndTorrent = id;
removeDeleteTorrent = id;
removeNoDelete = id;
resetCacheForSelectedTorrents = id;
resumeAllTorrents = id;
resumeSelectedTorrents = id;
resumeSelectedTorrentsNoWait = id;
resumeWaitingTorrents = id;
revealFile = id;
setFilter = id;
setFilterSearchType = id;
setInfoTab = id;
setLimitGlobalEnabled = id;
setQuickLimitGlobal = id;
setQuickRatioGlobal = id;
setSort = id;
setSortReverse = id;
showAboutWindow = id;
showInfo = id;
showMainWindow = id;
showMessageWindow = id;
showPreferenceWindow = id;
stopAllTorrents = id;
stopSelectedTorrents = id;
switchFilter = id;
toggleAdvancedBar = id;
toggleFilterBar = id;
toggleSmallView = id;
toggleSpeedLimit = id;
toggleStatusBar = id;
};
CLASS = Controller;
LANGUAGE = ObjC;
OUTLETS = {
fActionButton = NSButton;
fBottomBar = ImageBackgroundView;
fDateSortActionItem = NSMenuItem;
fDateSortItem = NSMenuItem;
fDockMenu = NSMenu;
fDownloadFilterButton = FilterBarButton;
fDownloadLimitItem = NSMenuItem;
fDownloadMenu = NSMenu;
fDownloadNoLimitItem = NSMenuItem;
fFilterBar = FilterBarView;
fNameSortActionItem = NSMenuItem;
fNameSortItem = NSMenuItem;
fNextFilterItem = NSMenuItem;
fNextInfoTabItem = NSMenuItem;
fNoFilterButton = FilterBarButton;
fOpenIgnoreDownloadFolder = NSMenuItem;
fOrderSortActionItem = NSMenuItem;
fOrderSortItem = NSMenuItem;
fPauseFilterButton = FilterBarButton;
fPrevFilterItem = NSMenuItem;
fPrevInfoTabItem = NSMenuItem;
fProgressSortActionItem = NSMenuItem;
fProgressSortItem = NSMenuItem;
fScrollView = NSScrollView;
fSearchFilterField = NSSearchField;
fSeedFilterButton = FilterBarButton;
fSpeedLimitButton = NSButton;
fStateSortActionItem = NSMenuItem;
fStateSortItem = NSMenuItem;
fStatusBar = ImageBackgroundView;
fTableView = TorrentTableView;
fTotalDLField = NSTextField;
fTotalTorrentsField = NSTextField;
fTotalULField = NSTextField;
fTrackerSortActionItem = NSMenuItem;
fTrackerSortItem = NSMenuItem;
fURLSheetTextField = NSTextField;
fURLSheetWindow = NSWindow;
fUpdater = SUUpdater;
fUploadLimitItem = NSMenuItem;
fUploadMenu = NSMenu;
fUploadNoLimitItem = NSMenuItem;
fWindow = NSWindow;
};
SUPERCLASS = NSObject;
},
{CLASS = FilterBarButton; LANGUAGE = ObjC; SUPERCLASS = NSButton; },
{
CLASS = FilterBarView;
LANGUAGE = ObjC;
OUTLETS = {
fDownloadFilterButton = FilterBarButton;
fNoFilterButton = FilterBarButton;
fPauseFilterButton = FilterBarButton;
fSeedFilterButton = FilterBarButton;
};
SUPERCLASS = ImageBackgroundView;
},
{
ACTIONS = {deselectAll = id; revealFile = id; setNextTab = id; setPreviousTab = id; };
CLASS = FirstResponder;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
},
{CLASS = ImageBackgroundView; LANGUAGE = ObjC; SUPERCLASS = NSView; },
{CLASS = NSSegmentedControl; LANGUAGE = ObjC; SUPERCLASS = NSControl; },
{CLASS = NameCell; LANGUAGE = ObjC; SUPERCLASS = NSCell; },
{
ACTIONS = {
folderSheetShow = id;
setAutoStart = id;
setBadge = id;
setDownloadLocation = id;
setLimit = id;
setLimitCheck = id;
setLimitMenu = id;
setPort = id;
setQuickRatio = id;
setQuickSpeed = id;
setRatio = id;
setRatioCheck = id;
setRatioMenu = id;
setShowMessage = id;
setUpdate = id;
};
CLASS = PrefsController;
LANGUAGE = ObjC;
OUTLETS = {
fAutoStartCheck = NSButton;
fBadgeDownloadRateCheck = NSButton;
fBadgeUploadRateCheck = NSButton;
fBlankView = NSView;
fDownloadCheck = NSButton;
fDownloadField = NSTextField;
fDownloadLimitItem = NSMenuItem;
fDownloadMenu = NSMenu;
fDownloadNoLimitItem = NSMenuItem;
fFolderPopUp = NSPopUpButton;
fGeneralView = NSView;
fNetworkView = NSView;
fPortField = NSTextField;
fPrefsWindow = NSPanel;
fQuitCheck = NSButton;
fRatioCheck = NSButton;
fRatioField = NSTextField;
fRatioNotSetItem = NSMenuItem;
fRatioSetItem = NSMenuItem;
fRemoveCheck = NSButton;
fTransfersView = NSView;
fUpdatePopUp = NSPopUpButton;
fUpdater = SUUpdater;
fUploadCheck = NSButton;
fUploadField = NSTextField;
fUploadLimitItem = NSMenuItem;
fUploadMenu = NSMenu;
fUploadNoLimitItem = NSMenuItem;
fWindow = NSWindow;
};
SUPERCLASS = NSObject;
},
{CLASS = ProgressCell; LANGUAGE = ObjC; SUPERCLASS = NSCell; },
{
ACTIONS = {checkForUpdates = id; };
CLASS = SUUpdater;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
},
{
ACTIONS = {
checkFile = id;
setQuickLimit = id;
setQuickLimitMode = id;
setQuickRatio = id;
setQuickRatioMode = id;
};
CLASS = TorrentTableView;
LANGUAGE = ObjC;
OUTLETS = {
fActionMenu = NSMenu;
fContextNoRow = NSMenu;
fContextRow = NSMenu;
fController = Controller;
fDownloadMenu = NSMenu;
fRatioMenu = NSMenu;
fUploadMenu = NSMenu;
};
SUPERCLASS = NSTableView;
}
);
IBVersion = 1;
}

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>19 80 422 283 0 0 1152 842 </string>
<key>IBEditorPositions</key>
<dict>
<key>1041</key>
<string>480 344 208 149 0 0 1680 1028 </string>
<key>1480</key>
<string>366 546 420 63 0 0 1152 842 </string>
<key>1603</key>
<string>601 669 477 67 0 0 1680 1028 </string>
<key>1936</key>
<string>792 514 208 111 0 0 1680 1028 </string>
<key>2043</key>
<string>63 491 87 68 0 0 1680 1028 </string>
<key>29</key>
<string>261 932 451 44 0 0 1680 1028 </string>
<key>456</key>
<string>396 374 240 225 0 0 1152 842 </string>
<key>581</key>
<string>862 580 115 99 0 0 1680 1028 </string>
<key>589</key>
<string>323 390 201 87 0 0 1024 746 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBLockedObjects</key>
<array>
<integer>21</integer>
</array>
<key>IBOldestOS</key>
<integer>3</integer>
<key>IBOpenObjects</key>
<array>
<integer>1603</integer>
<integer>2043</integer>
<integer>21</integer>
<integer>29</integer>
</array>
<key>IBSystem Version</key>
<string>8R4031</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,18 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {changeLevel = id; clearLog = id; writeToFile = id; };
CLASS = MessageWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fDebugWarningField = NSTextField;
fDebugWarningIcon = NSImageView;
fLevelButton = NSPopUpButton;
fMessageTable = NSTableView;
};
SUPERCLASS = NSWindowController;
}
);
IBVersion = 1;
}

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>42 94 356 240 0 0 1680 1028 </string>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBOpenObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBSystem Version</key>
<string>8R4031</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,77 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{CLASS = MenuButton; LANGUAGE = ObjC; SUPERCLASS = NSButton; },
{CLASS = NSDatePicker; LANGUAGE = ObjC; SUPERCLASS = NSControl; },
{
ACTIONS = {
applyRatioSetting = id;
applySpeedSettings = id;
folderSheetShow = id;
helpForNetwork = id;
importFolderSheetShow = id;
incompleteFolderSheetShow = id;
resetWarnings = id;
setAutoImport = id;
setAutoSize = id;
setAutoSpeedLimit = id;
setBadge = id;
setCheckForUpdate = id;
setDownloadLocation = id;
setGlobalLimit = id;
setNat = id;
setPort = id;
setQueue = id;
setQueueNumber = id;
setRatioStop = id;
setSound = id;
setSpeedLimit = id;
setStalled = id;
setStalledMinutes = id;
};
CLASS = PrefsController;
LANGUAGE = ObjC;
OUTLETS = {
fAdvancedView = NSView;
fBandwidthView = NSView;
fDownloadField = NSTextField;
fDownloadSoundPopUp = NSPopUpButton;
fFolderPopUp = NSPopUpButton;
fGeneralView = NSView;
fImportFolderPopUp = NSPopUpButton;
fIncompleteFolderPopUp = NSPopUpButton;
fNatCheck = NSButton;
fNatStatusField = NSTextField;
fNatStatusImage = NSImageView;
fPortField = NSTextField;
fPortStatusField = NSTextField;
fPortStatusImage = NSImageView;
fPortStatusProgress = NSProgressIndicator;
fQueueDownloadField = NSTextField;
fQueueSeedField = NSTextField;
fRatioStopField = NSTextField;
fSeedingSoundPopUp = NSPopUpButton;
fSpeedLimitDownloadField = NSTextField;
fSpeedLimitUploadField = NSTextField;
fStalledField = NSTextField;
fTransfersView = NSView;
fUploadField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = PrefsWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; },
{
ACTIONS = {checkForUpdates = id; };
CLASS = SUUpdater;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
},
{
CLASS = TorrentTableView;
LANGUAGE = ObjC;
OUTLETS = {fContextNoRow = NSMenu; fContextRow = NSMenu; fController = Controller; };
SUPERCLASS = NSTableView;
}
);
IBVersion = 1;
}

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>32 103 356 240 0 0 1680 1028 </string>
<key>IBEditorPositions</key>
<dict>
<key>153</key>
<string>558 568 563 268 0 0 1680 1028 </string>
<key>28</key>
<string>558 545 563 314 0 0 1680 1028 </string>
<key>41</key>
<string>558 550 563 305 0 0 1680 1028 </string>
<key>66</key>
<string>558 578 563 249 0 0 1680 1028 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBLockedTabItems</key>
<array>
<integer>253</integer>
</array>
<key>IBOpenObjects</key>
<array>
<integer>66</integer>
</array>
<key>IBSystem Version</key>
<string>8R4031</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,31 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 <Foundation/Foundation.h>
@interface ExpandedPathToIconTransformer : NSValueTransformer
{
}
@end

View File

@ -0,0 +1,58 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "ExpandedPathToIconTransformer.h"
@implementation ExpandedPathToIconTransformer
+ (Class) transformedValueClass
{
return [NSImage class];
}
+ (BOOL) allowsReverseTransformation
{
return NO;
}
- (id) transformedValue: (id) value
{
if (!value)
return nil;
NSString * path = [value stringByExpandingTildeInPath];
NSImage * icon;
//show a folder icon if the folder doesn't exist
if (![[NSFileManager defaultManager] fileExistsAtPath: path] && [[path pathExtension] isEqualToString: @""])
icon = [[NSWorkspace sharedWorkspace] iconForFileType: NSFileTypeForHFSTypeCode('fldr')];
else
icon = [[NSWorkspace sharedWorkspace] iconForFile: [value stringByExpandingTildeInPath]];
[icon setScalesWhenResized: YES];
[icon setSize: NSMakeSize(16.0, 16.0)];
return icon;
}
@end

View File

@ -0,0 +1,31 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 <Foundation/Foundation.h>
@interface ExpandedPathToPathTransformer : NSValueTransformer
{
}
@end

View File

@ -0,0 +1,44 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "ExpandedPathToPathTransformer.h"
@implementation ExpandedPathToPathTransformer
+ (Class) transformedValueClass
{
return [NSString class];
}
+ (BOOL) allowsReverseTransformation
{
return NO;
}
- (id) transformedValue: (id) value
{
return value == nil ? nil : [value lastPathComponent];
}
@end

38
macosx/FileNameCell.h Normal file
View File

@ -0,0 +1,38 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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>
@interface FileNameCell : NSActionCell
{
NSImage * fFolderImage;
NSMutableDictionary * fTitleAttributes, * fStatusAttributes;
}
- (NSRect) imageRectForBounds: (NSRect) bounds;
- (NSRect) titleRectForBounds: (NSRect) bounds;
- (NSRect) statusRectForBounds: (NSRect) bounds;
@end

208
macosx/FileNameCell.m Normal file
View File

@ -0,0 +1,208 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "FileNameCell.h"
#import "InfoWindowController.h"
#import "NSStringAdditions.h"
#define PADDING_HORIZONAL 2.0
#define IMAGE_FOLDER_SIZE 16.0
#define IMAGE_ICON_SIZE 32.0
#define PADDING_BETWEEN_IMAGE_AND_TITLE 4.0
#define PADDING_ABOVE_TITLE_FILE 2.0
#define PADDING_BELOW_STATUS_FILE 2.0
@interface FileNameCell (Private)
- (NSRect) rectForTitleWithString: (NSAttributedString *) string inBounds: (NSRect) bounds;
- (NSRect) rectForStatusWithString: (NSAttributedString *) string inBounds: (NSRect) bounds;
- (NSAttributedString *) attributedTitleWithColor: (NSColor *) color;
- (NSAttributedString *) attributedStatusWithColor: (NSColor *) color;
@end
@implementation FileNameCell
- (NSImage *) image
{
NSImage * image = [[self objectValue] objectForKey: @"Icon"];
if (!image)
{
if (!fFolderImage)
{
fFolderImage = [[[NSWorkspace sharedWorkspace] iconForFileType: NSFileTypeForHFSTypeCode('fldr')] copy];
[fFolderImage setFlipped: YES];
}
image = fFolderImage;
}
return image;
}
- (NSRect) imageRectForBounds: (NSRect) bounds
{
NSRect result = bounds;
result.origin.x += PADDING_HORIZONAL;
const float IMAGE_SIZE = [[[self objectValue] objectForKey: @"IsFolder"] boolValue] ? IMAGE_FOLDER_SIZE : IMAGE_ICON_SIZE;
result.origin.y += (result.size.height - IMAGE_SIZE) * 0.5;
result.size = NSMakeSize(IMAGE_SIZE, IMAGE_SIZE);
return result;
}
- (NSRect) titleRectForBounds: (NSRect) bounds
{
return [self rectForTitleWithString: [self attributedTitleWithColor: nil] inBounds: bounds];
}
- (NSRect) statusRectForBounds: (NSRect) bounds
{
return [self rectForStatusWithString: [self attributedStatusWithColor: nil] inBounds: bounds];
}
- (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView
{
//icon
[[self image] drawInRect: [self imageRectForBounds: cellFrame] fromRect: NSZeroRect operation: NSCompositeSourceOver
fraction: 1.0];
Torrent * torrent = [[[[self controlView] window] windowController] selectedTorrent];
//title
NSColor * specialColor = nil;
if ([self isHighlighted]
&& [[self highlightColorWithFrame: cellFrame inView: controlView] isEqual: [NSColor alternateSelectedControlColor]])
specialColor = [NSColor whiteColor];
else if ([torrent checkForFiles: [[self objectValue] objectForKey: @"Indexes"]] == NSOffState)
specialColor = [NSColor disabledControlTextColor];
else;
NSAttributedString * titleString = [self attributedTitleWithColor: specialColor ? specialColor : [NSColor controlTextColor]];
NSRect titleRect = [self rectForTitleWithString: titleString inBounds: cellFrame];
[titleString drawInRect: titleRect];
//status
if (![[[self objectValue] objectForKey: @"IsFolder"] boolValue])
{
NSAttributedString * statusString = [self attributedStatusWithColor: specialColor ? specialColor : [NSColor darkGrayColor]];
NSRect statusRect = [self rectForStatusWithString: statusString inBounds: cellFrame];
[statusString drawInRect: statusRect];
}
}
@end
@implementation FileNameCell (Private)
- (NSRect) rectForTitleWithString: (NSAttributedString *) string inBounds: (NSRect) bounds
{
NSSize titleSize = [string size];
NSRect result = bounds;
if (![[[self objectValue] objectForKey: @"IsFolder"] boolValue])
{
result.origin.x += PADDING_HORIZONAL + IMAGE_ICON_SIZE + PADDING_BETWEEN_IMAGE_AND_TITLE;
result.origin.y += PADDING_ABOVE_TITLE_FILE;
}
else
{
result.origin.x += PADDING_HORIZONAL + IMAGE_FOLDER_SIZE + PADDING_BETWEEN_IMAGE_AND_TITLE;
result.origin.y += (result.size.height - titleSize.height) * 0.5;
}
result.size = titleSize;
result.size.width = MIN(result.size.width, NSMaxX(bounds) - result.origin.x - PADDING_HORIZONAL);
return result;
}
- (NSRect) rectForStatusWithString: (NSAttributedString *) string inBounds: (NSRect) bounds
{
if ([[[self objectValue] objectForKey: @"IsFolder"] boolValue])
return NSZeroRect;
NSSize statusSize = [string size];
NSRect result = bounds;
result.origin.x += PADDING_HORIZONAL + IMAGE_ICON_SIZE + PADDING_BETWEEN_IMAGE_AND_TITLE;
result.origin.y += result.size.height - PADDING_BELOW_STATUS_FILE - statusSize.height;
result.size = statusSize;
result.size.width = MIN(result.size.width, NSMaxX(bounds) - result.origin.x - PADDING_HORIZONAL);
return result;
}
- (NSAttributedString *) attributedTitleWithColor: (NSColor *) color
{
if (!fTitleAttributes)
{
NSMutableParagraphStyle * paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[paragraphStyle setLineBreakMode: NSLineBreakByTruncatingTail];
fTitleAttributes = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
[NSFont messageFontOfSize: 12.0], NSFontAttributeName,
paragraphStyle, NSParagraphStyleAttributeName, nil];
[paragraphStyle release];
}
if (color)
[fTitleAttributes setObject: color forKey: NSForegroundColorAttributeName];
NSString * title = [[self objectValue] objectForKey: @"Name"];
return [[[NSAttributedString alloc] initWithString: title attributes: fTitleAttributes] autorelease];
}
- (NSAttributedString *) attributedStatusWithColor: (NSColor *) color
{
if (!fStatusAttributes)
{
NSMutableParagraphStyle * paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[paragraphStyle setLineBreakMode: NSLineBreakByTruncatingTail];
fStatusAttributes = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
[NSFont messageFontOfSize: 9.0], NSFontAttributeName,
paragraphStyle, NSParagraphStyleAttributeName, nil];
[paragraphStyle release];
}
if (color)
[fStatusAttributes setObject: color forKey: NSForegroundColorAttributeName];
Torrent * torrent = [[[[self controlView] window] windowController] selectedTorrent];
float percent = [torrent fileProgress: [[[self objectValue] objectForKey: @"Indexes"] firstIndex]] * 100.0;
NSString * status = [NSString stringWithFormat: NSLocalizedString(@"%.2f%% of %@",
"Inspector -> Files tab -> file status string"), percent,
[NSString stringForFileSize: [[[self objectValue] objectForKey: @"Size"] unsignedLongLongValue]]];
return [[[NSAttributedString alloc] initWithString: status attributes: fStatusAttributes] autorelease];
}
@end

37
macosx/FileOutlineView.h Normal file
View File

@ -0,0 +1,37 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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>
@interface FileOutlineView : NSOutlineView
{
NSColor * fNormalColor, * fHighPriorityColor, * fLowPriorityColor, * fMixedPriorityColor;
int fHoverRow;
}
- (void) setHoverRowForEvent: (NSEvent *) event;
- (int) hoverRow;
@end

148
macosx/FileOutlineView.m Normal file
View File

@ -0,0 +1,148 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "FileOutlineView.h"
#import "FileNameCell.h"
#import "FilePriorityCell.h"
#import "InfoWindowController.h"
#import "Torrent.h"
@implementation FileOutlineView
- (void) awakeFromNib
{
FileNameCell * nameCell = [[FileNameCell alloc] init];
[[self tableColumnWithIdentifier: @"Name"] setDataCell: nameCell];
[nameCell release];
FilePriorityCell * priorityCell = [[FilePriorityCell alloc] init];
[[self tableColumnWithIdentifier: @"Priority"] setDataCell: priorityCell];
[priorityCell release];
[self setAutoresizesOutlineColumn: NO];
[self setIndentationPerLevel: 14.0];
fNormalColor = [self backgroundColor];
fHighPriorityColor = [[NSColor colorWithCalibratedRed: 0.8588 green: 0.9961 blue: 0.8311 alpha: 1.0] retain];
fLowPriorityColor = [[NSColor colorWithCalibratedRed: 1.0 green: 0.9529 blue: 0.8078 alpha: 1.0] retain];
fMixedPriorityColor = [[NSColor colorWithCalibratedRed: 0.9216 green: 0.9059 blue: 1.0 alpha: 1.0] retain];
fHoverRow = -1;
}
- (void) dealloc
{
[fHighPriorityColor release];
[fLowPriorityColor release];
[fMixedPriorityColor release];
[super dealloc];
}
- (void) mouseDown: (NSEvent *) event
{
[[self window] makeKeyWindow];
[super mouseDown: event];
}
- (NSMenu *) menuForEvent: (NSEvent *) event
{
int row = [self rowAtPoint: [self convertPoint: [event locationInWindow] fromView: nil]];
if (row >= 0)
{
if (![self isRowSelected: row])
[self selectRowIndexes: [NSIndexSet indexSetWithIndex: row] byExtendingSelection: NO];
}
else
[self deselectAll: self];
return [self menu];
}
- (void) setHoverRowForEvent: (NSEvent *) event
{
int row = -1;
if (event)
{
NSPoint point = [self convertPoint: [event locationInWindow] fromView: nil];
if ([self columnAtPoint: point] == [self columnWithIdentifier: @"Priority"])
row = [self rowAtPoint: point];
}
if (row != fHoverRow)
{
if (fHoverRow != -1)
[self reloadItem: [self itemAtRow: fHoverRow]];
fHoverRow = row;
if (fHoverRow != -1)
[self reloadItem: [self itemAtRow: fHoverRow]];
}
}
- (int) hoverRow
{
return fHoverRow;
}
- (void) drawRow: (int) row clipRect: (NSRect) clipRect
{
if (![self isRowSelected: row])
{
NSDictionary * item = [self itemAtRow: row];
Torrent * torrent = [(InfoWindowController *)[[self window] windowController] selectedTorrent];
NSIndexSet * indexes = [item objectForKey: @"Indexes"];
if ([torrent checkForFiles: indexes] == NSOffState)
[fNormalColor set];
else
{
NSSet * priorities = [torrent filePrioritiesForIndexes: indexes];
int count = [priorities count];
if (count == 0)
[fNormalColor set];
else if (count > 1)
[fMixedPriorityColor set];
else
{
int priority = [[priorities anyObject] intValue];
if (priority == TR_PRI_LOW)
[fLowPriorityColor set];
else if (priority == TR_PRI_HIGH)
[fHighPriorityColor set];
else
[fNormalColor set];
}
}
NSRect rect = [self rectOfRow: row];
rect.size.height -= 1.0;
NSRectFill(rect);
}
[super drawRow: row clipRect: clipRect];
}
@end

35
macosx/FilePriorityCell.h Normal file
View File

@ -0,0 +1,35 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "FileOutlineView.h"
@interface FilePriorityCell : NSSegmentedCell
{
NSMutableDictionary * fItem;
NSImage * fLowImage, * fHighImage, * fNormalImage, * fMixedImage, * fNoneImage;
}
@end

126
macosx/FilePriorityCell.m Normal file
View File

@ -0,0 +1,126 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "FilePriorityCell.h"
#import "InfoWindowController.h"
#import "Torrent.h"
@implementation FilePriorityCell
- (id) init
{
if ((self = [super init]))
{
[self setTrackingMode: NSSegmentSwitchTrackingSelectAny];
[self setControlSize: NSMiniControlSize];
[self setSegmentCount: 3];
int i;
for (i = 0; i < [self segmentCount]; i++)
{
[self setLabel: @"" forSegment: i];
[self setWidth: 7.0 forSegment: i];
}
}
return self;
}
- (void) setSelected: (BOOL) flag forSegment: (int) segment
{
[super setSelected: flag forSegment: segment];
//only for when clicking manually
Torrent * torrent = [[[[self controlView] window] windowController] selectedTorrent];
int priority;
if (segment == 0)
priority = TR_PRI_LOW;
else if (segment == 2)
priority = TR_PRI_HIGH;
else
priority = TR_PRI_NORMAL;
[torrent setFilePriority: priority forIndexes: [[self representedObject] objectForKey: @"Indexes"]];
[(FileOutlineView *)[self controlView] reloadData];
}
- (void) drawWithFrame: (NSRect) cellFrame inView: (NSView *) controlView
{
Torrent * torrent = [(InfoWindowController *)[[[self controlView] window] windowController] selectedTorrent];
NSDictionary * dict = [self representedObject];
NSSet * priorities = [torrent filePrioritiesForIndexes: [dict objectForKey: @"Indexes"]];
int count = [priorities count];
FileOutlineView * view = (FileOutlineView *)[self controlView];
int row = [view hoverRow];
if (count > 0 && row != -1 && [view itemAtRow: row] == dict)
{
[super setSelected: [priorities containsObject: [NSNumber numberWithInt: TR_PRI_LOW]] forSegment: 0];
[super setSelected: [priorities containsObject: [NSNumber numberWithInt: TR_PRI_NORMAL]] forSegment: 1];
[super setSelected: [priorities containsObject: [NSNumber numberWithInt: TR_PRI_HIGH]] forSegment: 2];
[super drawWithFrame: cellFrame inView: controlView];
}
else
{
NSImage * image;
if (count == 0)
{
if (!fNoneImage)
fNoneImage = [NSImage imageNamed: @"PriorityNone.png"];
image = fNoneImage;
}
else if (count > 1)
{
if (!fMixedImage)
fMixedImage = [NSImage imageNamed: @"PriorityMixed.png"];
image = fMixedImage;
}
else if ([priorities containsObject: [NSNumber numberWithInt: TR_PRI_NORMAL]])
{
if (!fNormalImage)
fNormalImage = [NSImage imageNamed: @"PriorityNormal.png"];
image = fNormalImage;
}
else if ([priorities containsObject: [NSNumber numberWithInt: TR_PRI_LOW]])
{
if (!fLowImage)
fLowImage = [NSImage imageNamed: @"PriorityLow.png"];
image = fLowImage;
}
else
{
if (!fHighImage)
fHighImage = [NSImage imageNamed: @"PriorityHigh.png"];
image = fHighImage;
}
NSSize imageSize = [image size];
[image compositeToPoint: NSMakePoint(cellFrame.origin.x + (cellFrame.size.width - imageSize.width) * 0.5,
cellFrame.origin.y + (cellFrame.size.height + imageSize.height) * 0.5) operation: NSCompositeSourceOver];
}
}
@end

51
macosx/FilterBarButton.h Normal file
View File

@ -0,0 +1,51 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2006-2007 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>
@class CTGradient;
@interface FilterBarButton : NSButton
{
int fCount;
int fState;
BOOL fEnabled;
NSTrackingRectTag fTrackingTag;
NSBezierPath * fPath, * fEdgePath, * fStepPath;
NSDictionary * fNormalAttributes, * fNormalDimAttributes,
* fHighlightedAttributes, * fHighlightedDimAttributes;
CTGradient * fHighlightedBackground, * fHighlightedOutline,
* fActiveBackground, * fActiveOutline,
* fHoveringBackground;
NSColor * fHoveringOutline;
}
- (void) setCount: (int) count;
- (void) setEnabled: (BOOL) enable;
- (void) resetBounds: (NSNotification *) notification;
- (void) setForActive: (NSNotification *) notification;
- (void) setForInactive: (NSNotification *) notification;
@end

300
macosx/FilterBarButton.m Normal file
View File

@ -0,0 +1,300 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2006-2007 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 "FilterBarButton.h"
#import "CTGradient.h"
#import "CTGradientAdditions.h"
#import "NSBezierPathAdditions.h"
@interface FilterBarButton (Private)
- (void) createPaths;
- (void) createGradients;
- (void) createFontAttributes;
@end
@implementation FilterBarButton
- (id) initWithCoder: (NSCoder *) coder
{
if ((self = [super initWithCoder: coder]))
{
fEnabled = NO;
fTrackingTag = 0;
fCount = -1;
[self setCount: 0];
[self createPaths];
[self createGradients];
[self createFontAttributes];
NSNotificationCenter * nc = [NSNotificationCenter defaultCenter];
[nc addObserver: self selector: @selector(setForActive:) name: NSWindowDidBecomeKeyNotification object: [self window]];
[nc addObserver: self selector: @selector(setForInactive:) name: NSWindowDidResignKeyNotification object: [self window]];
[nc addObserver: self selector: @selector(resetBounds:) name: NSViewFrameDidChangeNotification object: nil];
}
return self;
}
- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver: self];
[fPath release];
[fEdgePath release];
[fStepPath release];
[fNormalAttributes release];
[fNormalDimAttributes release];
[fHighlightedAttributes release];
[fHighlightedDimAttributes release];
[fHighlightedBackground release];
[fHighlightedOutline release];
[fActiveBackground release];
[fActiveOutline release];
[fHoveringBackground release];
[fHoveringOutline release];
[super dealloc];
}
- (void) sizeToFit
{
NSSize size = [[self title] sizeWithAttributes: fNormalAttributes];
size.width = floorf(size.width + 14.5);
size.height += 1;
[self setFrameSize: size];
[self setBoundsSize: size];
[self createPaths];
}
- (BOOL) isFlipped
{
return NO;
}
- (void) drawRect: (NSRect) rect
{
// draw background
if ([[self cell] isHighlighted])
{
[fHighlightedBackground fillBezierPath: fPath angle: -90.0];
[fHighlightedOutline fillBezierPath: fStepPath angle: -90.0];
}
else
switch (fState)
{
case 1: // active
[fActiveBackground fillBezierPath: fPath angle: -90.0];
[fActiveOutline fillBezierPath: fStepPath angle: -90.0];
break;
case 2: // hovering
case 3: // clicked but cell is not highlighted
[fHoveringBackground fillBezierPath: fPath angle: -90.0];
[fHoveringOutline setStroke];
[fEdgePath stroke];
break;
}
// draw title
NSSize titleSize = [[self title] sizeWithAttributes: fNormalAttributes];
NSPoint titlePos = NSMakePoint(([self bounds].size.width - titleSize.width) * 0.5,
([self bounds].size.height - titleSize.height) * 0.5 + 1.5);
NSDictionary * attributes;
if (fState)
attributes = fEnabled ? fHighlightedAttributes : fHighlightedDimAttributes;
else
attributes = fEnabled ? fNormalAttributes : fNormalDimAttributes;
[[self title] drawAtPoint: titlePos withAttributes: attributes];
}
- (void) setCount: (int) count
{
if (count == fCount)
return;
fCount = count;
[self setToolTip: fCount == 1 ? NSLocalizedString(@"1 Transfer", "Filter Bar Button -> tool tip")
: [NSString stringWithFormat: NSLocalizedString(@"%d Transfers", "Filter Bar Button -> tool tip"), fCount]];
}
- (void) mouseDown: (NSEvent *) event
{
if ([self state] != 1)
[self setState: 3];
[super mouseDown: event];
}
- (void) mouseUp: (NSEvent *) event
{
[super mouseUp: event];
if ([self state] != 1)
[self setState: 1];
}
- (void) mouseEntered: (NSEvent *) event
{
[super mouseEntered: event];
if ([self state] == 0)
[self setState: 2];
}
- (void) mouseExited: (NSEvent *) event
{
[super mouseExited: event];
if ([self state] >= 2)
[self setState: 0];
}
- (void) setEnabled: (BOOL) enable
{
fEnabled = enable;
[self setNeedsDisplay: YES];
}
- (int) state
{
return fState;
}
- (void) setState: (int) state
{
fState = state;
[self setNeedsDisplay: YES];
}
- (void) resetBounds: (NSNotification *) notification
{
if (fTrackingTag)
[self removeTrackingRect: fTrackingTag];
fTrackingTag = [self addTrackingRect: [self bounds] owner: self userData: nil assumeInside: NO];
}
- (void) setForActive: (NSNotification *) notification
{
[self setEnabled: YES];
[self resetBounds: nil];
[self setNeedsDisplay: YES];
}
- (void) setForInactive: (NSNotification *) notification
{
if (fTrackingTag)
{
[self removeTrackingRect: fTrackingTag];
fTrackingTag = 0;
}
[self setEnabled: NO];
[self setNeedsDisplay: YES];
}
@end
@implementation FilterBarButton (Private)
- (void) createPaths
{
NSSize buttonSize = [self frame].size;
// the main button path
[fPath release];
fPath = [[NSBezierPath bezierPathWithRoundedRect: NSMakeRect(0.0, 1.0, buttonSize.width, buttonSize.height - 1.0)
radius: (buttonSize.height - 1.0) / 2.0] retain];
// the path used to draw the hover edging
[fEdgePath release];
fEdgePath = [[NSBezierPath bezierPathWithRoundedRect: NSMakeRect(0.5, 1.5, buttonSize.width - 1.0, buttonSize.height - 2.0)
radius: (buttonSize.height - 2.0) / 2.0] retain];
// the path used to draw the depressed shading/highlights of the active button
[fStepPath release];
fStepPath = [[NSBezierPath bezierPathWithRoundedRect: NSMakeRect(0.0, 0.0, buttonSize.width, buttonSize.height - 1.0)
radius: (buttonSize.height - 1.0) / 2.0] retain];
[fStepPath appendBezierPath: fPath];
[fStepPath setWindingRule: NSEvenOddWindingRule];
}
- (void) createGradients
{
NSColor *quarterAlphaBlack = [NSColor colorWithCalibratedWhite: 0.0 alpha: 0.25];
NSColor *thirdAlphaWhite = [NSColor colorWithCalibratedWhite: 1.0 alpha: 0.3333];
fHighlightedBackground = [[CTGradient gradientWithBeginningColor: [NSColor colorWithCalibratedRed: 134.0/255 green: 151.0/255 blue: 176.0/255 alpha: 1.0]
endingColor: [NSColor colorWithCalibratedRed: 104.0/255 green: 125.0/255 blue: 157.0/255 alpha: 1.0]] retain];
fHighlightedOutline = [[CTGradient gradientWithBeginningColor: quarterAlphaBlack
middleColor1: quarterAlphaBlack
middleColor2: thirdAlphaWhite
endingColor: thirdAlphaWhite] retain];
fActiveBackground = [[CTGradient gradientWithBeginningColor: [NSColor colorWithCalibratedRed: 151.0/255 green: 166.0/255 blue: 188.0/255 alpha: 1.0]
endingColor: [NSColor colorWithCalibratedRed: 126.0/255 green: 144.0/255 blue: 171.0/255 alpha: 1.0]] retain];
fActiveOutline = [fHighlightedOutline retain];
fHoveringBackground = [[CTGradient gradientWithBeginningColor: [NSColor colorWithCalibratedRed: 164.0/255 green: 177.0/255 blue: 196.0/255 alpha: 1.0]
endingColor: [NSColor colorWithCalibratedRed: 141.0/255 green: 158.0/255 blue: 182.0/255 alpha: 1.0]] retain];
fHoveringOutline = [[NSColor colorWithCalibratedWhite: 0.0 alpha: 0.075] retain];
}
- (void) createFontAttributes
{
NSFont * boldSystemFont = [NSFont boldSystemFontOfSize: 12.0];
NSSize shadowOffset = NSMakeSize(0.0, -1.0);
NSShadow * shadowNormal = [[[NSShadow alloc] init] autorelease];
[shadowNormal setShadowOffset: shadowOffset];
[shadowNormal setShadowBlurRadius: 1.0];
[shadowNormal setShadowColor: [NSColor colorWithCalibratedWhite: 1.0 alpha: 0.4]];
NSShadow * shadowNormalDim = [[[NSShadow alloc] init] autorelease];
[shadowNormalDim setShadowOffset: shadowOffset];
[shadowNormalDim setShadowBlurRadius: 1.0];
[shadowNormalDim setShadowColor: [NSColor colorWithCalibratedWhite: 1.0 alpha: 0.2]];
NSShadow * shadowHighlighted = [[[NSShadow alloc] init] autorelease];
[shadowHighlighted setShadowOffset: shadowOffset];
[shadowHighlighted setShadowBlurRadius: 1.0];
[shadowHighlighted setShadowColor: [NSColor colorWithCalibratedWhite: 0.0 alpha: 0.4]];
fNormalAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSColor colorWithCalibratedWhite: 0.259 alpha: 1.0], NSForegroundColorAttributeName,
boldSystemFont, NSFontAttributeName,
shadowNormal, NSShadowAttributeName, nil];
fNormalDimAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSColor disabledControlTextColor], NSForegroundColorAttributeName,
boldSystemFont, NSFontAttributeName,
shadowNormalDim, NSShadowAttributeName, nil];
fHighlightedAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSColor whiteColor], NSForegroundColorAttributeName,
boldSystemFont, NSFontAttributeName,
shadowHighlighted, NSShadowAttributeName, nil];
fHighlightedDimAttributes = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSColor colorWithCalibratedWhite: 0.9 alpha: 1.0], NSForegroundColorAttributeName,
boldSystemFont, NSFontAttributeName,
shadowHighlighted, NSShadowAttributeName, nil];
}
@end

35
macosx/FilterBarView.h Normal file
View File

@ -0,0 +1,35 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "ImageBackgroundView.h"
#import "FilterBarButton.h"
@interface FilterBarView : ImageBackgroundView
{
IBOutlet FilterBarButton * fNoFilterButton, * fDownloadFilterButton,
* fSeedFilterButton, * fPauseFilterButton;
}
@end

53
macosx/FilterBarView.m Normal file
View File

@ -0,0 +1,53 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2007 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 "FilterBarView.h"
#define ORIGIN_VERTICAL 3.0
#define ORIGIN_HORIZONTAL 4.0
#define PADDING_HORIZONTAL 2.0
@implementation FilterBarView
- (void) awakeFromNib
{
[fNoFilterButton setTitle: NSLocalizedString(@"All", @"Filter Bar Button -> title")];
[fDownloadFilterButton setTitle: NSLocalizedString(@"Downloading", @"Filter Bar Button -> title")];
[fSeedFilterButton setTitle: NSLocalizedString(@"Seeding", @"Filter Bar Button -> title")];
[fPauseFilterButton setTitle: NSLocalizedString(@"Paused", @"Filter Bar Button -> title")];
[fNoFilterButton sizeToFit];
[fDownloadFilterButton sizeToFit];
[fSeedFilterButton sizeToFit];
[fPauseFilterButton sizeToFit];
[fNoFilterButton setFrameOrigin: NSMakePoint(ORIGIN_HORIZONTAL, ORIGIN_VERTICAL)];
[fDownloadFilterButton setFrameOrigin: NSMakePoint(NSMaxX([fNoFilterButton frame]) + PADDING_HORIZONTAL, ORIGIN_VERTICAL)];
[fSeedFilterButton setFrameOrigin: NSMakePoint(NSMaxX([fDownloadFilterButton frame]) + PADDING_HORIZONTAL, ORIGIN_VERTICAL)];
[fPauseFilterButton setFrameOrigin: NSMakePoint(NSMaxX([fSeedFilterButton frame]) + PADDING_HORIZONTAL, ORIGIN_VERTICAL)];
[self setNeedsDisplay: YES];
}
@end

View File

@ -0,0 +1,18 @@
{
IBClasses = (
{
ACTIONS = {hideLicense = id; showLicense = id; };
CLASS = AboutWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fLicenseSheet = NSPanel;
fLicenseView = NSTextView;
fTextView = NSTextView;
fVersionField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
);
IBVersion = 1;
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>23 96 356 240 0 0 1440 878 </string>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBSystem Version</key>
<string>8R2218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,30 @@
{
IBClasses = (
{
ACTIONS = {
cancelCreateProgress = id;
cancelCreateWindow = id;
create = id;
setLocation = id;
};
CLASS = CreatorWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fCommentView = NSTextView;
fIconView = NSImageView;
fLocationField = NSTextField;
fNameField = NSTextField;
fOpenCheck = NSButton;
fPiecesField = NSTextField;
fPrivateCheck = NSButton;
fProgressIndicator = NSProgressIndicator;
fProgressView = NSView;
fStatusField = NSTextField;
fTrackerField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
);
IBVersion = 1;
}

17
macosx/French.lproj/Creator.nib/info.nib generated Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>259 52 356 240 0 0 1440 878 </string>
<key>IBEditorPositions</key>
<dict>
<key>56</key>
<string>549 442 376 126 0 0 1440 878 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBSystem Version</key>
<string>8R2218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,4 @@
/* Localized versions of Info.plist keys */
CFBundleName = "Transmission";
NSHumanReadableCopyright = "Copyright 2005-2007 The Transmission Project";

View File

@ -0,0 +1,87 @@
{
IBClasses = (
{CLASS = FileOutlineView; LANGUAGE = ObjC; SUPERCLASS = NSOutlineView; },
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {
revealDataFile = id;
revealFile = id;
revealTorrentFile = id;
setCheck = id;
setOnlySelectedCheck = id;
setPex = id;
setPiecesView = id;
setPriority = id;
setRatioLimit = id;
setRatioSetting = id;
setSpeedLimit = id;
setSpeedMode = id;
};
CLASS = InfoWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fCommentView = NSTextView;
fCompletedFromTrackerField = NSTextField;
fConnectedPeersField = NSTextField;
fCreatorField = NSTextField;
fDataLocationField = NSTextField;
fDateActivityField = NSTextField;
fDateAddedField = NSTextField;
fDateCompletedField = NSTextField;
fDateCreatedField = NSTextField;
fDownloadLimitField = NSTextField;
fDownloadLimitLabel = NSTextField;
fDownloadLimitPopUp = NSPopUpButton;
fDownloadedTotalField = NSTextField;
fDownloadedValidField = NSTextField;
fDownloadingFromField = NSTextField;
fErrorMessageView = NSTextView;
fFileCheckItem = NSMenuItem;
fFileOutline = FileOutlineView;
fFilePriorityHigh = NSMenuItem;
fFilePriorityLow = NSMenuItem;
fFilePriorityNormal = NSMenuItem;
fFileTableStatusField = NSTextField;
fFileUncheckItem = NSMenuItem;
fHashField = NSTextField;
fImageView = NSImageView;
fLeechersField = NSTextField;
fNameField = NSTextField;
fPeerTable = NSTableView;
fPexCheck = NSButton;
fPiecesControl = NSSegmentedControl;
fPiecesField = NSTextField;
fPiecesView = PiecesView;
fProgressField = NSTextField;
fRatioField = NSTextField;
fRatioLimitField = NSTextField;
fRatioPopUp = NSPopUpButton;
fRevealDataButton = NSButton;
fRevealTorrentButton = NSButton;
fSecureField = NSTextField;
fSeedersField = NSTextField;
fSizeField = NSTextField;
fStateField = NSTextField;
fSwarmSpeedField = NSTextField;
fTabView = NSTabView;
fTorrentLocationField = NSTextField;
fTrackerField = NSTextField;
fUploadLimitField = NSTextField;
fUploadLimitLabel = NSTextField;
fUploadLimitPopUp = NSPopUpButton;
fUploadedTotalField = NSTextField;
fUploadingToField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = NSLevelIndicatorCell; LANGUAGE = ObjC; SUPERCLASS = NSActionCell; },
{CLASS = NSSegmentedControl; LANGUAGE = ObjC; SUPERCLASS = NSControl; },
{
CLASS = PeerProgressIndicatorCell;
LANGUAGE = ObjC;
SUPERCLASS = NSLevelIndicatorCell;
},
{CLASS = PiecesView; LANGUAGE = ObjC; SUPERCLASS = NSImageView; }
);
IBVersion = 1;
}

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>454 71 356 240 0 0 1440 878 </string>
<key>IBEditorPositions</key>
<dict>
<key>549</key>
<string>577 325 236 149 0 0 1440 878 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBLockedObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBLockedTabItems</key>
<array>
<integer>332</integer>
</array>
<key>IBSystem Version</key>
<string>8R2218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,619 @@
/* Torrent -> progress string */
" - %@ remaining" = " - %@ restant";
/* Torrent -> progress string */
" - remaining time unknown" = " - temps restant inconnu";
/* File size (beware of leading space) */
" GB" = " Go";
/* File size (beware of leading space) */
" KB" = " Ko";
/* File size (beware of leading space) */
" MB" = " Mo";
/* Removal confirm panel -> message part 2 */
" Once removed, continuing the transfers will require the torrent files. Do you really want to remove them?" = " Une fois supprimés, la reprise des transferts requiert les fichiers torrents. Voulez-vous vraiment les supprimer?";
/* Inspector -> Activity tab -> progress */
"%.2f%% (%.2f%% selected)" = "%1$.2f%% (%2$.2f%% sélectionné)";
/* Inspector -> Files tab -> file status string */
"%.2f%% of %@" = "%1$.2f%% de %2$@";
/* Torrent -> progress string */
"%@ of %@ (%.2f%%)" = "%1$@ sur %2$@ (%3$.2f%%)";
/* Torrent -> progress string */
"%@ of %@ (%.2f%%), uploaded %@ (Ratio: %@)" = "%1$@ de %2$@ (%3$.2f%%), envoyé %4$@ (Ratio: %5$@)";
/* Inspector -> above tabs -> total size (several torrents selected) */
"%@ Total" = "Total : %@";
/* Create torrent -> info */
"%@, %@ each" = "%1$@, %2$@ chaque";
/* Torrent -> progress string */
"%@, uploaded %@ (Ratio: %@)" = "%1$@, envoyé %2$@ (Ratio: %3$@)";
/* Inspector -> Peers tab -> peers */
"%d cache" = "%d cache";
/* Inspector -> Peers tab -> peers */
"%d Connected" = "%d connecté(s)";
/* Torrent -> remaining time */
"%d days %d hr" = "%1$d jours %2$d h";
/* Dock item - Downloading */
"%d Downloading" = "%d en téléchargement";
/* Inspector -> Files tab -> bottom text (number of files) */
"%d files total" = "%d fichiers";
/* Drag overlay -> torrents
Create torrent -> info */
"%d Files, " = "%d Fichiers, ";
/* Torrent -> remaining time */
"%d hr %02d min" = "%1$d h %2$d min";
/* Inspector -> Peers tab -> peers */
"%d incoming" = "%d entrant";
/* Torrent -> remaining time */
"%d min %02d sec" = "%1$d min %2$d sec";
/* Inspector -> Peers tab -> peers */
"%d PEX" = "%d PEX";
/* Create torrent -> info */
"%d pieces" = "%d pièces";
/* Torrent -> remaining time */
"%d sec" = "%d sec";
/* Dock item - Seeding */
"%d Seeding" = "%d en Seed";
/* Drag overlay -> torrents */
"%d Torrent Files" = "%d Fichiers Torrent";
/* Inspector -> above tabs -> selected torrents */
"%d Torrents Selected" = "%d torrents sélectionnés";
/* Inspector -> Peers tab -> peers */
"%d tracker" = "%d tracker";
/* Filter Bar Button -> tool tip
Status bar transfer count */
"%d Transfers" = "%d transferts";
/* File size */
"%lld bytes" = "%lld octets";
/* Torrent -> error string unreadable */
"(unreadable error)" = "(erreur illisible)";
/* Torrent -> remaining time */
"1 day %d hr" = "1 jour %d h";
/* Inspector -> Files tab -> bottom text (number of files) */
"1 file total" = "1 fichier";
/* Drag overlay -> torrents
Create torrent -> info */
"1 File, " = "1 Fichier, ";
/* Create torrent -> info */
"1 piece" = "1 pièce";
/* Filter Bar Button -> tool tip
Status bar transfer count */
"1 Transfer" = "1 transfert";
/* Move folder cannot be found alert -> message */
"\"%@\" cannot be found. The file will remain in its current location." = "\"%@\" n'a pas pu être trouvé. Le fichier va rester à son emplacement actuel.";
/* Folder cannot be found alert -> message */
"\"%@\" cannot be found. The transfer will be paused." = "\"%@\" n'a pas pu être trouvé. Le transfert va être arrêté.";
/* Create torrent -> file already exists warning -> warning */
"A file with the name \"%@\" already exists in the directory \"%@\". Choose a new name or directory to create the torrent." = "Un fichier nommé \"%1$@\" existe déja dans le dossier \"%2$@\". Choisissez un nom ou un dossier différent pour créer le torrent.";
/* Move inside iteself alert -> title */
"A folder cannot be moved to inside itself." = "Un dossier ne peut être déplacé à l'intérieur de lui-même.";
/* Create torrent -> zero size -> warning */
"A torrent file cannot be created for files with no size." = "Un ficher torrent ne peut être créé avec une taille nulle.";
/* Create torrent -> file already exists warning -> title */
"A torrent file with this name and directory cannot be created." = "Un ficher torrent ne peut être créé avec ce nom et ce dossier.";
/* Open duplicate alert -> title */
"A transfer of \"%@\" is already running." = "Un transfer de \"%@\" est déja actif.";
/* Torrent file disk space alert -> button */
"Always Download" = "Toujours télécharger";
/* Transfer speed (Bytes per second) */
"B/s" = "o/s";
/* Preferences -> Bandwidth toolbar item title */
"Bandwidth" = "Bande passante";
/* Growl notification description */
"Bandwidth settings changed" = "Les réglages de bande passante ont changé";
/* Removal confirm panel -> button
Confirm Quit panel -> button */
"Cancel" = "Annuler";
/* Create torrent -> no url warning -> warning
Create torrent -> http warning -> warning */
"Change the tracker address to create the torrent." = "Changez l'adresse du tracker pour créer le torrent.";
/* Torrent -> status string */
"Checking existing data (%.2f%%)" = "Vérification des fichiers existants (%.2f%%)";
/* Preferences -> Network -> port status */
"Checking port status" = "Vérification de l'état du port";
/* Folder cannot be found alert -> location button */
"Choose New Location" = "Nouvel emplacement";
/* Confirm Quit panel -> title */
"Confirm Quit" = "Voulez-vous réellement quitter ?";
/* Removal confirm panel -> title */
"Confirm Removal of %d Transfers" = "Confirmez la suppression de %d transferts";
/* Removal confirm panel -> title */
"Confirm Removal of \"%@\"" = "Confirmez la suppression de \"%@\"";
/* Debug log alert -> informative message */
"Continuous use at this level might increase memory usage. This setting can be changed in the Message Log window (accessible from the Window menu)." = "Un usage continu à ce niveau peut augmenter l'utilisation mémoire. Ce réglage peut être modifié dans la fenêtre Historique des Messages (accessible via le menu Fenêtre).";
/* Torrent file copy alert -> title */
"Copy of \"%@\" Cannot Be Created" = "La copie de \"%@\" ne peut pas être créée";
/* Create toolbar item -> label */
"Create" = "Créer";
/* Drag overlay -> file */
"Create a Torrent File" = "Créer un fichier torrent";
/* Create toolbar item -> tooltip */
"Create torrent file" = "Crée un fichier torrent";
/* Create toolbar item -> palette label */
"Create Torrent File" = "Créer un fichier torrent";
/* Create torrent -> failed -> title */
"Creation of \"%@\" failed." = "La création de \"%@\" a échoué.";
/* Torrent -> status string */
"DL: %@, " = "DL: %@, ";
/* Debug log alert -> button
Open duplicate alert -> button */
"Don't Alert Again" = "Ne plus avertir";
/* Inspector -> files tab -> tooltip */
"Don't Download" = "Ne pas télécharger";
/* Inspector -> files tab -> tooltip */
"Download" = "Télécharger";
/* Torrent file disk space alert -> button */
"Download Anyway" = "Télécharger quand même";
/* Growl notification title */
"Download Complete" = "Téléchargement terminé";
/* Inspector -> files tab -> tooltip */
"Download Some" = "Téléchargement (certains)";
/* Torrent -> status string */
"Downloading" = "Téléchargement";
/* Torrent -> status string */
"Downloading from %d of %d peers" = "Téléchargement de %1$d sur %2$d pairs";
/* Torrent -> status string */
"Downloading from %d of 1 peer" = "Téléchargement de %d sur 1 pair";
/* Transfer speed invalid
Ratio invalid */
"error" = "erreur";
/* Preferences -> Network -> port map status */
"Error mapping port" = "Erreur de mappage du port";
/* Torrent -> status string */
"Error: " = "Erreur: ";
/* Filter toolbar item -> label */
"Filter" = "Filtre";
/* Inspector -> Peers tab -> table row tooltip */
"From: cache" = "De: cache";
/* Inspector -> Peers tab -> table row tooltip */
"From: incoming connection" = "De: connexion entrante";
/* Inspector -> Peers tab -> table row tooltip */
"From: peer exchange" = "De: PEX";
/* Inspector -> Peers tab -> table row tooltip */
"From: tracker" = "De: tracker";
/* Preferences -> General toolbar item title */
"General" = "Général";
/* View menu -> Filter Bar */
"Hide Filter Bar" = "Masquer la barre de filtre";
/* View menu -> Inspector */
"Hide Inspector" = "Masquer l'inspecteur";
/* View menu -> Status Bar */
"Hide Status Bar" = "Masquer la barre de statut";
/* Inspector -> files tab -> tooltip */
"High Priority" = "Priorité haute";
/* Inspector -> Peers tab -> peers
Inspector -> Files tab -> bottom text (number of files) */
"info not available" = "information non disponible";
/* Inspector toolbar item -> label */
"Inspector" = "Inspecteur";
/* Download not a torrent -> message */
"It appears that the file \"%@\" from %@ is not a torrent file." = "Il semble que le fichier \"%1$@\" provenant de %2$@ ne soit pas un torrent.";
/* Action context menu -> upload/download limit */
"Limit (%d KB/s)" = "Limité (%d Ko/s)";
/* Save log alert panel -> title */
"Log Could Not Be Saved" = "Les messages n'ont pas pu être enregistrés";
/* Inspector -> files tab -> tooltip */
"Low Priority" = "Priorité basse";
/* Inspector -> files tab -> tooltip */
"Multiple Priorities" = "Prioritiés multiples";
/* No Ratio
Torrent -> status string */
"N/A" = "ND";
/* Preferences -> Network toolbar item title */
"Network" = "Réseau";
/* Inspector -> above tabs -> selected torrents */
"No Torrents Selected" = "Aucun torrent sélectionné";
/* Inspector -> files tab -> tooltip */
"Normal Priority" = "Priorité Normale";
/* Torrent file disk space alert -> title */
"Not enough remaining disk space to download \"%@\" completely." = "Pas assez d'espace disque pour télécharger \"%@\" en entier.";
/* Open duplicate alert -> button
Create torrent -> no files -> button
Create torrent -> file already exists warning -> button
Torrent file copy alert -> button
Move folder cannot be found alert -> button
Folder cannot be found alert -> button
Torrent file disk space alert -> button
Create torrent -> no url warning -> button
Torrent download failed -> button
Create torrent -> failed -> button
Move error alert -> button
Debug log alert -> button
Download not a torrent -> button
Create torrent -> zero size -> button
Move inside itself alert -> button
Save log alert panel -> button
Create torrent -> http warning -> button */
"OK" = "OK";
/* Open toolbar item -> label */
"Open" = "Ouvrir";
/* Open toolbar item -> tooltip */
"Open torrent files" = "Ouvre des fichiers torrents";
/* Open toolbar item -> palette label */
"Open Torrent Files" = "Ouvrir des fichiers torrents";
/* Pause toolbar item -> label */
"Pause" = "Arrêt";
/* Pause All toolbar item -> label */
"Pause All" = "Arrêt tous";
/* Pause All toolbar item -> tooltip */
"Pause all transfers" = "Arrête tous les transferts";
/* Pause toolbar item -> palette label */
"Pause Selected" = "Arrêter la sélection";
/* Pause toolbar item -> tooltip */
"Pause selected transfers" = "Arrête le transfert sélectionné";
/* Torrent -> status string */
"Paused" = "En pause";
/* Preferences -> Network -> port status */
"Port is closed" = "Le port est fermé";
/* Preferences -> Network -> port status */
"Port is open" = "Le port est ouvert";
/* Preferences -> Network -> port status */
"Port is stealth" = "Le port est furtif";
/* Preferences -> Network -> port map status */
"Port successfully mapped" = "Mappage du port réussi";
/* Inspector -> Peers tab -> table row tooltip */
"Port: %d" = "Port: %d";
/* Inspector -> Peers tab -> table row tooltip */
"Port: N/A" = "Port: ND";
/* Inspector -> files tab -> tooltip */
"Priority Not Available" = "Priorité indisponible";
/* Inspector -> is private torrent */
"Private Torrent, PEX disabled" = "Torrent privé, PEX désactivé";
/* Inspector -> Peers tab -> table row tooltip */
"Progress: %.1f%%" = "Progrès: %.1f%%";
/* Inspector -> is not private torrent */
"Public Torrent" = "Torrent public";
/* Transmission already running alert -> button
OS update needed -> button
Confirm Quit panel -> button */
"Quit" = "Quitter";
/* Torrent -> status string */
"Ratio: " = "Ratio: ";
/* Torrent -> status string */
"Ratio: %@, " = "Ratio: %@, ";
/* Removal confirm panel -> button
Remove toolbar item -> label */
"Remove" = "Supprimer";
/* Remove toolbar item -> palette label */
"Remove Selected" = "Supprimer la sélection";
/* Remove toolbar item -> tooltip */
"Remove selected transfers" = "Supprime les transferts sélectionnés";
/* Resume toolbar item -> label */
"Resume" = "Reprendre";
/* Resume All toolbar item -> label */
"Resume All" = "Reprendre tous";
/* Resume All toolbar item -> tooltip */
"Resume all transfers" = "Reprend tous les transferts";
/* Resume toolbar item -> palette label */
"Resume Selected" = "Reprendre la sélection";
/* Resume toolbar item -> tooltip */
"Resume selected transfers" = "Reprend le transfert sélectionné";
/* Torrent -> status string */
"Seeding" = "Seed";
/* Torrent -> status string */
"Seeding complete" = "Seed terminé";
/* Growl notification title */
"Seeding Complete" = "Seed Terminé";
/* Torrent -> status string */
"Seeding to %d of %d peers" = "Seed à %1$d sur %2$d pairs";
/* Torrent -> status string */
"Seeding to %d of 1 peer" = "Seed à %d sur 1 pair";
/* Folder cannot be found alert -> prompt
Default folder cannot be found alert -> prompt
Open torrent -> prompt
Move torrent -> prompt
Default incomplete folder cannot be found alert -> prompt
Create torrent -> select file */
"Select" = "Choisir";
/* Create torrent -> select file */
"Select a file or folder for the torrent file." = "Sélectionnez un fichier ou un dossier pour le fichier torrent.";
/* Folder cannot be found alert -> select destination folder
Open torrent -> select destination folder */
"Select the download folder for \"%@\"" = "Sélectionnez le dossier de téléchargement pour \"%@\"";
/* Move torrent -> select destination folder */
"Select the new folder for %d data files." = "Sélectionnez le nouveau dossier pour les données de %d.";
/* Move torrent -> select destination folder */
"Select the new folder for \"%@\"." = "Sélectionnez le nouveau dossier pour \"%@\".";
/* Main window -> 1st bottom left button (action) tooltip */
"Shortcuts for changing global settings." = "Raccourci pour changer les réglages";
/* View menu -> Filter Bar */
"Show Filter Bar" = "Afficher la barre de filtre";
/* View menu -> Inspector */
"Show Inspector" = "Afficher l'inspecteur";
/* View menu -> Status Bar */
"Show Status Bar" = "Afficher la barre de statut";
/* Growl notification title */
"Speed Limit Auto Disabled" = "Vitesse limitée automatique désactivée";
/* Growl notification title */
"Speed Limit Auto Enabled" = "Vitesse limitée automatique activée";
/* Main window -> 2nd bottom left button (turtle) tooltip */
"Speed Limit overrides the total bandwidth limits with its own limits." = "Le mode vitesse limitée prime sur les autres réglages de vitesse";
/* Torrent -> status string */
"Stalled, " = "Calé, ";
/* Action context menu -> ratio stop */
"Stop at Ratio (%.2f)" = "Arrêter au ratio (%.2f)";
/* Torrent -> status string */
"Stopping" = "Arrêt";
/* Default folder cannot be found alert -> message */
"The download folder cannot be found. Choose a new location." = "Le dossier de téléchargement est introuvable. Veuillez choisir un nouvel emplacement.";
/* Folder cannot be found alert -> title */
"The folder for downloading \"%@\" cannot be found." = "Le dossier pour le téléchargement de \"%@\" n'a pas pu être trouvé.";
/* Move folder cannot be found alert -> title */
"The folder for moving the completed \"%@\" cannot be found." = "Le dossier pour déplacer \"%@\" n'a pas pu être trouvé.";
/* Default incomplete folder cannot be found alert -> message */
"The incomplete folder cannot be found. Choose a new location or cancel for none." = "Le dossier des téléchargements incomplets est introuvable. Veuillez choisir un nouvel emplacement ou annuler.";
/* Debug log alert -> message */
"The Message Log is set to \"Debug\"" = "L'Historique des Messages est réglé sur \"Debug\"";
/* Move inside iteself alert -> message
Move error alert -> message */
"The move operation of \"%@\" cannot be done." = "L'opération de déplacement de \"%@\" ne peut être effectuée.";
/* Torrent download failed -> message */
"The torrent could not be downloaded from %@ because an error occurred (%@)." = "Le torrent provenant de %1$@ n'a pas pu être téléchargé car une erreur est survenue (%2$@).";
/* Torrent file copy alert -> message */
"The torrent file (%@) cannot be found." = "Le torrent (%@) n'a pas pu être trouvé.";
/* Open duplicate alert -> message */
"The torrent file cannot be opened because it is a duplicate of an already running transfer." = "Le fichier torrent n'a pu être ouvert car c'est une copie d'un transfert actif.";
/* Create torrent -> zero size -> title */
"The total file size is zero bytes." = "La taille totale du ficher est zéro octets.";
/* Create torrent -> no url warning -> title */
"The tracker address cannot be blank." = "L'adresse du tracker ne peut être vide.";
/* Create torrent -> http warning -> title */
"The tracker address must begin with \"http://\"." = "L'adresse du tracker doit commencer par \"http://\".";
/* Torrent file disk space alert -> message */
"The transfer will be paused. Clear up space on \"%@\" to continue." = "Le transfert va être mis en pause. Faites de la place sur \"%@\" pour continuer.";
/* Removal confirm panel -> message part 1 */
"There are %d active transfers." = "Il y a %d transferts actifs.";
/* Confirm Quit panel -> message */
"There are %d active transfers. Do you really want to quit?" = "Il y a encore %d transferts actifs. Voulez-vous vraiment quitter ?";
/* Removal confirm panel -> message part 1 */
"There are %d transfers (%d active)." = "Il y a %1$d transferts dont %2$d actif(s).";
/* Transmission already running alert -> message */
"There is already a copy of Transmission running. This copy cannot be opened until that instance is quit." = "Il y a déja une copie de Transmission en route. Cette copie ne pourra être ouverte avant que l'autre ne soit quittée.";
/* Confirm Quit panel -> message */
"There is an active transfer. Do you really want to quit?" = "Il y a encore un transfert actif. Voulez-vous vraiment quitter ?";
/* Create torrent -> no files -> warning */
"There must be at least one file in a folder to create a torrent file." = "Il doit y avoir au moins un fichier ou dossier pour créer un torrent.";
/* Save log alert panel -> message */
"There was a problem creating the file \"%@\"." = "Problème lors de la création du fichier \"%@\".";
/* Move error alert -> title */
"There was an error moving the data file." = "Il y a eu une erreur lors du déplacement des données.";
/* Create torrent -> failed -> warning */
"There was an error parsing the data file. The torrent file was not created." = "Il y a eu une erreur à l'analyse des données. Le fichier torrent n'a pas été créé.";
/* Create torrent -> no files -> title */
"This folder contains no files." = "Ce dossier ne contient pas de fichiers.";
/* Removal confirm panel -> message */
"This transfer is active. Once removed, continuing the transfer will require the torrent file. Do you really want to remove it?" = "Ce transfert est actif. Une fois supprimé, la reprise du transfert requiert le fichier torrent. Voulez-vous vraiment le supprimer?";
/* Filter toolbar item -> palette label */
"Toggle Filter" = "Afficher/masquer le filtre";
/* Inspector toolbar item -> palette label */
"Toggle Inspector" = "Afficher/masquer l'inspecteur";
/* Filter toolbar item -> tooltip */
"Toggle the filter bar" = "Affiche/masque la barre de filtre";
/* Inspector toolbar item -> tooltip */
"Toggle the torrent inspector" = "Affiche/masque l'inspecteur de torrents";
/* Torrent download error -> title
Download not a torrent -> title */
"Torrent download failed" = "Echec du téléchargement";
/* Growl notification title */
"Torrent File Auto Added" = "Torrent automatiquement ajouté";
/* Status bar -> total download */
"Total DL: " = "DL total: ";
/* Status bar -> total upload */
"Total UL: " = "UL total: ";
/* Preferences -> Transfers toolbar item title */
"Transfers" = "Transferts";
/* OS update needed -> message */
"Transmission has features that require a more up-to-date operating system. The operating system must be updated before this version can run." = "Transmission utilise des composants requiérant une version plus récente du système. Vous devez mettre Mac OS X à jour avant de pouvoir utiliser Transmission.";
/* Transmission already running alert -> title */
"Transmission is already running." = "Transmission est déjà en cours d'exécution";
/* OS update needed -> title */
"Transmission requires Mac OS X 10.4 or greater." = "Transmission requiert Mac OS X 10.4 ou supérieur";
/* Torrent -> location when deleting original */
"Transmission Support Folder" = "Dossier support de Transmission";
/* Torrent -> status string */
"UL: " = "UL: ";
/* Preferences -> Network -> port status */
"Unable to check port status" = "Impossible de vérifier le port";
/* Torrent -> remaining time */
"Unknown" = "inconnu";
/* Save log panel -> default file name */
"untitled" = "sans titre";
/* Torrent -> status string */
"Waiting to check existing files" = "En attente de vérification";
/* Torrent -> status string */
"Waiting to download" = "En attente de téléchargement";
/* Torrent -> status string */
"Waiting to seed" = "En attente de seed";
/* Drag overlay -> url */
"Web Address" = "Adresse Web";

View File

@ -0,0 +1,188 @@
{
IBClasses = (
{CLASS = ActionPopUpButton; LANGUAGE = ObjC; SUPERCLASS = NSPopUpButton; },
{CLASS = BarButton; LANGUAGE = ObjC; SUPERCLASS = NSButton; },
{
ACTIONS = {
announceSelectedTorrents = id;
applyFilter = id;
applySpeedLimit = id;
copyTorrentFiles = id;
createFile = id;
doNothing = id;
linkDonate = id;
linkForums = id;
linkHomepage = id;
moveDataFiles = id;
openShowSheet = id;
openURLCancelEndSheet = id;
openURLEndSheet = id;
openURLShowSheet = id;
removeDeleteData = id;
removeDeleteDataAndTorrent = id;
removeDeleteTorrent = id;
removeNoDelete = id;
resetCacheForSelectedTorrents = id;
resumeAllTorrents = id;
resumeSelectedTorrents = id;
resumeSelectedTorrentsNoWait = id;
resumeWaitingTorrents = id;
revealFile = id;
setFilter = id;
setInfoTab = id;
setLimitGlobalEnabled = id;
setQuickLimitGlobal = id;
setQuickRatioGlobal = id;
setSort = id;
setSortReverse = id;
showAboutWindow = id;
showInfo = id;
showMainWindow = id;
showMessageWindow = id;
showPreferenceWindow = id;
stopAllTorrents = id;
stopSelectedTorrents = id;
switchFilter = id;
toggleAdvancedBar = id;
toggleFilterBar = id;
toggleSmallView = id;
toggleSpeedLimit = id;
toggleStatusBar = id;
};
CLASS = Controller;
LANGUAGE = ObjC;
OUTLETS = {
fActionButton = NSButton;
fBottomBar = ImageBackgroundView;
fDateSortActionItem = NSMenuItem;
fDateSortItem = NSMenuItem;
fDockMenu = NSMenu;
fDownloadFilterButton = FilterBarButton;
fDownloadLimitItem = NSMenuItem;
fDownloadMenu = NSMenu;
fDownloadNoLimitItem = NSMenuItem;
fFilterBar = FilterBarView;
fNameSortActionItem = NSMenuItem;
fNameSortItem = NSMenuItem;
fNextFilterItem = NSMenuItem;
fNextInfoTabItem = NSMenuItem;
fNoFilterButton = FilterBarButton;
fOpenIgnoreDownloadFolder = NSMenuItem;
fOrderSortActionItem = NSMenuItem;
fOrderSortItem = NSMenuItem;
fPauseFilterButton = FilterBarButton;
fPrevFilterItem = NSMenuItem;
fPrevInfoTabItem = NSMenuItem;
fProgressSortActionItem = NSMenuItem;
fProgressSortItem = NSMenuItem;
fScrollView = NSScrollView;
fSearchFilterField = NSSearchField;
fSeedFilterButton = FilterBarButton;
fSpeedLimitButton = NSButton;
fStateSortActionItem = NSMenuItem;
fStateSortItem = NSMenuItem;
fStatusBar = ImageBackgroundView;
fTableView = TorrentTableView;
fTotalDLField = NSTextField;
fTotalTorrentsField = NSTextField;
fTotalULField = NSTextField;
fURLSheetTextField = NSTextField;
fURLSheetWindow = NSWindow;
fUpdater = SUUpdater;
fUploadLimitItem = NSMenuItem;
fUploadMenu = NSMenu;
fUploadNoLimitItem = NSMenuItem;
fWindow = NSWindow;
};
SUPERCLASS = NSObject;
},
{CLASS = FilterBarButton; LANGUAGE = ObjC; SUPERCLASS = NSButton; },
{
CLASS = FilterBarView;
LANGUAGE = ObjC;
OUTLETS = {
fDownloadFilterButton = FilterBarButton;
fNoFilterButton = FilterBarButton;
fPauseFilterButton = FilterBarButton;
fSeedFilterButton = FilterBarButton;
};
SUPERCLASS = ImageBackgroundView;
},
{
ACTIONS = {deselectAll = id; revealFile = id; setNextTab = id; setPreviousTab = id; };
CLASS = FirstResponder;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
},
{CLASS = ImageBackgroundView; LANGUAGE = ObjC; SUPERCLASS = NSView; },
{CLASS = NSSegmentedControl; LANGUAGE = ObjC; SUPERCLASS = NSControl; },
{CLASS = NameCell; LANGUAGE = ObjC; SUPERCLASS = NSCell; },
{
ACTIONS = {
folderSheetShow = id;
setAutoStart = id;
setBadge = id;
setDownloadLocation = id;
setLimit = id;
setLimitCheck = id;
setLimitMenu = id;
setPort = id;
setQuickRatio = id;
setQuickSpeed = id;
setRatio = id;
setRatioCheck = id;
setRatioMenu = id;
setShowMessage = id;
setUpdate = id;
};
CLASS = PrefsController;
LANGUAGE = ObjC;
OUTLETS = {
fAutoStartCheck = NSButton;
fBadgeDownloadRateCheck = NSButton;
fBadgeUploadRateCheck = NSButton;
fBlankView = NSView;
fDownloadCheck = NSButton;
fDownloadField = NSTextField;
fDownloadLimitItem = NSMenuItem;
fDownloadMenu = NSMenu;
fDownloadNoLimitItem = NSMenuItem;
fFolderPopUp = NSPopUpButton;
fGeneralView = NSView;
fNetworkView = NSView;
fPortField = NSTextField;
fPrefsWindow = NSPanel;
fQuitCheck = NSButton;
fRatioCheck = NSButton;
fRatioField = NSTextField;
fRatioNotSetItem = NSMenuItem;
fRatioSetItem = NSMenuItem;
fRemoveCheck = NSButton;
fTransfersView = NSView;
fUpdatePopUp = NSPopUpButton;
fUpdater = SUUpdater;
fUploadCheck = NSButton;
fUploadField = NSTextField;
fUploadLimitItem = NSMenuItem;
fUploadMenu = NSMenu;
fUploadNoLimitItem = NSMenuItem;
fWindow = NSWindow;
};
SUPERCLASS = NSObject;
},
{CLASS = ProgressCell; LANGUAGE = ObjC; SUPERCLASS = NSCell; },
{
ACTIONS = {checkForUpdates = id; };
CLASS = SUUpdater;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
},
{
CLASS = TorrentTableView;
LANGUAGE = ObjC;
OUTLETS = {fContextNoRow = NSMenu; fContextRow = NSMenu; fController = Controller; };
SUPERCLASS = NSTableView;
}
);
IBVersion = 1;
}

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>438 17 422 283 0 0 1440 878 </string>
<key>IBEditorPositions</key>
<dict>
<key>1041</key>
<string>616 618 239 149 0 0 1440 878 </string>
<key>1480</key>
<string>512 553 420 63 0 0 1440 878 </string>
<key>1906</key>
<string>483 550 477 67 0 0 1440 878 </string>
<key>29</key>
<string>76 652 548 44 0 0 1440 878 </string>
<key>456</key>
<string>713 400 274 225 0 0 1440 878 </string>
<key>581</key>
<string>733 486 140 99 0 0 1440 878 </string>
<key>589</key>
<string>73 545 241 106 0 0 1440 878 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBLockedObjects</key>
<array/>
<key>IBOldestOS</key>
<integer>3</integer>
<key>IBSystem Version</key>
<string>8R2218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,19 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {changeLevel = id; clearLog = id; writeToFile = id; };
CLASS = MessageWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fDebugWarningField = NSTextField;
fDebugWarningIcon = NSImageView;
fLevelButton = NSPopUpButton;
fScrollView = NSScrollView;
fTextView = NSTextView;
};
SUPERCLASS = NSWindowController;
}
);
IBVersion = 1;
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>34 76 356 240 0 0 1440 878 </string>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBSystem Version</key>
<string>8R2218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,78 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{CLASS = MenuButton; LANGUAGE = ObjC; SUPERCLASS = NSButton; },
{CLASS = NSDatePicker; LANGUAGE = ObjC; SUPERCLASS = NSControl; },
{
ACTIONS = {
applyRatioSetting = id;
applySpeedSettings = id;
folderSheetShow = id;
helpForNetwork = id;
importFolderSheetShow = id;
incompleteFolderSheetShow = id;
resetWarnings = id;
setAutoImport = id;
setAutoSize = id;
setAutoSpeedLimit = id;
setBadge = id;
setDownloadLocation = id;
setGlobalLimit = id;
setNat = id;
setPort = id;
setQueue = id;
setQueueNumber = id;
setRatioStop = id;
setSound = id;
setSpeedLimit = id;
setStalled = id;
setStalledMinutes = id;
setUpdate = id;
};
CLASS = PrefsController;
LANGUAGE = ObjC;
OUTLETS = {
fBandwidthView = NSView;
fDownloadField = NSTextField;
fDownloadSoundPopUp = NSPopUpButton;
fFolderPopUp = NSPopUpButton;
fGeneralView = NSView;
fImportFolderPopUp = NSPopUpButton;
fIncompleteFolderPopUp = NSPopUpButton;
fNatCheck = NSButton;
fNatStatusField = NSTextField;
fNatStatusImage = NSImageView;
fNetworkView = NSView;
fPortField = NSTextField;
fPortStatusField = NSTextField;
fPortStatusImage = NSImageView;
fPortStatusProgress = NSProgressIndicator;
fQueueDownloadField = NSTextField;
fQueueSeedField = NSTextField;
fRatioStopField = NSTextField;
fSeedingSoundPopUp = NSPopUpButton;
fSpeedLimitDownloadField = NSTextField;
fSpeedLimitUploadField = NSTextField;
fStalledField = NSTextField;
fTransfersView = NSView;
fUpdatePopUp = NSPopUpButton;
fUploadField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = PrefsWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; },
{
ACTIONS = {checkForUpdates = id; };
CLASS = SUUpdater;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
},
{
CLASS = TorrentTableView;
LANGUAGE = ObjC;
OUTLETS = {fContextNoRow = NSMenu; fContextRow = NSMenu; fController = Controller; };
SUPERCLASS = NSTableView;
}
);
IBVersion = 1;
}

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>690 102 356 240 0 0 1440 878 </string>
<key>IBEditorPositions</key>
<dict>
<key>153</key>
<string>531 187 563 267 0 0 1440 878 </string>
<key>28</key>
<string>821 425 563 319 0 0 1440 878 </string>
<key>41</key>
<string>440 355 563 317 0 0 1440 878 </string>
<key>66</key>
<string>440 514 563 144 0 0 1440 878 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBLockedTabItems</key>
<array>
<integer>253</integer>
</array>
<key>IBSystem Version</key>
<string>8R2218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,18 @@
{
IBClasses = (
{
ACTIONS = {hideLicense = id; showLicense = id; };
CLASS = AboutWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fLicenseSheet = NSPanel;
fLicenseView = NSTextView;
fTextView = NSTextView;
fVersionField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
);
IBVersion = 1;
}

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>27 115 356 240 0 0 1600 1002 </string>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBOpenObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBSystem Version</key>
<string>8R218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,30 @@
{
IBClasses = (
{
ACTIONS = {
cancelCreateProgress = id;
cancelCreateWindow = id;
create = id;
setLocation = id;
};
CLASS = CreatorWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fCommentView = NSTextView;
fIconView = NSImageView;
fLocationField = NSTextField;
fNameField = NSTextField;
fOpenCheck = NSButton;
fPiecesField = NSTextField;
fPrivateCheck = NSButton;
fProgressIndicator = NSProgressIndicator;
fProgressView = NSView;
fStatusField = NSTextField;
fTrackerField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
);
IBVersion = 1;
}

21
macosx/Greek.lproj/Creator.nib/info.nib generated Normal file
View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>81 77 356 240 0 0 1600 1002 </string>
<key>IBEditorPositions</key>
<dict>
<key>56</key>
<string>2 579 368 126 0 0 1600 1002 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBOpenObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBSystem Version</key>
<string>8R218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,4 @@
/* Localized versions of Info.plist keys */
CFBundleName = "Transmission";
NSHumanReadableCopyright = "Copyright 2005-2007 The Transmission Project";

View File

@ -0,0 +1,88 @@
{
IBClasses = (
{CLASS = FileOutlineView; LANGUAGE = ObjC; SUPERCLASS = NSOutlineView; },
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{CLASS = InfoWindow; LANGUAGE = ObjC; SUPERCLASS = NSPanel; },
{
ACTIONS = {
revealDataFile = id;
revealFile = id;
revealTorrentFile = id;
setCheck = id;
setOnlySelectedCheck = id;
setPex = id;
setPiecesView = id;
setPriority = id;
setRatioLimit = id;
setRatioSetting = id;
setSpeedLimit = id;
setSpeedMode = id;
};
CLASS = InfoWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fCommentView = NSTextView;
fCompletedFromTrackerField = NSTextField;
fConnectedPeersField = NSTextField;
fCreatorField = NSTextField;
fDataLocationField = NSTextField;
fDateActivityField = NSTextField;
fDateAddedField = NSTextField;
fDateCompletedField = NSTextField;
fDateCreatedField = NSTextField;
fDownloadLimitField = NSTextField;
fDownloadLimitLabel = NSTextField;
fDownloadLimitPopUp = NSPopUpButton;
fDownloadedTotalField = NSTextField;
fDownloadedValidField = NSTextField;
fDownloadingFromField = NSTextField;
fErrorMessageView = NSTextView;
fFileCheckItem = NSMenuItem;
fFileOutline = FileOutlineView;
fFilePriorityHigh = NSMenuItem;
fFilePriorityLow = NSMenuItem;
fFilePriorityNormal = NSMenuItem;
fFileTableStatusField = NSTextField;
fFileUncheckItem = NSMenuItem;
fHashField = NSTextField;
fImageView = NSImageView;
fLeechersField = NSTextField;
fNameField = NSTextField;
fPeerTable = NSTableView;
fPexCheck = NSButton;
fPiecesControl = NSSegmentedControl;
fPiecesField = NSTextField;
fPiecesView = PiecesView;
fProgressField = NSTextField;
fRatioField = NSTextField;
fRatioLimitField = NSTextField;
fRatioPopUp = NSPopUpButton;
fRevealDataButton = NSButton;
fRevealTorrentButton = NSButton;
fSecureField = NSTextField;
fSeedersField = NSTextField;
fSizeField = NSTextField;
fStateField = NSTextField;
fSwarmSpeedField = NSTextField;
fTabView = NSTabView;
fTorrentLocationField = NSTextField;
fTrackerField = NSTextField;
fUploadLimitField = NSTextField;
fUploadLimitLabel = NSTextField;
fUploadLimitPopUp = NSPopUpButton;
fUploadedTotalField = NSTextField;
fUploadingToField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = NSLevelIndicatorCell; LANGUAGE = ObjC; SUPERCLASS = NSActionCell; },
{CLASS = NSSegmentedControl; LANGUAGE = ObjC; SUPERCLASS = NSControl; },
{
CLASS = PeerProgressIndicatorCell;
LANGUAGE = ObjC;
SUPERCLASS = NSLevelIndicatorCell;
},
{CLASS = PiecesView; LANGUAGE = ObjC; SUPERCLASS = NSImageView; }
);
IBVersion = 1;
}

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>3 464 356 240 0 0 1600 1002 </string>
<key>IBEditorPositions</key>
<dict>
<key>549</key>
<string>368 553 258 149 0 0 1600 1002 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBLockedObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBLockedTabItems</key>
<array>
<integer>332</integer>
</array>
<key>IBSystem Version</key>
<string>8R218</string>
</dict>
</plist>

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,186 @@
{
IBClasses = (
{CLASS = ActionPopUpButton; LANGUAGE = ObjC; SUPERCLASS = NSPopUpButton; },
{
ACTIONS = {
announceSelectedTorrents = id;
applyFilter = id;
applySpeedLimit = id;
copyTorrentFiles = id;
createFile = id;
doNothing = id;
linkForums = id;
linkHomepage = id;
moveDataFiles = id;
openShowSheet = id;
openURLCancelEndSheet = id;
openURLEndSheet = id;
openURLShowSheet = id;
removeDeleteData = id;
removeDeleteDataAndTorrent = id;
removeDeleteTorrent = id;
removeNoDelete = id;
resetCacheForSelectedTorrents = id;
resumeAllTorrents = id;
resumeSelectedTorrents = id;
resumeSelectedTorrentsNoWait = id;
resumeWaitingTorrents = id;
revealFile = id;
setFilter = id;
setInfoTab = id;
setLimitGlobalEnabled = id;
setQuickLimitGlobal = id;
setQuickRatioGlobal = id;
setSort = id;
setSortReverse = id;
showAboutWindow = id;
showInfo = id;
showMainWindow = id;
showMessageWindow = id;
showPreferenceWindow = id;
stopAllTorrents = id;
stopSelectedTorrents = id;
switchFilter = id;
toggleAdvancedBar = id;
toggleFilterBar = id;
toggleSmallView = id;
toggleSpeedLimit = id;
toggleStatusBar = id;
};
CLASS = Controller;
LANGUAGE = ObjC;
OUTLETS = {
fActionButton = NSButton;
fBottomBar = ImageBackgroundView;
fDateSortActionItem = NSMenuItem;
fDateSortItem = NSMenuItem;
fDockMenu = NSMenu;
fDownloadFilterButton = FilterBarButton;
fDownloadLimitItem = NSMenuItem;
fDownloadMenu = NSMenu;
fDownloadNoLimitItem = NSMenuItem;
fFilterBar = FilterBarView;
fNameSortActionItem = NSMenuItem;
fNameSortItem = NSMenuItem;
fNextFilterItem = NSMenuItem;
fNextInfoTabItem = NSMenuItem;
fNoFilterButton = FilterBarButton;
fOpenIgnoreDownloadFolder = NSMenuItem;
fOrderSortActionItem = NSMenuItem;
fOrderSortItem = NSMenuItem;
fPauseFilterButton = FilterBarButton;
fPrevFilterItem = NSMenuItem;
fPrevInfoTabItem = NSMenuItem;
fProgressSortActionItem = NSMenuItem;
fProgressSortItem = NSMenuItem;
fScrollView = NSScrollView;
fSearchFilterField = NSSearchField;
fSeedFilterButton = FilterBarButton;
fSpeedLimitButton = NSButton;
fStateSortActionItem = NSMenuItem;
fStateSortItem = NSMenuItem;
fStatusBar = ImageBackgroundView;
fTableView = TorrentTableView;
fTotalDLField = NSTextField;
fTotalTorrentsField = NSTextField;
fTotalULField = NSTextField;
fURLSheetTextField = NSTextField;
fURLSheetWindow = NSWindow;
fUpdater = SUUpdater;
fUploadLimitItem = NSMenuItem;
fUploadMenu = NSMenu;
fUploadNoLimitItem = NSMenuItem;
fWindow = NSWindow;
};
SUPERCLASS = NSObject;
},
{CLASS = FilterBarButton; LANGUAGE = ObjC; SUPERCLASS = NSButton; },
{
CLASS = FilterBarView;
LANGUAGE = ObjC;
OUTLETS = {
fDownloadFilterButton = FilterBarButton;
fNoFilterButton = FilterBarButton;
fPauseFilterButton = FilterBarButton;
fSeedFilterButton = FilterBarButton;
};
SUPERCLASS = ImageBackgroundView;
},
{
ACTIONS = {deselectAll = id; revealFile = id; setNextTab = id; setPreviousTab = id; };
CLASS = FirstResponder;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
},
{CLASS = ImageBackgroundView; LANGUAGE = ObjC; SUPERCLASS = NSView; },
{CLASS = NSSegmentedControl; LANGUAGE = ObjC; SUPERCLASS = NSControl; },
{CLASS = NameCell; LANGUAGE = ObjC; SUPERCLASS = NSCell; },
{
ACTIONS = {
folderSheetShow = id;
setAutoStart = id;
setBadge = id;
setDownloadLocation = id;
setLimit = id;
setLimitCheck = id;
setLimitMenu = id;
setPort = id;
setQuickRatio = id;
setQuickSpeed = id;
setRatio = id;
setRatioCheck = id;
setRatioMenu = id;
setShowMessage = id;
setUpdate = id;
};
CLASS = PrefsController;
LANGUAGE = ObjC;
OUTLETS = {
fAutoStartCheck = NSButton;
fBadgeDownloadRateCheck = NSButton;
fBadgeUploadRateCheck = NSButton;
fBlankView = NSView;
fDownloadCheck = NSButton;
fDownloadField = NSTextField;
fDownloadLimitItem = NSMenuItem;
fDownloadMenu = NSMenu;
fDownloadNoLimitItem = NSMenuItem;
fFolderPopUp = NSPopUpButton;
fGeneralView = NSView;
fNetworkView = NSView;
fPortField = NSTextField;
fPrefsWindow = NSPanel;
fQuitCheck = NSButton;
fRatioCheck = NSButton;
fRatioField = NSTextField;
fRatioNotSetItem = NSMenuItem;
fRatioSetItem = NSMenuItem;
fRemoveCheck = NSButton;
fTransfersView = NSView;
fUpdatePopUp = NSPopUpButton;
fUpdater = SUUpdater;
fUploadCheck = NSButton;
fUploadField = NSTextField;
fUploadLimitItem = NSMenuItem;
fUploadMenu = NSMenu;
fUploadNoLimitItem = NSMenuItem;
fWindow = NSWindow;
};
SUPERCLASS = NSObject;
},
{CLASS = ProgressCell; LANGUAGE = ObjC; SUPERCLASS = NSCell; },
{
ACTIONS = {checkForUpdates = id; };
CLASS = SUUpdater;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
},
{
CLASS = TorrentTableView;
LANGUAGE = ObjC;
OUTLETS = {fContextNoRow = NSMenu; fContextRow = NSMenu; fController = Controller; };
SUPERCLASS = NSTableView;
}
);
IBVersion = 1;
}

35
macosx/Greek.lproj/MainMenu.nib/info.nib generated Normal file
View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>6 212 356 438 0 0 1600 1002 </string>
<key>IBEditorPositions</key>
<dict>
<key>1041</key>
<string>518 760 308 149 0 0 1600 1002 </string>
<key>1480</key>
<string>12 552 420 63 0 0 1600 1002 </string>
<key>1603</key>
<string>553 634 477 67 0 0 1600 1002 </string>
<key>29</key>
<string>8 958 639 44 0 0 1600 1002 </string>
<key>456</key>
<string>360 777 356 225 0 0 1600 1002 </string>
<key>581</key>
<string>363 903 167 99 0 0 1600 1002 </string>
<key>589</key>
<string>362 896 249 106 0 0 1600 1002 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBLockedObjects</key>
<array>
<integer>21</integer>
</array>
<key>IBOldestOS</key>
<integer>3</integer>
<key>IBSystem Version</key>
<string>8R218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,19 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {changeLevel = id; clearLog = id; writeToFile = id; };
CLASS = MessageWindowController;
LANGUAGE = ObjC;
OUTLETS = {
fDebugWarningField = NSTextField;
fDebugWarningIcon = NSImageView;
fLevelButton = NSPopUpButton;
fScrollView = NSScrollView;
fTextView = NSTextView;
};
SUPERCLASS = NSWindowController;
}
);
IBVersion = 1;
}

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>1 461 356 240 0 0 1600 1002 </string>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBOpenObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBSystem Version</key>
<string>8R218</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,78 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{CLASS = MenuButton; LANGUAGE = ObjC; SUPERCLASS = NSButton; },
{CLASS = NSDatePicker; LANGUAGE = ObjC; SUPERCLASS = NSControl; },
{
ACTIONS = {
applyRatioSetting = id;
applySpeedSettings = id;
folderSheetShow = id;
helpForNetwork = id;
importFolderSheetShow = id;
incompleteFolderSheetShow = id;
resetWarnings = id;
setAutoImport = id;
setAutoSize = id;
setAutoSpeedLimit = id;
setBadge = id;
setDownloadLocation = id;
setGlobalLimit = id;
setNat = id;
setPort = id;
setQueue = id;
setQueueNumber = id;
setRatioStop = id;
setSound = id;
setSpeedLimit = id;
setStalled = id;
setStalledMinutes = id;
setUpdate = id;
};
CLASS = PrefsController;
LANGUAGE = ObjC;
OUTLETS = {
fBandwidthView = NSView;
fDownloadField = NSTextField;
fDownloadSoundPopUp = NSPopUpButton;
fFolderPopUp = NSPopUpButton;
fGeneralView = NSView;
fImportFolderPopUp = NSPopUpButton;
fIncompleteFolderPopUp = NSPopUpButton;
fNatCheck = NSButton;
fNatStatusField = NSTextField;
fNatStatusImage = NSImageView;
fNetworkView = NSView;
fPortField = NSTextField;
fPortStatusField = NSTextField;
fPortStatusImage = NSImageView;
fPortStatusProgress = NSProgressIndicator;
fQueueDownloadField = NSTextField;
fQueueSeedField = NSTextField;
fRatioStopField = NSTextField;
fSeedingSoundPopUp = NSPopUpButton;
fSpeedLimitDownloadField = NSTextField;
fSpeedLimitUploadField = NSTextField;
fStalledField = NSTextField;
fTransfersView = NSView;
fUpdatePopUp = NSPopUpButton;
fUploadField = NSTextField;
};
SUPERCLASS = NSWindowController;
},
{CLASS = PrefsWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; },
{
ACTIONS = {checkForUpdates = id; };
CLASS = SUUpdater;
LANGUAGE = ObjC;
SUPERCLASS = NSObject;
},
{
CLASS = TorrentTableView;
LANGUAGE = ObjC;
OUTLETS = {fContextNoRow = NSMenu; fContextRow = NSMenu; fController = Controller; };
SUPERCLASS = NSTableView;
}
);
IBVersion = 1;
}

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>5 407 356 286 0 0 1600 1002 </string>
<key>IBEditorPositions</key>
<dict>
<key>153</key>
<string>510 534 563 268 0 0 1600 1002 </string>
<key>28</key>
<string>78 381 563 313 0 0 1600 1002 </string>
<key>41</key>
<string>510 515 563 305 0 0 1600 1002 </string>
<key>66</key>
<string>510 596 563 144 0 0 1600 1002 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBLockedTabItems</key>
<array>
<integer>253</integer>
</array>
<key>IBOpenObjects</key>
<array>
<integer>153</integer>
</array>
<key>IBSystem Version</key>
<string>8R218</string>
</dict>
</plist>

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More