~ubuntu-branches/ubuntu/maverick/transmission/maverick

« back to all changes in this revision

Viewing changes to macosx/InfoWindowController.m

  • Committer: Bazaar Package Importer
  • Author(s): Krzysztof Klimonda
  • Date: 2009-05-22 21:57:30 UTC
  • mfrom: (1.2.2 upstream)
  • mto: (2.1.18 sid) (1.3.8 upstream)
  • mto: This revision was merged to the branch mainline in revision 36.
  • Revision ID: james.westby@ubuntu.com-20090522215730-ly5kgv5aw9ig2u82
Tags: upstream-1.61
ImportĀ upstreamĀ versionĀ 1.61

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/******************************************************************************
2
 
 * $Id: InfoWindowController.m 7016 2008-11-02 01:07:01Z livings124 $
 
2
 * $Id: InfoWindowController.m 8261 2009-04-20 03:36:35Z livings124 $
3
3
 *
4
 
 * Copyright (c) 2006-2008 Transmission authors and contributors
 
4
 * Copyright (c) 2006-2009 Transmission authors and contributors
5
5
 *
6
6
 * Permission is hereby granted, free of charge, to any person obtaining a
7
7
 * copy of this software and associated documentation files (the "Software"),
28
28
#import "FileOutlineView.h"
29
29
#import "FileOutlineController.h"
30
30
#import "FileListNode.h"
 
31
#import "PeerProgressIndicatorCell.h"
31
32
#import "TrackerTableView.h"
32
33
#import "PiecesView.h"
33
34
#import "QuickLookController.h"
34
 
#import "NSApplicationAdditions.h"
35
35
#import "NSStringAdditions.h"
36
36
#include "utils.h" //tr_getRatio()
37
37
 
51
51
#define OPTION_POPUP_NO_LIMIT 1
52
52
#define OPTION_POPUP_LIMIT 2
53
53
 
 
54
#define OPTION_POPUP_PRIORITY_HIGH 0
 
55
#define OPTION_POPUP_PRIORITY_NORMAL 1
 
56
#define OPTION_POPUP_PRIORITY_LOW 2
 
57
 
54
58
#define INVALID -99
55
59
 
56
60
#define TRACKER_ADD_TAG 0
166
170
                                            sortDescriptorPrototype]]];
167
171
    
168
172
    //set table header tool tips
169
 
    if ([NSApp isOnLeopardOrBetter])
170
 
    {
171
 
        [[fPeerTable tableColumnWithIdentifier: @"Encryption"] setHeaderToolTip: NSLocalizedString(@"Encrypted Connection",
172
 
                                                                            "inspector -> peer table -> header tool tip")];
173
 
        [[fPeerTable tableColumnWithIdentifier: @"Progress"] setHeaderToolTip: NSLocalizedString(@"Available",
174
 
                                                                            "inspector -> peer table -> header tool tip")];
175
 
        [[fPeerTable tableColumnWithIdentifier: @"UL To"] setHeaderToolTip: NSLocalizedString(@"Uploading To Peer",
176
 
                                                                            "inspector -> peer table -> header tool tip")];
177
 
        [[fPeerTable tableColumnWithIdentifier: @"DL From"] setHeaderToolTip: NSLocalizedString(@"Downloading From Peer",
178
 
                                                                            "inspector -> peer table -> header tool tip")];
179
 
        
180
 
        [[fWebSeedTable tableColumnWithIdentifier: @"DL From"] setHeaderToolTip: NSLocalizedString(@"Downloading From Web Seed",
181
 
                                                                            "inspector -> web seed table -> header tool tip")];
182
 
    }
183
 
    else
184
 
    {
185
 
        [fTrackerAddRemoveControl sizeToFit];
186
 
        [fTrackerAddRemoveControl setLabel: @"+" forSegment: TRACKER_ADD_TAG];
187
 
        [fTrackerAddRemoveControl setLabel: @"-" forSegment: TRACKER_REMOVE_TAG];
188
 
    }
 
173
    [[fPeerTable tableColumnWithIdentifier: @"Encryption"] setHeaderToolTip: NSLocalizedString(@"Encrypted Connection",
 
174
                                                                        "inspector -> peer table -> header tool tip")];
 
175
    [[fPeerTable tableColumnWithIdentifier: @"Progress"] setHeaderToolTip: NSLocalizedString(@"Available",
 
176
                                                                        "inspector -> peer table -> header tool tip")];
 
177
    [[fPeerTable tableColumnWithIdentifier: @"UL To"] setHeaderToolTip: NSLocalizedString(@"Uploading To Peer",
 
178
                                                                        "inspector -> peer table -> header tool tip")];
 
179
    [[fPeerTable tableColumnWithIdentifier: @"DL From"] setHeaderToolTip: NSLocalizedString(@"Downloading From Peer",
 
180
                                                                        "inspector -> peer table -> header tool tip")];
 
181
    
 
182
    [[fWebSeedTable tableColumnWithIdentifier: @"DL From"] setHeaderToolTip: NSLocalizedString(@"Downloading From Web Seed",
 
183
                                                                        "inspector -> web seed table -> header tool tip")];
189
184
    
190
185
    //prepare for animating peer table and web seed table
191
186
    NSRect webSeedTableFrame = [[fWebSeedTable enclosingScrollView] frame];
247
242
    {
248
243
        if (numberSelected > 0)
249
244
        {
250
 
            [fImageView setImage: [NSImage imageNamed: [NSApp isOnLeopardOrBetter]
251
 
                                    ? NSImageNameMultipleDocuments : @"NSApplicationIcon"]];
 
245
            [fImageView setImage: [NSImage imageNamed: NSImageNameMultipleDocuments]];
252
246
            
253
247
            [fNameField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%d Torrents Selected",
254
248
                                            "Inspector -> selected torrents"), numberSelected]];
255
249
        
256
250
            uint64_t size = 0;
257
251
            NSInteger fileCount = 0;
258
 
            NSEnumerator * enumerator = [torrents objectEnumerator];
259
 
            Torrent * torrent;
260
 
            while ((torrent = [enumerator nextObject]))
 
252
            for (Torrent * torrent in torrents)
261
253
            {
262
254
                size += [torrent size];
263
255
                fileCount += [torrent fileCount];
286
278
            [fRatioField setStringValue: @""];
287
279
            
288
280
            //options fields
289
 
            [fUploadLimitPopUp setEnabled: NO];
290
 
            [fUploadLimitPopUp selectItemAtIndex: -1];
291
 
            [fUploadLimitField setHidden: YES];
292
 
            [fUploadLimitLabel setHidden: YES];
 
281
            [fUploadLimitCheck setEnabled: NO];
 
282
            [fUploadLimitCheck setState: NSOffState];
 
283
            [fUploadLimitField setEnabled: NO];
 
284
            [fUploadLimitLabel setEnabled: NO];
293
285
            [fUploadLimitField setStringValue: @""];
294
286
            
295
 
            [fDownloadLimitPopUp setEnabled: NO];
296
 
            [fDownloadLimitPopUp selectItemAtIndex: -1];
297
 
            [fDownloadLimitField setHidden: YES];
298
 
            [fDownloadLimitLabel setHidden: YES];
 
287
            [fDownloadLimitCheck setEnabled: NO];
 
288
            [fDownloadLimitCheck setState: NSOffState];
 
289
            [fDownloadLimitField setEnabled: NO];
 
290
            [fDownloadLimitLabel setEnabled: NO];
299
291
            [fDownloadLimitField setStringValue: @""];
300
292
            
 
293
            [fGlobalLimitCheck setEnabled: NO];
 
294
            [fGlobalLimitCheck setState: NSOffState];
 
295
            
 
296
            [fPriorityPopUp setEnabled: NO];
 
297
            [fPriorityPopUp selectItemAtIndex: -1];
 
298
            
301
299
            [fRatioPopUp setEnabled: NO];
302
300
            [fRatioPopUp selectItemAtIndex: -1];
303
301
            [fRatioLimitField setHidden: YES];
393
391
        
394
392
        [fTrackerAddRemoveControl setEnabled: NO forSegment: TRACKER_ADD_TAG];
395
393
        [fTrackerAddRemoveControl setEnabled: NO forSegment: TRACKER_REMOVE_TAG];
 
394
        
 
395
        [fFileFilterField setEnabled: NO];
396
396
    }
397
397
    else
398
398
    {
491
491
        
492
492
        [fTrackerAddRemoveControl setEnabled: YES forSegment: TRACKER_ADD_TAG];
493
493
        [fTrackerAddRemoveControl setEnabled: NO forSegment: TRACKER_REMOVE_TAG];
 
494
        
 
495
        [fFileFilterField setEnabled: [torrent isFolder]];
494
496
    }
495
497
    
 
498
    [fFileFilterField setStringValue: @""];
 
499
    
496
500
    //update stats and settings
497
501
    [self updateInfoStats];
498
502
    [self updateOptions];
533
537
    NSEnumerator * enumerator = [fTorrents objectEnumerator];
534
538
    Torrent * torrent = [enumerator nextObject]; //first torrent
535
539
    
536
 
    NSInteger uploadSpeedMode = [torrent speedMode: YES],
 
540
    NSInteger uploadUseSpeedLimit = [torrent usesSpeedLimit: YES] ? NSOnState : NSOffState,
537
541
                uploadSpeedLimit = [torrent speedLimit: YES],
538
 
                downloadSpeedMode = [torrent speedMode: NO],
539
 
                downloadSpeedLimit = [torrent speedLimit: NO];
 
542
                downloadUseSpeedLimit = [torrent usesSpeedLimit: NO] ? NSOnState : NSOffState,
 
543
                downloadSpeedLimit = [torrent speedLimit: NO],
 
544
                globalUseSpeedLimit = [torrent usesGlobalSpeedLimit] ? NSOnState : NSOffState;
540
545
    
541
546
    while ((torrent = [enumerator nextObject])
542
 
            && (uploadSpeedMode != INVALID || uploadSpeedLimit != INVALID
543
 
                || downloadSpeedMode != INVALID || downloadSpeedLimit != INVALID))
 
547
            && (uploadUseSpeedLimit != NSMixedState || uploadSpeedLimit != INVALID
 
548
                || downloadUseSpeedLimit != NSMixedState || downloadSpeedLimit != INVALID
 
549
                || globalUseSpeedLimit != NSMixedState))
544
550
    {
545
 
        if (uploadSpeedMode != INVALID && uploadSpeedMode != [torrent speedMode: YES])
546
 
            uploadSpeedMode = INVALID;
 
551
        if (uploadUseSpeedLimit != NSMixedState && uploadUseSpeedLimit != ([torrent usesSpeedLimit: YES] ? NSOnState : NSOffState))
 
552
            uploadUseSpeedLimit = NSMixedState;
547
553
        
548
554
        if (uploadSpeedLimit != INVALID && uploadSpeedLimit != [torrent speedLimit: YES])
549
555
            uploadSpeedLimit = INVALID;
550
556
        
551
 
        if (downloadSpeedMode != INVALID && downloadSpeedMode != [torrent speedMode: NO])
552
 
            downloadSpeedMode = INVALID;
 
557
        if (downloadUseSpeedLimit != NSMixedState && downloadUseSpeedLimit != ([torrent usesSpeedLimit: NO] ? NSOnState : NSOffState))
 
558
            downloadUseSpeedLimit = NSMixedState;
553
559
        
554
560
        if (downloadSpeedLimit != INVALID && downloadSpeedLimit != [torrent speedLimit: NO])
555
561
            downloadSpeedLimit = INVALID;
 
562
        
 
563
        if (globalUseSpeedLimit != NSMixedState && globalUseSpeedLimit != ([torrent usesGlobalSpeedLimit] ? NSOnState : NSOffState))
 
564
            globalUseSpeedLimit = NSMixedState;
556
565
    }
557
566
    
558
567
    //set upload view
559
 
    NSInteger index;
560
 
    if (uploadSpeedMode == TR_SPEEDLIMIT_SINGLE)
561
 
        index = OPTION_POPUP_LIMIT;
562
 
    else if (uploadSpeedMode == TR_SPEEDLIMIT_UNLIMITED)
563
 
        index = OPTION_POPUP_NO_LIMIT;
564
 
    else if (uploadSpeedMode == TR_SPEEDLIMIT_GLOBAL)
565
 
        index = OPTION_POPUP_GLOBAL;
566
 
    else
567
 
        index = -1;
568
 
    [fUploadLimitPopUp selectItemAtIndex: index];
569
 
    [fUploadLimitPopUp setEnabled: YES];
 
568
    [fUploadLimitCheck setState: uploadUseSpeedLimit];
 
569
    [fUploadLimitCheck setEnabled: YES];
570
570
    
571
 
    [fUploadLimitLabel setHidden: uploadSpeedMode != TR_SPEEDLIMIT_SINGLE];
572
 
    [fUploadLimitField setHidden: uploadSpeedMode != TR_SPEEDLIMIT_SINGLE];
 
571
    [fUploadLimitLabel setEnabled: uploadUseSpeedLimit == NSOnState];
 
572
    [fUploadLimitField setEnabled: uploadUseSpeedLimit == NSOnState];
573
573
    if (uploadSpeedLimit != INVALID)
574
574
        [fUploadLimitField setIntValue: uploadSpeedLimit];
575
575
    else
576
576
        [fUploadLimitField setStringValue: @""];
577
577
    
578
578
    //set download view
579
 
    if (downloadSpeedMode == TR_SPEEDLIMIT_SINGLE)
580
 
        index = OPTION_POPUP_LIMIT;
581
 
    else if (downloadSpeedMode == TR_SPEEDLIMIT_UNLIMITED)
582
 
        index = OPTION_POPUP_NO_LIMIT;
583
 
    else if (downloadSpeedMode == TR_SPEEDLIMIT_GLOBAL)
584
 
        index = OPTION_POPUP_GLOBAL;
585
 
    else
586
 
        index = -1;
587
 
    [fDownloadLimitPopUp selectItemAtIndex: index];
588
 
    [fDownloadLimitPopUp setEnabled: YES];
 
579
    [fDownloadLimitCheck setState: downloadUseSpeedLimit];
 
580
    [fDownloadLimitCheck setEnabled: YES];
589
581
    
590
 
    [fDownloadLimitLabel setHidden: downloadSpeedMode != TR_SPEEDLIMIT_SINGLE];
591
 
    [fDownloadLimitField setHidden: downloadSpeedMode != TR_SPEEDLIMIT_SINGLE];
 
582
    [fDownloadLimitLabel setEnabled: downloadUseSpeedLimit == NSOnState];
 
583
    [fDownloadLimitField setEnabled: downloadUseSpeedLimit == NSOnState];
592
584
    if (downloadSpeedLimit != INVALID)
593
585
        [fDownloadLimitField setIntValue: downloadSpeedLimit];
594
586
    else
595
587
        [fDownloadLimitField setStringValue: @""];
596
588
    
 
589
    //set global check
 
590
    [fGlobalLimitCheck setState: globalUseSpeedLimit];
 
591
    [fGlobalLimitCheck setEnabled: YES];
 
592
    
597
593
    //get ratio info
598
594
    enumerator = [fTorrents objectEnumerator];
599
595
    torrent = [enumerator nextObject]; //first torrent
601
597
    NSInteger checkRatio = [torrent ratioSetting];
602
598
    CGFloat ratioLimit = [torrent ratioLimit];
603
599
    
604
 
    while ((torrent = [enumerator nextObject]) && (checkRatio != INVALID || checkRatio != INVALID))
 
600
    while ((torrent = [enumerator nextObject]) && (checkRatio != INVALID || ratioLimit != INVALID))
605
601
    {
606
602
        if (checkRatio != INVALID && checkRatio != [torrent ratioSetting])
607
603
            checkRatio = INVALID;
611
607
    }
612
608
    
613
609
    //set ratio view
614
 
    if (checkRatio == NSOnState)
 
610
    NSInteger index;
 
611
    if (checkRatio == TR_RATIOLIMIT_SINGLE)
615
612
        index = OPTION_POPUP_LIMIT;
616
 
    else if (checkRatio == NSOffState)
 
613
    else if (checkRatio == TR_RATIOLIMIT_UNLIMITED)
617
614
        index = OPTION_POPUP_NO_LIMIT;
618
 
    else if (checkRatio == NSMixedState)
 
615
    else if (checkRatio == TR_RATIOLIMIT_GLOBAL)
619
616
        index = OPTION_POPUP_GLOBAL;
620
617
    else
621
618
        index = -1;
622
619
    [fRatioPopUp selectItemAtIndex: index];
623
620
    [fRatioPopUp setEnabled: YES];
624
621
    
625
 
    [fRatioLimitField setHidden: checkRatio != NSOnState];
 
622
    [fRatioLimitField setHidden: checkRatio != TR_RATIOLIMIT_SINGLE];
626
623
    if (ratioLimit != INVALID)
627
624
        [fRatioLimitField setFloatValue: ratioLimit];
628
625
    else
629
626
        [fRatioLimitField setStringValue: @""];
630
627
    
 
628
    //get priority info
 
629
    enumerator = [fTorrents objectEnumerator];
 
630
    torrent = [enumerator nextObject]; //first torrent
 
631
    
 
632
    NSInteger priority = [torrent priority];
 
633
    
 
634
    while ((torrent = [enumerator nextObject]) && priority != INVALID)
 
635
    {
 
636
        if (priority != INVALID && priority != [torrent priority])
 
637
            priority = INVALID;
 
638
    }
 
639
    
 
640
    //set priority view
 
641
    if (priority == TR_PRI_HIGH)
 
642
        index = OPTION_POPUP_PRIORITY_HIGH;
 
643
    else if (priority == TR_PRI_NORMAL)
 
644
        index = OPTION_POPUP_PRIORITY_NORMAL;
 
645
    else if (priority == TR_PRI_LOW)
 
646
        index = OPTION_POPUP_PRIORITY_LOW;
 
647
    else
 
648
        index = -1;
 
649
    [fPriorityPopUp selectItemAtIndex: index];
 
650
    [fPriorityPopUp setEnabled: YES];
 
651
    
631
652
    //get peer info
632
653
    enumerator = [fTorrents objectEnumerator];
633
654
    torrent = [enumerator nextObject]; //first torrent
910
931
    return nil;
911
932
}
912
933
 
 
934
- (void) tableView: (NSTableView *) tableView willDisplayCell: (id) cell forTableColumn: (NSTableColumn *) tableColumn
 
935
    row: (NSInteger) row
 
936
{
 
937
    if (tableView == fPeerTable)
 
938
    {
 
939
        NSString * ident = [tableColumn identifier];
 
940
        
 
941
        if  ([ident isEqualToString: @"Progress"])
 
942
        {
 
943
            NSDictionary * peer = [fPeers objectAtIndex: row];
 
944
            [(PeerProgressIndicatorCell *)cell setSeed: [[peer objectForKey: @"Seed"] boolValue]];
 
945
        }
 
946
    }
 
947
}
 
948
 
913
949
- (void) tableView: (NSTableView *) tableView didClickTableColumn: (NSTableColumn *) tableColumn
914
950
{
915
951
    if (tableView == fPeerTable)
964
1000
        NSDictionary * peer = [fPeers objectAtIndex: row];
965
1001
        NSMutableArray * components = [NSMutableArray arrayWithCapacity: 5];
966
1002
        
967
 
        [components addObject: [NSString localizedStringWithFormat: NSLocalizedString(@"Progress: %.1f%%",
968
 
            "Inspector -> Peers tab -> table row tooltip"), [[peer objectForKey: @"Progress"] floatValue] * 100.0]];
 
1003
        CGFloat progress = [[peer objectForKey: @"Progress"] floatValue];
 
1004
        NSString * progressString = [NSString localizedStringWithFormat: NSLocalizedString(@"Progress: %.1f%%",
 
1005
                                        "Inspector -> Peers tab -> table row tooltip"), progress * 100.0];
 
1006
        if (progress < 1.0 && [[peer objectForKey: @"Seed"] boolValue])
 
1007
            progressString = [progressString stringByAppendingFormat: @" (%@)", NSLocalizedString(@"Partial Seed",
 
1008
                                "Inspector -> Peers tab -> table row tooltip")];
 
1009
        [components addObject: progressString];
969
1010
        
970
1011
        if ([[peer objectForKey: @"Encryption"] boolValue])
971
1012
            [components addObject: NSLocalizedString(@"Encrypted Connection", "Inspector -> Peers tab -> table row tooltip")];
996
1037
        }
997
1038
        
998
1039
        //determing status strings from flags 
999
 
        NSMutableArray * statusArray = [NSMutableArray arrayWithCapacity: 3];
 
1040
        NSMutableArray * statusArray = [NSMutableArray arrayWithCapacity: 6];
1000
1041
        NSString * flags = [peer objectForKey: @"Flags"];
1001
1042
        
1002
1043
        if ([flags rangeOfString: @"D"].location != NSNotFound)
1003
1044
            [statusArray addObject: NSLocalizedString(@"Currently downloading (interested and not choked)",
1004
1045
                "Inspector -> peer -> status")];
1005
 
        else if ([flags rangeOfString: @"d"].location != NSNotFound)
 
1046
        if ([flags rangeOfString: @"d"].location != NSNotFound)
1006
1047
            [statusArray addObject: NSLocalizedString(@"You want to download, but peer does not want to send (interested and choked)",
1007
1048
                "Inspector -> peer -> status")];
1008
 
        else;
1009
 
        
1010
1049
        if ([flags rangeOfString: @"U"].location != NSNotFound)
1011
1050
            [statusArray addObject: NSLocalizedString(@"Currently uploading (interested and not choked)",
1012
1051
                "Inspector -> peer -> status")];
1013
 
        else if ([flags rangeOfString: @"u"].location != NSNotFound)
 
1052
        if ([flags rangeOfString: @"u"].location != NSNotFound)
1014
1053
            [statusArray addObject: NSLocalizedString(@"Peer wants you to upload, but you do not want to (interested and choked)",
1015
1054
                "Inspector -> peer -> status")];
1016
 
        else;
1017
 
        
1018
1055
        if ([flags rangeOfString: @"K"].location != NSNotFound)
1019
1056
            [statusArray addObject: NSLocalizedString(@"Peer is unchoking you, but you are not interested",
1020
1057
                "Inspector -> peer -> status")];
1021
 
        
1022
1058
        if ([flags rangeOfString: @"?"].location != NSNotFound)
1023
1059
            [statusArray addObject: NSLocalizedString(@"You unchoked the peer, but the peer is not interested",
1024
1060
                "Inspector -> peer -> status")];
1025
1061
        
1026
1062
        if ([statusArray count] > 0)
1027
 
            [components addObject: [@"\n" stringByAppendingString: [statusArray componentsJoinedByString: @"\n\n"]]];
 
1063
        {
 
1064
            NSString * statusStrings = [statusArray componentsJoinedByString: @"\n\n"];
 
1065
            [components addObject: [@"\n" stringByAppendingString: statusStrings]];
 
1066
        }
1028
1067
        
1029
1068
        return [components componentsJoinedByString: @"\n"];
1030
1069
    }
1164
1203
        [[fTorrents objectAtIndex: 0] revealData];
1165
1204
}
1166
1205
 
1167
 
- (void) setSpeedMode: (id) sender
1168
 
{
1169
 
    BOOL upload = sender == fUploadLimitPopUp;
1170
 
    NSInteger mode;
1171
 
    switch ([sender indexOfSelectedItem])
1172
 
    {
1173
 
        case OPTION_POPUP_LIMIT:
1174
 
            mode = TR_SPEEDLIMIT_SINGLE;
1175
 
            break;
1176
 
        case OPTION_POPUP_NO_LIMIT:
1177
 
            mode = TR_SPEEDLIMIT_UNLIMITED;
1178
 
            break;
1179
 
        case OPTION_POPUP_GLOBAL:
1180
 
            mode = TR_SPEEDLIMIT_GLOBAL;
1181
 
            break;
1182
 
        default:
1183
 
            return;
1184
 
    }
1185
 
    
1186
 
    Torrent * torrent;
1187
 
    NSEnumerator * enumerator = [fTorrents objectEnumerator];
1188
 
    while ((torrent = [enumerator nextObject]))
1189
 
        [torrent setSpeedMode: mode upload: upload];
 
1206
- (void) setFileFilterText: (id) sender
 
1207
{
 
1208
    [fFileController setFilterText: [sender stringValue]];
 
1209
}
 
1210
 
 
1211
- (void) setUseSpeedLimit: (id) sender
 
1212
{
 
1213
    const BOOL upload = sender == fUploadLimitCheck;
 
1214
    
 
1215
    if ([sender state] == NSMixedState)
 
1216
        [sender setState: NSOnState];
 
1217
    const BOOL limit = [sender state] == NSOnState;
 
1218
    
 
1219
    for (Torrent * torrent in fTorrents)
 
1220
        [torrent setUseSpeedLimit: limit upload: upload];
1190
1221
    
1191
1222
    NSTextField * field = upload ? fUploadLimitField : fDownloadLimitField;
1192
 
    
1193
 
    BOOL single = mode == TR_SPEEDLIMIT_SINGLE;
1194
 
    [field setHidden: !single];
1195
 
    if (single)
 
1223
    [field setEnabled: limit];
 
1224
    if (limit)
1196
1225
    {
1197
1226
        [field selectText: self];
1198
 
        [[self window] makeKeyAndOrderFront:self];
 
1227
        [[self window] makeKeyAndOrderFront: self];
1199
1228
    }
1200
1229
    
1201
1230
    NSTextField * label = upload ? fUploadLimitLabel : fDownloadLimitLabel;
1202
 
    [label setHidden: !single];
 
1231
    [label setEnabled: limit];
 
1232
}
 
1233
 
 
1234
- (void) setUseGlobalSpeedLimit: (id) sender
 
1235
{
 
1236
    if ([sender state] == NSMixedState)
 
1237
        [sender setState: NSOnState];
 
1238
    const BOOL limit = [sender state] == NSOnState;
 
1239
    
 
1240
    for (Torrent * torrent in fTorrents)
 
1241
        [torrent setUseGlobalSpeedLimit: limit];
1203
1242
}
1204
1243
 
1205
1244
- (void) setSpeedLimit: (id) sender
1206
1245
{
1207
 
    BOOL upload = sender == fUploadLimitField;
1208
 
    NSInteger limit = [sender intValue];
1209
 
    
1210
 
    Torrent * torrent;
1211
 
    NSEnumerator * enumerator = [fTorrents objectEnumerator];
1212
 
    
1213
 
    while ((torrent = [enumerator nextObject]))
 
1246
    const BOOL upload = sender == fUploadLimitField;
 
1247
    const NSInteger limit = [sender intValue];
 
1248
    
 
1249
    for (Torrent * torrent in fTorrents)
1214
1250
        [torrent setSpeedLimit: limit upload: upload];
1215
1251
}
1216
1252
 
1217
1253
- (void) setRatioSetting: (id) sender
1218
1254
{
1219
1255
    NSInteger setting;
 
1256
    bool single = NO;
1220
1257
    switch ([sender indexOfSelectedItem])
1221
1258
    {
1222
1259
        case OPTION_POPUP_LIMIT:
1223
 
            setting = NSOnState;
 
1260
            setting = TR_RATIOLIMIT_SINGLE;
 
1261
            single = YES;
1224
1262
            break;
1225
1263
        case OPTION_POPUP_NO_LIMIT:
1226
 
            setting = NSOffState;
 
1264
            setting = TR_RATIOLIMIT_UNLIMITED;
1227
1265
            break;
1228
1266
        case OPTION_POPUP_GLOBAL:
1229
 
            setting = NSMixedState;
 
1267
            setting = TR_RATIOLIMIT_GLOBAL;
1230
1268
            break;
1231
1269
        default:
1232
1270
            return;
1233
1271
    }
1234
1272
    
1235
 
    Torrent * torrent;
1236
 
    NSEnumerator * enumerator = [fTorrents objectEnumerator];
1237
 
    while ((torrent = [enumerator nextObject]))
 
1273
    for (Torrent * torrent in fTorrents)
1238
1274
        [torrent setRatioSetting: setting];
1239
1275
    
1240
 
    BOOL single = setting == NSOnState;
1241
1276
    [fRatioLimitField setHidden: !single];
1242
1277
    if (single)
1243
1278
    {
1244
1279
        [fRatioLimitField selectText: self];
1245
 
        [[self window] makeKeyAndOrderFront:self];
 
1280
        [[self window] makeKeyAndOrderFront: self];
1246
1281
    }
1247
 
    
1248
 
    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil];
1249
1282
}
1250
1283
 
1251
1284
- (void) setRatioLimit: (id) sender
1252
1285
{
1253
1286
    CGFloat limit = [sender floatValue];
1254
1287
    
1255
 
    Torrent * torrent;
1256
 
    NSEnumerator * enumerator = [fTorrents objectEnumerator];
1257
 
    while ((torrent = [enumerator nextObject]))
 
1288
    for (Torrent * torrent in fTorrents)
1258
1289
        [torrent setRatioLimit: limit];
1259
1290
}
1260
1291
 
 
1292
- (void) setPriority: (id) sender
 
1293
{
 
1294
    tr_priority_t priority;
 
1295
    switch ([sender indexOfSelectedItem])
 
1296
    {
 
1297
        case OPTION_POPUP_PRIORITY_HIGH:
 
1298
            priority = TR_PRI_HIGH;
 
1299
            break;
 
1300
        case OPTION_POPUP_PRIORITY_NORMAL:
 
1301
            priority = TR_PRI_NORMAL;
 
1302
            break;
 
1303
        case OPTION_POPUP_PRIORITY_LOW:
 
1304
            priority = TR_PRI_LOW;
 
1305
            break;
 
1306
        default:
 
1307
            return;
 
1308
    }
 
1309
    
 
1310
    for (Torrent * torrent in fTorrents)
 
1311
        [torrent setPriority: priority];
 
1312
    
 
1313
    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil];
 
1314
}
 
1315
 
1261
1316
- (void) setPeersConnectLimit: (id) sender
1262
1317
{
1263
1318
    NSInteger limit = [sender intValue];
1264
1319
    
1265
 
    Torrent * torrent;
1266
 
    NSEnumerator * enumerator = [fTorrents objectEnumerator];
1267
 
    while ((torrent = [enumerator nextObject]))
 
1320
    for (Torrent * torrent in fTorrents)
1268
1321
        [torrent setMaxPeerConnect: limit];
1269
1322
}
1270
1323
 
1271
 
 
1272
1324
- (BOOL) control: (NSControl *) control textShouldBeginEditing: (NSText *) fieldEditor
1273
1325
{
1274
1326
    [fInitialString release];
1315
1367
    
1316
1368
    uint64_t have = 0, haveVerified = 0, downloadedTotal = 0, uploadedTotal = 0, failedHash = 0;
1317
1369
    NSDate * lastActivity = nil;
1318
 
    Torrent * torrent;
1319
 
    NSEnumerator * enumerator = [fTorrents objectEnumerator];
1320
 
    while ((torrent = [enumerator nextObject]))
 
1370
    for (Torrent * torrent in fTorrents)
1321
1371
    {
1322
1372
        have += [torrent haveTotal];
1323
1373
        haveVerified += [torrent haveVerified];
1350
1400
    
1351
1401
    if (numberSelected == 1)
1352
1402
    {
1353
 
        torrent = [fTorrents objectAtIndex: 0];
 
1403
        Torrent * torrent = [fTorrents objectAtIndex: 0];
1354
1404
        
1355
1405
        [fStateField setStringValue: [torrent stateString]];
1356
1406
        
1733
1783
        [alert addButtonWithTitle: NSLocalizedString(@"Remove", "Remove built-in tracker alert -> button")];
1734
1784
        [alert addButtonWithTitle: NSLocalizedString(@"Cancel", "Remove built-in tracker alert -> button")];
1735
1785
        
1736
 
        BOOL onLeopard = [NSApp isOnLeopardOrBetter];
1737
 
        if (onLeopard)
1738
 
            [alert setShowsSuppressionButton: YES];
1739
 
        else
1740
 
            [alert addButtonWithTitle: NSLocalizedString(@"Don't Alert Again", "Remove built-in tracker alert -> button")];
 
1786
        [alert setShowsSuppressionButton: YES];
1741
1787
 
1742
1788
        NSInteger result = [alert runModal];
1743
 
        if ((onLeopard ? [[alert suppressionButton] state] == NSOnState : result == NSAlertThirdButtonReturn))
 
1789
        if ([[alert suppressionButton] state] == NSOnState)
1744
1790
            [[NSUserDefaults standardUserDefaults] setBool: NO forKey: @"WarningRemoveBuiltInTracker"];
1745
1791
        [alert release];
1746
1792