1/******************************************************************************
2 * $Id: InfoOptionsViewController.m 13583 2012-10-19 03:52:59Z livings124 $
3 *
4 * Copyright (c) 2010-2012 Transmission authors and contributors
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *****************************************************************************/
24
25#import "InfoOptionsViewController.h"
26#import "NSStringAdditions.h"
27#import "Torrent.h"
28
29#define OPTION_POPUP_GLOBAL 0
30#define OPTION_POPUP_NO_LIMIT 1
31#define OPTION_POPUP_LIMIT 2
32
33#define OPTION_POPUP_PRIORITY_HIGH 0
34#define OPTION_POPUP_PRIORITY_NORMAL 1
35#define OPTION_POPUP_PRIORITY_LOW 2
36
37#define INVALID -99
38
39@interface InfoOptionsViewController (Private)
40
41- (void) setupInfo;
42- (void) setGlobalLabels;
43- (void) updateOptionsNotification: (NSNotification *) notification;
44
45@end
46
47@implementation InfoOptionsViewController
48
49- (id) init
50{
51    if ((self = [super initWithNibName: @"InfoOptionsView" bundle: nil]))
52    {
53        [self setTitle: NSLocalizedString(@"Options", "Inspector view -> title")];
54    }
55    
56    return self;
57}
58
59- (void) awakeFromNib
60{
61    [self setGlobalLabels];
62    
63    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(setGlobalLabels) name: @"UpdateGlobalOptions" object: nil];
64    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateOptionsNotification:) name: @"UpdateOptionsNotification" object: nil];
65    
66    #warning enable after 2.7
67    /*
68    #warning remove when 10.7-only with auto layout
69    const CGFloat padding = 6.0; //this shows as 8 in IB
70    [fPrioritySectionLabel sizeToFit];
71    [fPriorityLabel sizeToFit];
72    NSRect priorityPopUpFrame = [fPriorityPopUp frame];
73    priorityPopUpFrame.origin.x = NSMaxX([fPriorityLabel frame]) + padding;
74    [fPriorityPopUp setFrame: priorityPopUpFrame];
75    
76    [fTransferBandwidthSectionLabel sizeToFit];
77    [fDownloadLimitCheck sizeToFit];
78    [fUploadLimitCheck sizeToFit];
79    NSRect downloadLimitFieldFrame = [fDownloadLimitField frame];
80    NSRect uploadLimitFieldFrame = [fUploadLimitField frame];
81    const CGFloat speedLimitFieldX = MAX(NSMaxX([fDownloadLimitCheck frame]), NSMaxX([fUploadLimitCheck frame])) + padding;
82    downloadLimitFieldFrame.origin.x = speedLimitFieldX;
83    uploadLimitFieldFrame.origin.x = speedLimitFieldX;
84    [fDownloadLimitField setFrame: downloadLimitFieldFrame];
85    [fUploadLimitField setFrame: uploadLimitFieldFrame];
86    [fDownloadLimitLabel sizeToFit];
87    [fUploadLimitLabel sizeToFit];
88    NSRect downloadLimitLabelFrame = [fDownloadLimitLabel frame];
89    NSRect uploadLimitLabelFrame = [fUploadLimitLabel frame];
90    downloadLimitLabelFrame.origin.x = NSMaxX([fDownloadLimitField frame]) + padding;
91    uploadLimitLabelFrame.origin.x = NSMaxX([fUploadLimitField frame]) + padding;
92    [fDownloadLimitLabel setFrame: downloadLimitLabelFrame];
93    [fUploadLimitLabel setFrame: uploadLimitLabelFrame];
94    [fGlobalLimitCheck sizeToFit];
95    
96    [fSeedingLimitsSectionLabel sizeToFit];
97    [fRatioLabel sizeToFit];
98    [fInactivityLabel sizeToFit];
99    NSRect ratioPopUpFrame = [fRatioPopUp frame];
100    NSRect idlePopUpFrame = [fIdlePopUp frame];
101    const CGFloat seedingLimitPopUpX = MAX(NSMaxX([fRatioLabel frame]), NSMaxX([fInactivityLabel frame])) + padding;
102    ratioPopUpFrame.origin.x = seedingLimitPopUpX;
103    idlePopUpFrame.origin.x = seedingLimitPopUpX;
104    [fRatioPopUp setFrame: ratioPopUpFrame];
105    [fIdlePopUp setFrame: idlePopUpFrame];
106    NSRect ratioLimitFieldFrame = [fRatioLimitField frame];
107    NSRect idleLimitFieldFrame = [fIdleLimitField frame];
108    const CGFloat seedingLimitFieldX = NSMaxX(ratioPopUpFrame) + padding;
109    ratioLimitFieldFrame.origin.x = seedingLimitFieldX + 2.0;
110    idleLimitFieldFrame.origin.x = seedingLimitFieldX + 2.0;
111    [fRatioLimitField setFrame: ratioLimitFieldFrame];
112    [fIdleLimitField setFrame: idleLimitFieldFrame];
113    [fIdleLimitLabel sizeToFit];
114    NSRect idleLimitLabelFrame = [fIdleLimitLabel frame];
115    idleLimitLabelFrame.origin.x = NSMaxX(idleLimitFieldFrame) + padding;
116    [fIdleLimitLabel setFrame: idleLimitLabelFrame];
117    NSRect ratioLimitGlobalLabelFrame = [fRatioLimitGlobalLabel frame];
118    NSRect idleLimitGlobalLabelFrame = [fIdleLimitGlobalLabel frame];
119    ratioLimitGlobalLabelFrame.origin.x = seedingLimitFieldX;
120    idleLimitGlobalLabelFrame.origin.x = seedingLimitFieldX;
121    [fRatioLimitGlobalLabel setFrame: ratioLimitGlobalLabelFrame];
122    [fIdleLimitGlobalLabel setFrame: idleLimitGlobalLabelFrame];
123    [fRemoveSeedingCompleteCheck sizeToFit];
124    
125    [fAdvancedSectionLabel sizeToFit];
126    [fMaxConnectionsLabel sizeToFit];
127    NSRect peersConnectFrame = [fPeersConnectField frame];
128    peersConnectFrame.origin.x = NSMaxX([fMaxConnectionsLabel frame]) + padding;
129    [fPeersConnectField setFrame: peersConnectFrame];
130    [fPeersConnectLabel sizeToFit];
131    NSRect peersConnectLabelFrame = [fPeersConnectLabel frame];
132    peersConnectLabelFrame.origin.x = NSMaxX(peersConnectFrame) + padding;
133    [fPeersConnectLabel setFrame: peersConnectLabelFrame];*/
134}
135
136- (void) dealloc
137{
138    [[NSNotificationCenter defaultCenter] removeObserver: self];
139    
140    [fTorrents release];
141    
142    [super dealloc];
143}
144
145- (void) setInfoForTorrents: (NSArray *) torrents
146{
147    //don't check if it's the same in case the metadata changed
148    [fTorrents release];
149    fTorrents = [torrents retain];
150    
151    fSet = NO;
152}
153
154- (void) updateInfo
155{
156    if (!fSet)
157        [self setupInfo];
158    
159    fSet = YES;
160}
161
162- (void) updateOptions
163{
164    if ([fTorrents count] == 0)
165        return;
166    
167    //get bandwidth info
168    NSEnumerator * enumerator = [fTorrents objectEnumerator];
169    Torrent * torrent = [enumerator nextObject]; //first torrent
170    
171    NSInteger uploadUseSpeedLimit = [torrent usesSpeedLimit: YES] ? NSOnState : NSOffState,
172                uploadSpeedLimit = [torrent speedLimit: YES],
173                downloadUseSpeedLimit = [torrent usesSpeedLimit: NO] ? NSOnState : NSOffState,
174                downloadSpeedLimit = [torrent speedLimit: NO],
175                globalUseSpeedLimit = [torrent usesGlobalSpeedLimit] ? NSOnState : NSOffState;
176    
177    while ((torrent = [enumerator nextObject])
178            && (uploadUseSpeedLimit != NSMixedState || uploadSpeedLimit != INVALID
179                || downloadUseSpeedLimit != NSMixedState || downloadSpeedLimit != INVALID
180                || globalUseSpeedLimit != NSMixedState))
181    {
182        if (uploadUseSpeedLimit != NSMixedState && uploadUseSpeedLimit != ([torrent usesSpeedLimit: YES] ? NSOnState : NSOffState))
183            uploadUseSpeedLimit = NSMixedState;
184        
185        if (uploadSpeedLimit != INVALID && uploadSpeedLimit != [torrent speedLimit: YES])
186            uploadSpeedLimit = INVALID;
187        
188        if (downloadUseSpeedLimit != NSMixedState && downloadUseSpeedLimit != ([torrent usesSpeedLimit: NO] ? NSOnState : NSOffState))
189            downloadUseSpeedLimit = NSMixedState;
190        
191        if (downloadSpeedLimit != INVALID && downloadSpeedLimit != [torrent speedLimit: NO])
192            downloadSpeedLimit = INVALID;
193        
194        if (globalUseSpeedLimit != NSMixedState && globalUseSpeedLimit != ([torrent usesGlobalSpeedLimit] ? NSOnState : NSOffState))
195            globalUseSpeedLimit = NSMixedState;
196    }
197    
198    //set upload view
199    [fUploadLimitCheck setState: uploadUseSpeedLimit];
200    [fUploadLimitCheck setEnabled: YES];
201    
202    [fUploadLimitLabel setEnabled: uploadUseSpeedLimit == NSOnState];
203    [fUploadLimitField setEnabled: uploadUseSpeedLimit == NSOnState];
204    if (uploadSpeedLimit != INVALID)
205        [fUploadLimitField setIntValue: uploadSpeedLimit];
206    else
207        [fUploadLimitField setStringValue: @""];
208    
209    //set download view
210    [fDownloadLimitCheck setState: downloadUseSpeedLimit];
211    [fDownloadLimitCheck setEnabled: YES];
212    
213    [fDownloadLimitLabel setEnabled: downloadUseSpeedLimit == NSOnState];
214    [fDownloadLimitField setEnabled: downloadUseSpeedLimit == NSOnState];
215    if (downloadSpeedLimit != INVALID)
216        [fDownloadLimitField setIntValue: downloadSpeedLimit];
217    else
218        [fDownloadLimitField setStringValue: @""];
219    
220    //set global check
221    [fGlobalLimitCheck setState: globalUseSpeedLimit];
222    [fGlobalLimitCheck setEnabled: YES];
223    
224    //get ratio and idle info
225    enumerator = [fTorrents objectEnumerator];
226    torrent = [enumerator nextObject]; //first torrent
227    
228    NSInteger checkRatio = [torrent ratioSetting], checkIdle = [torrent idleSetting],
229            removeWhenFinishSeeding = [torrent removeWhenFinishSeeding] ? NSOnState : NSOffState;
230    CGFloat ratioLimit = [torrent ratioLimit];
231    NSUInteger idleLimit = [torrent idleLimitMinutes];
232    
233    while ((torrent = [enumerator nextObject])
234            && (checkRatio != INVALID || ratioLimit != INVALID || checkIdle != INVALID || idleLimit != INVALID))
235    {
236        if (checkRatio != INVALID && checkRatio != [torrent ratioSetting])
237            checkRatio = INVALID;
238        
239        if (ratioLimit != INVALID && ratioLimit != [torrent ratioLimit])
240            ratioLimit = INVALID;
241        
242        if (checkIdle != INVALID && checkIdle != [torrent idleSetting])
243            checkIdle = INVALID;
244        
245        if (idleLimit != INVALID && idleLimit != [torrent idleLimitMinutes])
246            idleLimit = INVALID;
247        
248        if (removeWhenFinishSeeding != NSMixedState && removeWhenFinishSeeding != ([torrent removeWhenFinishSeeding] ? NSOnState : NSOffState))
249            removeWhenFinishSeeding = NSMixedState;
250    }
251    
252    //set ratio view
253    NSInteger index;
254    if (checkRatio == TR_RATIOLIMIT_SINGLE)
255        index = OPTION_POPUP_LIMIT;
256    else if (checkRatio == TR_RATIOLIMIT_UNLIMITED)
257        index = OPTION_POPUP_NO_LIMIT;
258    else if (checkRatio == TR_RATIOLIMIT_GLOBAL)
259        index = OPTION_POPUP_GLOBAL;
260    else
261        index = -1;
262    [fRatioPopUp selectItemAtIndex: index];
263    [fRatioPopUp setEnabled: YES];
264    
265    [fRatioLimitField setHidden: checkRatio != TR_RATIOLIMIT_SINGLE];
266    if (ratioLimit != INVALID)
267        [fRatioLimitField setFloatValue: ratioLimit];
268    else
269        [fRatioLimitField setStringValue: @""];
270    
271    [fRatioLimitGlobalLabel setHidden: checkRatio != TR_RATIOLIMIT_GLOBAL];
272    
273    //set idle view
274    if (checkIdle == TR_IDLELIMIT_SINGLE)
275        index = OPTION_POPUP_LIMIT;
276    else if (checkIdle == TR_IDLELIMIT_UNLIMITED)
277        index = OPTION_POPUP_NO_LIMIT;
278    else if (checkIdle == TR_IDLELIMIT_GLOBAL)
279        index = OPTION_POPUP_GLOBAL;
280    else
281        index = -1;
282    [fIdlePopUp selectItemAtIndex: index];
283    [fIdlePopUp setEnabled: YES];
284    
285    [fIdleLimitField setHidden: checkIdle != TR_IDLELIMIT_SINGLE];
286    if (idleLimit != INVALID)
287        [fIdleLimitField setIntegerValue: idleLimit];
288    else
289        [fIdleLimitField setStringValue: @""];
290    [fIdleLimitLabel setHidden: checkIdle != TR_IDLELIMIT_SINGLE];
291    
292    [fIdleLimitGlobalLabel setHidden: checkIdle != TR_IDLELIMIT_GLOBAL];
293    
294    //set remove transfer when seeding finishes
295    [fRemoveSeedingCompleteCheck setState: removeWhenFinishSeeding];
296    [fRemoveSeedingCompleteCheck setEnabled: YES];
297    
298    //get priority info
299    enumerator = [fTorrents objectEnumerator];
300    torrent = [enumerator nextObject]; //first torrent
301    
302    NSInteger priority = [torrent priority];
303    
304    while ((torrent = [enumerator nextObject]) && priority != INVALID)
305    {
306        if (priority != INVALID && priority != [torrent priority])
307            priority = INVALID;
308    }
309    
310    //set priority view
311    if (priority == TR_PRI_HIGH)
312        index = OPTION_POPUP_PRIORITY_HIGH;
313    else if (priority == TR_PRI_NORMAL)
314        index = OPTION_POPUP_PRIORITY_NORMAL;
315    else if (priority == TR_PRI_LOW)
316        index = OPTION_POPUP_PRIORITY_LOW;
317    else
318        index = -1;
319    [fPriorityPopUp selectItemAtIndex: index];
320    [fPriorityPopUp setEnabled: YES];
321    
322    //get peer info
323    enumerator = [fTorrents objectEnumerator];
324    torrent = [enumerator nextObject]; //first torrent
325    
326    NSInteger maxPeers = [torrent maxPeerConnect];
327    
328    while ((torrent = [enumerator nextObject]))
329    {
330        if (maxPeers != [torrent maxPeerConnect])
331        {
332            maxPeers = INVALID;
333            break;
334        }
335    }
336    
337    //set peer view
338    [fPeersConnectField setEnabled: YES];
339    [fPeersConnectLabel setEnabled: YES];
340    if (maxPeers != INVALID)
341        [fPeersConnectField setIntValue: maxPeers];
342    else
343        [fPeersConnectField setStringValue: @""];
344}
345
346- (void) setUseSpeedLimit: (id) sender
347{
348    const BOOL upload = sender == fUploadLimitCheck;
349    
350    if ([(NSButton *)sender state] == NSMixedState)
351        [sender setState: NSOnState];
352    const BOOL limit = [(NSButton *)sender state] == NSOnState;
353    
354    for (Torrent * torrent in fTorrents)
355        [torrent setUseSpeedLimit: limit upload: upload];
356    
357    NSTextField * field = upload ? fUploadLimitField : fDownloadLimitField;
358    [field setEnabled: limit];
359    if (limit)
360    {
361        [field selectText: self];
362        [[[self view] window] makeKeyAndOrderFront: self];
363    }
364    
365    NSTextField * label = upload ? fUploadLimitLabel : fDownloadLimitLabel;
366    [label setEnabled: limit];
367    
368    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self];
369}
370
371- (void) setUseGlobalSpeedLimit: (id) sender
372{
373    if ([(NSButton *)sender state] == NSMixedState)
374        [sender setState: NSOnState];
375    const BOOL limit = [(NSButton *)sender state] == NSOnState;
376    
377    for (Torrent * torrent in fTorrents)
378        [torrent setUseGlobalSpeedLimit: limit];
379    
380    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self];
381}
382
383- (void) setSpeedLimit: (id) sender
384{
385    const BOOL upload = sender == fUploadLimitField;
386    const NSInteger limit = [sender intValue];
387    
388    for (Torrent * torrent in fTorrents)
389        [torrent setSpeedLimit: limit upload: upload];
390    
391    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self];
392}
393
394- (void) setRatioSetting: (id) sender
395{
396    NSInteger setting;
397    BOOL single = NO;
398    switch ([sender indexOfSelectedItem])
399    {
400        case OPTION_POPUP_LIMIT:
401            setting = TR_RATIOLIMIT_SINGLE;
402            single = YES;
403            break;
404        case OPTION_POPUP_NO_LIMIT:
405            setting = TR_RATIOLIMIT_UNLIMITED;
406            break;
407        case OPTION_POPUP_GLOBAL:
408            setting = TR_RATIOLIMIT_GLOBAL;
409            break;
410        default:
411            NSAssert1(NO, @"Unknown option selected in ratio popup: %ld", [sender indexOfSelectedItem]);
412            return;
413    }
414    
415    for (Torrent * torrent in fTorrents)
416        [torrent setRatioSetting: setting];
417    
418    [fRatioLimitField setHidden: !single];
419    if (single)
420    {
421        [fRatioLimitField selectText: self];
422        [[[self view] window] makeKeyAndOrderFront: self];
423    }
424    
425    [fRatioLimitGlobalLabel setHidden: setting != TR_RATIOLIMIT_GLOBAL];
426    
427    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self];
428}
429
430- (void) setRatioLimit: (id) sender
431{
432    const CGFloat limit = [sender floatValue];
433    
434    for (Torrent * torrent in fTorrents)
435        [torrent setRatioLimit: limit];
436    
437    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self];
438}
439
440- (void) setIdleSetting: (id) sender
441{
442    NSInteger setting;
443    BOOL single = NO;
444    switch ([sender indexOfSelectedItem])
445    {
446        case OPTION_POPUP_LIMIT:
447            setting = TR_IDLELIMIT_SINGLE;
448            single = YES;
449            break;
450        case OPTION_POPUP_NO_LIMIT:
451            setting = TR_IDLELIMIT_UNLIMITED;
452            break;
453        case OPTION_POPUP_GLOBAL:
454            setting = TR_IDLELIMIT_GLOBAL;
455            break;
456        default:
457            NSAssert1(NO, @"Unknown option selected in idle popup: %ld", [sender indexOfSelectedItem]);
458            return;
459    }
460    
461    for (Torrent * torrent in fTorrents)
462        [torrent setIdleSetting: setting];
463    
464    [fIdleLimitField setHidden: !single];
465    [fIdleLimitLabel setHidden: !single];
466    if (single)
467    {
468        [fIdleLimitField selectText: self];
469        [[[self view] window] makeKeyAndOrderFront: self];
470    }
471    
472    [fIdleLimitGlobalLabel setHidden: setting != TR_IDLELIMIT_GLOBAL];
473    
474    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self];
475}
476
477- (void) setIdleLimit: (id) sender
478{
479    const NSUInteger limit = [sender integerValue];
480    
481    for (Torrent * torrent in fTorrents)
482        [torrent setIdleLimitMinutes: limit];
483    
484    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self];
485}
486
487- (IBAction) setRemoveWhenSeedingCompletes: (id) sender
488{
489    if ([(NSButton *)sender state] == NSMixedState)
490        [sender setState: NSOnState];
491    const BOOL enable = [(NSButton *)sender state] == NSOnState;
492    
493    for (Torrent * torrent in fTorrents)
494        [torrent setRemoveWhenFinishSeeding: enable];
495    
496    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self];
497}
498
499- (void) setPriority: (id) sender
500{
501    tr_priority_t priority;
502    switch ([sender indexOfSelectedItem])
503    {
504        case OPTION_POPUP_PRIORITY_HIGH:
505            priority = TR_PRI_HIGH;
506            break;
507        case OPTION_POPUP_PRIORITY_NORMAL:
508            priority = TR_PRI_NORMAL;
509            break;
510        case OPTION_POPUP_PRIORITY_LOW:
511            priority = TR_PRI_LOW;
512            break;
513        default:
514            NSAssert1(NO, @"Unknown option selected in priority popup: %ld", [sender indexOfSelectedItem]);
515            return;
516    }
517    
518    for (Torrent * torrent in fTorrents)
519        [torrent setPriority: priority];
520    
521    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateUI" object: nil];
522    
523    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self];
524}
525
526- (void) setPeersConnectLimit: (id) sender
527{
528    NSInteger limit = [sender intValue];
529    
530    for (Torrent * torrent in fTorrents)
531        [torrent setMaxPeerConnect: limit];
532    
533    [[NSNotificationCenter defaultCenter] postNotificationName: @"UpdateOptionsNotification" object: self];
534}
535
536- (BOOL) control: (NSControl *) control textShouldBeginEditing: (NSText *) fieldEditor
537{
538    [fInitialString release];
539    fInitialString = [[control stringValue] retain];
540    
541    return YES;
542}
543
544- (BOOL) control: (NSControl *) control didFailToFormatString: (NSString *) string errorDescription: (NSString *) error
545{
546    NSBeep();
547    if (fInitialString)
548    {
549        [control setStringValue: fInitialString];
550        [fInitialString release];
551        fInitialString = nil;
552    }
553    return NO;
554}
555
556@end
557
558@implementation InfoOptionsViewController (Private)
559
560- (void) setupInfo
561{
562    if ([fTorrents count] == 0)
563    {
564        [fUploadLimitCheck setEnabled: NO];
565        [fUploadLimitCheck setState: NSOffState];
566        [fUploadLimitField setEnabled: NO];
567        [fUploadLimitLabel setEnabled: NO];
568        [fUploadLimitField setStringValue: @""];
569        
570        [fDownloadLimitCheck setEnabled: NO];
571        [fDownloadLimitCheck setState: NSOffState];
572        [fDownloadLimitField setEnabled: NO];
573        [fDownloadLimitLabel setEnabled: NO];
574        [fDownloadLimitField setStringValue: @""];
575        
576        [fGlobalLimitCheck setEnabled: NO];
577        [fGlobalLimitCheck setState: NSOffState];
578        
579        [fPriorityPopUp setEnabled: NO];
580        [fPriorityPopUp selectItemAtIndex: -1];
581        
582        [fRatioPopUp setEnabled: NO];
583        [fRatioPopUp selectItemAtIndex: -1];
584        [fRatioLimitField setHidden: YES];
585        [fRatioLimitField setStringValue: @""];
586        [fRatioLimitGlobalLabel setHidden: YES];
587        
588        [fIdlePopUp setEnabled: NO];
589        [fIdlePopUp selectItemAtIndex: -1];
590        [fIdleLimitField setHidden: YES];
591        [fIdleLimitField setStringValue: @""];
592        [fIdleLimitLabel setHidden: YES];
593        [fIdleLimitGlobalLabel setHidden: YES];
594        
595        [fRemoveSeedingCompleteCheck setEnabled: NO];
596        [fRemoveSeedingCompleteCheck setState: NSOffState];
597        
598        [fPeersConnectField setEnabled: NO];
599        [fPeersConnectField setStringValue: @""];
600        [fPeersConnectLabel setEnabled: NO];
601    }
602    else
603        [self updateOptions];
604}
605
606- (void) setGlobalLabels
607{
608    NSString * global = [[NSUserDefaults standardUserDefaults] boolForKey: @"RatioCheck"]
609        ? [NSString stringForRatio: [[NSUserDefaults standardUserDefaults] floatForKey: @"RatioLimit"]]
610        : NSLocalizedString(@"disabled", "Info options -> global setting");
611    [fRatioLimitGlobalLabel setStringValue: global];
612    
613    //idle field
614    NSString * globalIdle;
615    if ([[NSUserDefaults standardUserDefaults] boolForKey: @"IdleLimitCheck"])
616    {
617        const NSInteger globalMin = [[NSUserDefaults standardUserDefaults] integerForKey: @"IdleLimitMinutes"];
618        globalIdle = globalMin == 1 ? NSLocalizedString(@"1 minute", "Info options -> global setting")
619            : [NSString localizedStringWithFormat: NSLocalizedString(@"%d minutes", "Info options -> global setting"), globalMin];
620    }
621    else
622        globalIdle = NSLocalizedString(@"disabled", "Info options -> global setting");
623    [fIdleLimitGlobalLabel setStringValue: globalIdle];
624}
625
626- (void) updateOptionsNotification: (NSNotification *) notification
627{
628    if ([notification object] != self)
629        [self updateOptions];
630}
631
632@end
633