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