X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/de2bf09451cd859cce4a514ad0fbff93cd9f3b0e..d8546c318b2dc71d68753ca0c0abe89f07c166b3:/PreferencesController.m diff --git a/PreferencesController.m b/PreferencesController.m index 372cce7..a17c1b3 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -1,16 +1,22 @@ #import "PreferencesController.h" #import "MainController.h" #import "NetworkController.h" +#import "NetworkObject.h" #import "StatusWindow.h" #import "StatusWindowController.h" #import "CustomMenuTableView.h" +#import +#import +#import + #import #import #import #import #import +#import #import #import #import @@ -30,6 +36,7 @@ - (void)setupCustomizationTables; - (void)setupMenuItems; - (void)setupUI; +- (void)setCustomColor:(NSColor *)color updateWell:(BOOL)update; - (IBAction)changeMenus:(id)sender; - (void)setLaunchesAtLogin:(BOOL)flag; @end @@ -93,6 +100,9 @@ static PreferencesController *prefs = nil; nil]; hotKeysDictionary = [[NSMutableDictionary alloc] init]; controller = nil; + + [self setupWindow]; // Load in the nib, and perform any initial setup. + [[NSColorPanel sharedColorPanel] setShowsAlpha:YES]; } return self; } @@ -120,12 +130,43 @@ static PreferencesController *prefs = nil; #pragma mark INSTANCE METHODS /*************************************************************************/ +- (BOOL)showPasswordPanel +{ + [passwordPanel setLevel:NSStatusWindowLevel]; + [passwordPanelOKButton setTitle:@"Connect"]; + [passwordPanelTitle setStringValue:@"Password Required"]; + [passwordPanelMessage setStringValue:[NSString stringWithFormat:@"Please enter a password for access to the MenuTunes player named %@ at %@.", [[[NetworkController sharedController] networkObject] serverName], [[NetworkController sharedController] remoteHost]]]; + [passwordPanel center]; + [passwordPanel setLevel:NSStatusWindowLevel]; + [passwordPanel makeKeyAndOrderFront:nil]; + if ([NSApp runModalForWindow:passwordPanel]) { + return YES; + } else { + return NO; + } +} + +- (BOOL)showInvalidPasswordPanel +{ + [passwordPanel setLevel:NSStatusWindowLevel]; + [passwordPanelOKButton setTitle:@"Retry"]; + [passwordPanelTitle setStringValue:@"Invalid Password"]; + [passwordPanelMessage setStringValue:[NSString stringWithFormat:@"The password entered for access to the MenuTunes player named %@ at %@ is invalid. Please provide a new password.", [[[NetworkController sharedController] networkObject] serverName], [[NetworkController sharedController] remoteHost]]]; + [passwordPanel center]; + [passwordPanel setLevel:NSStatusWindowLevel]; + [passwordPanel makeKeyAndOrderFront:nil]; + if ([NSApp runModalForWindow:passwordPanel]) { + return YES; + } else { + return NO; + } +} + - (IBAction)showPrefsWindow:(id)sender { ITDebugLog(@"Showing preferences window."); - if (! window) { // If window does not exist yet, then the nib hasn't been loaded. + if (!myItems) { // If menu array does not exist yet, then the window hasn't been setup. ITDebugLog(@"Window doesn't exist, initial setup."); - [self setupWindow]; // Load in the nib, and perform any initial setup. [self setupCustomizationTables]; // Setup the DnD manu config tables. [self setupMenuItems]; // Setup the arrays of menu items [self setupUI]; // Sets up additional UI @@ -146,6 +187,11 @@ static PreferencesController *prefs = nil; [window performSelector:@selector(makeKeyAndOrderFront:) withObject:self afterDelay:0.0]; } +- (IBAction)showTestWindow:(id)sender +{ + [controller showTestWindow]; +} + - (IBAction)changeGeneralSetting:(id)sender { ITDebugLog(@"Changing general setting of tag %i.", [sender tag]); @@ -181,32 +227,67 @@ static PreferencesController *prefs = nil; [df setBool:state forKey:@"enableSharing"]; //Disable/enable the use of shared player options [useSharedMenuTunesCheckbox setEnabled:!state]; - [sharePasswordCheckbox setEnabled:!state]; - [sharePasswordTextField setEnabled:!state]; + [usePasswordCheckbox setEnabled:state]; + [passwordTextField setEnabled:state]; + [nameTextField setEnabled:state]; + [selectSharedPlayerButton setEnabled:NO]; [controller setServerStatus:state]; //Set server status + } else if ( [sender tag] == 5015 ) { + [df setObject:[sender stringValue] forKey:@"sharedPlayerName"]; } else if ( [sender tag] == 5020 ) { [df setBool:SENDER_STATE forKey:@"enableSharingPassword"]; } else if ( [sender tag] == 5030 ) { - [df setObject:[sender stringValue] forKey:@"sharingPassword"]; + //Set the server password + const char *instring = [[sender stringValue] UTF8String]; + const char *password = "password"; + unsigned char *result; + NSData *hashedPass, *passwordStringHash; + result = SHA1(instring, strlen(instring), NULL); + hashedPass = [NSData dataWithBytes:result length:strlen(result)]; + result = SHA1(password, strlen(password), NULL); + passwordStringHash = [NSData dataWithBytes:result length:strlen(result)]; + if (![hashedPass isEqualToData:passwordStringHash]) { + [df setObject:hashedPass forKey:@"sharedPlayerPassword"]; + [sender setStringValue:@"password"]; + } } else if ( [sender tag] == 5040 ) { BOOL state = SENDER_STATE; [df setBool:state forKey:@"useSharedPlayer"]; //Disable/enable the use of sharing options [shareMenuTunesCheckbox setEnabled:!state]; - [sharePasswordCheckbox setEnabled:!state]; - [sharePasswordTextField setEnabled:!state]; + [usePasswordCheckbox setEnabled:NO]; + [passwordTextField setEnabled:NO]; + [nameTextField setEnabled:NO]; + [selectSharedPlayerButton setEnabled:state]; - if (state) { - [controller connectToServer]; + if (state && ([controller connectToServer] == 1)) { + [selectedPlayerTextField setStringValue:[[[NetworkController sharedController] networkObject] serverName]]; + [locationTextField setStringValue:[[NetworkController sharedController] remoteHost]]; } else { - [controller disconnectFromServer]; + [selectedPlayerTextField setStringValue:@"No shared player selected."]; + [locationTextField setStringValue:@"-"]; + if ([[NetworkController sharedController] isConnectedToServer]) { + [controller disconnectFromServer]; + } + } } else if ( [sender tag] == 5050 ) { - if ([sender clickedRow] > -1) { - //Set sharedPlayerHost - //[df setObject:[[[[NetworkController sharedController] remoteServices] objectAtIndex:[sender clickedRow]] objectForKey:@"ip"] forKey:@"sharedPlayerHost"]; + //If no player is selected in the table view, turn off OK button. + if ([sender clickedRow] == -1 ) { + [sharingPanelOKButton setEnabled:NO]; + } else { + [sharingPanelOKButton setEnabled:YES]; } + } else if ( [sender tag] == 5051 ) { + [df setObject:[sender stringValue] forKey:@"sharedPlayerHost"]; } else if ( [sender tag] == 5060 ) { + //Set OK button state + if (([selectPlayerBox contentView] == zeroConfView && [sharingTableView selectedRow] == -1) || + ([selectPlayerBox contentView] == manualView && [[hostTextField stringValue] length] == 0)) { + [sharingPanelOKButton setEnabled:NO]; + } else { + [sharingPanelOKButton setEnabled:YES]; + } //Show selection sheet [NSApp beginSheet:selectPlayerSheet modalForWindow:window modalDelegate:self didEndSelector:NULL contextInfo:nil]; } else if ( [sender tag] == 5100 ) { @@ -215,15 +296,29 @@ static PreferencesController *prefs = nil; NSRect frame = [selectPlayerSheet frame]; frame.origin.y -= 58; frame.size.height = 273; - [selectPlayerSheet setFrame:frame display:YES animate:YES]; + if ([sharingTableView selectedRow] == -1) { + [sharingPanelOKButton setEnabled:NO]; + } [selectPlayerBox setContentView:zeroConfView]; - } else if ([selectPlayerBox contentView] != manualView) { + [selectPlayerSheet setFrame:frame display:YES animate:YES]; + } else if ( ([sender indexOfItem:[sender selectedItem]] == 1) && ([selectPlayerBox contentView] != manualView) ){ NSRect frame = [selectPlayerSheet frame]; frame.origin.y += 58; frame.size.height = 215; - [selectPlayerSheet setFrame:frame display:YES animate:YES]; + if ([[hostTextField stringValue] length] == 0) { + [sharingPanelOKButton setEnabled:NO]; + } else { + [sharingPanelOKButton setEnabled:YES]; + } [selectPlayerBox setContentView:manualView]; + [selectPlayerSheet setFrame:frame display:YES animate:YES]; + [hostTextField selectText:nil]; } + } else if ( [sender tag] == 5150 ) { + const char *instring = [[sender stringValue] UTF8String]; + unsigned char *result; + result = SHA1(instring, strlen(instring), NULL); + [df setObject:[NSData dataWithBytes:result length:strlen(result)] forKey:@"connectPassword"]; } else if ( [sender tag] == 5110 ) { //Cancel [NSApp endSheet:selectPlayerSheet]; @@ -237,19 +332,35 @@ static PreferencesController *prefs = nil; [NSApp endSheet:selectPlayerSheet]; [selectPlayerSheet orderOut:nil]; + [self changeSharingSetting:clientPasswordTextField]; + if ([selectPlayerBox contentView] == manualView) { [df setObject:[hostTextField stringValue] forKey:@"sharedPlayerHost"]; } else { if ([sharingTableView selectedRow] > -1) { - [df setObject:[[[[NetworkController sharedController] remoteServices] objectAtIndex:[sharingTableView selectedRow]] objectForKey:@"ip"] forKey:@"sharedPlayerHost"]; + [df setObject:[NSString stringWithCString:inet_ntoa((*(struct sockaddr_in*)[[[[[[NetworkController sharedController] remoteServices] objectAtIndex:[sharingTableView selectedRow]] addresses] objectAtIndex:0] bytes]).sin_addr)] forKey:@"sharedPlayerHost"]; } } - if (![controller connectToServer]) { - NSRunAlertPanel(@"Connection error.", @"The MenuTunes server you attempted to connect to was not responding. MenuTunes will revert back to the local player.", @"OK", nil, nil); - } else { + if ([controller connectToServer] == 1) { [useSharedMenuTunesCheckbox setState:NSOnState]; + [selectedPlayerTextField setStringValue:[[[NetworkController sharedController] networkObject] serverName]]; + [locationTextField setStringValue:[[NetworkController sharedController] remoteHost]]; + } else { + NSRunAlertPanel(@"Connection error.", @"The MenuTunes server you attempted to connect to was not responding. MenuTunes will revert back to the local player.", @"OK", nil, nil); } + } else if ( [sender tag] == 6010 ) { + //Cancel password entry + [passwordPanel orderOut:nil]; + [NSApp stopModalWithCode:0]; + } else if ( [sender tag] == 6020 ) { + //OK password entry, retry connect + const char *instring = [[passwordPanelTextField stringValue] UTF8String]; + unsigned char *result; + result = SHA1(instring, strlen(instring), NULL); + [df setObject:[NSData dataWithBytes:result length:strlen(result)] forKey:@"connectPassword"]; + [passwordPanel orderOut:nil]; + [NSApp stopModalWithCode:1]; } [df synchronize]; } @@ -261,6 +372,8 @@ static PreferencesController *prefs = nil; if ( [sender tag] == 2010) { [df setInteger:[sender selectedRow] forKey:@"statusWindowVerticalPosition"]; [df setInteger:[sender selectedColumn] forKey:@"statusWindowHorizontalPosition"]; + [sw setHorizontalPosition:[sender selectedColumn]]; + [sw setVerticalPosition:[sender selectedRow]]; // update the window's position here } else if ( [sender tag] == 2020) { // update screen selection @@ -278,7 +391,6 @@ static PreferencesController *prefs = nil; } else if ( effectTag == 2103 ) { [sw setEntryEffect:[[[ITSlideHorizontallyWindowEffect alloc] initWithWindow:sw] autorelease]]; } else if ( effectTag == 2104 ) { - NSLog(@"dflhgldf"); [sw setEntryEffect:[[[ITPivotWindowEffect alloc] initWithWindow:sw] autorelease]]; } @@ -317,10 +429,64 @@ static PreferencesController *prefs = nil; [sw setExitDelay:[sender floatValue]]; } else if ( [sender tag] == 2080) { [df setBool:SENDER_STATE forKey:@"showSongInfoOnChange"]; + } else if ( [sender tag] == 2090) { + + int setting = [sender indexOfSelectedItem]; + + if ( setting == 0 ) { + [(ITTSWBackgroundView *)[sw contentView] setBackgroundMode:ITTSWBackgroundApple]; + [backgroundColorWell setEnabled:NO]; + [backgroundColorPopup setEnabled:NO]; + } else if ( setting == 1 ) { + [(ITTSWBackgroundView *)[sw contentView] setBackgroundMode:ITTSWBackgroundReadable]; + [backgroundColorWell setEnabled:NO]; + [backgroundColorPopup setEnabled:NO]; + } else if ( setting == 2 ) { + [(ITTSWBackgroundView *)[sw contentView] setBackgroundMode:ITTSWBackgroundColored]; + [backgroundColorWell setEnabled:YES]; + [backgroundColorPopup setEnabled:YES]; + } + + [df setInteger:setting forKey:@"statusWindowBackgroundMode"]; + + } else if ( [sender tag] == 2091) { + [self setCustomColor:[sender color] updateWell:NO]; + } else if ( [sender tag] == 2092) { + + int selectedItem = [sender indexOfSelectedItem]; + + if ( selectedItem == 1 ) { // An NSPopUpButton in PullDown mode uses item 0 as its title. Its first selectable item is 1. + [self setCustomColor:[NSColor colorWithCalibratedRed:0.92549 green:0.686275 blue:0.0 alpha:1.0] updateWell:YES]; + } else if ( selectedItem == 2 ) { + [self setCustomColor:[NSColor colorWithCalibratedRed:0.380392 green:0.670588 blue:0.0 alpha:1.0] updateWell:YES]; + } else if ( selectedItem == 3 ) { + [self setCustomColor:[NSColor colorWithCalibratedRed:0.443137 green:0.231373 blue:0.619608 alpha:1.0] updateWell:YES]; + } else if ( selectedItem == 4 ) { + [self setCustomColor:[NSColor colorWithCalibratedRed:0.831373 green:0.12549 blue:0.509804 alpha:1.0] updateWell:YES]; + } else if ( selectedItem == 5 ) { + [self setCustomColor:[NSColor colorWithCalibratedRed:0.00784314 green:0.611765 blue:0.662745 alpha:1.0] updateWell:YES]; + } else { + [self setCustomColor:[NSColor colorWithCalibratedWhite:0.15 alpha:0.70] updateWell:YES]; + } + + } else if ( [sender tag] == 2095) { + [sw vanish:self]; + [df setInteger:[sender indexOfSelectedItem] forKey:@"statusWindowSizing"]; } + [df synchronize]; } +- (void)setCustomColor:(NSColor *)color updateWell:(BOOL)update +{ + [(ITTSWBackgroundView *)[[StatusWindow sharedWindow] contentView] setBackgroundColor:color]; + [df setObject:[NSArchiver archivedDataWithRootObject:color] forKey:@"statusWindowBackgroundColor"]; + + if ( update ) { + [backgroundColorWell setColor:color]; + } +} + - (void)registerDefaults { BOOL found = NO; @@ -354,8 +520,12 @@ static PreferencesController *prefs = nil; [df setFloat:0.8 forKey:@"statusWindowAppearanceSpeed"]; [df setFloat:0.8 forKey:@"statusWindowVanishSpeed"]; [df setFloat:4.0 forKey:@"statusWindowVanishDelay"]; + [df setInteger:(int)ITWindowPositionBottom forKey:@"statusWindowVerticalPosition"]; + [df setInteger:(int)ITWindowPositionLeft forKey:@"statusWindowHorizontalPosition"]; [df setBool:YES forKey:@"showSongInfoOnChange"]; - + + [df setObject:[NSArchiver archivedDataWithRootObject:[NSColor blueColor]] forKey:@"statusWindowBackgroundColor"]; + [df synchronize]; loginWindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy]; @@ -414,6 +584,17 @@ static PreferencesController *prefs = nil; } } +- (void)resetRemotePlayerTextFields +{ + if ([[NetworkController sharedController] isConnectedToServer]) { + [selectedPlayerTextField setStringValue:[[[NetworkController sharedController] networkObject] serverName]]; + [locationTextField setStringValue:[[NetworkController sharedController] remoteHost]]; + } else { + [selectedPlayerTextField setStringValue:@"No shared player selected."]; + [locationTextField setStringValue:@"-"]; + } +} + /*************************************************************************/ #pragma mark - #pragma mark HOTKEY SUPPORT METHODS @@ -552,6 +733,9 @@ static PreferencesController *prefs = nil; NSMutableDictionary *loginwindow; NSMutableArray *loginarray; NSEnumerator *loginEnum, *keyArrayEnum; + NSString *serverName; + NSData *colorData; + int selectedBGStyle; id anItem; ITDebugLog(@"Setting up preferences UI."); @@ -605,29 +789,70 @@ static PreferencesController *prefs = nil; [appearanceSpeedSlider setFloatValue:-([df floatForKey:@"statusWindowAppearanceSpeed"])]; [vanishSpeedSlider setFloatValue:-([df floatForKey:@"statusWindowVanishSpeed"])]; [vanishDelaySlider setFloatValue:[df floatForKey:@"statusWindowVanishDelay"]]; - [showOnChangeCheckbox setState:([df boolForKey:@"showSongInfoOnChange"] ? NSOnState : NSOffState)]; + + // Setup General Controls + selectedBGStyle = [df integerForKey:@"statusWindowBackgroundMode"]; + [backgroundStylePopup selectItem:[backgroundStylePopup itemAtIndex:[backgroundStylePopup indexOfItemWithTag:selectedBGStyle]]]; + + if ( selectedBGStyle == ITTSWBackgroundColored ) { + [backgroundColorWell setEnabled:YES]; + [backgroundColorPopup setEnabled:YES]; + } else { + [backgroundColorWell setEnabled:NO]; + [backgroundColorPopup setEnabled:NO]; + } + + colorData = [df dataForKey:@"statusWindowBackgroundColor"]; + + if ( colorData ) { + [backgroundColorWell setColor:(NSColor *)[NSUnarchiver unarchiveObjectWithData:colorData]]; + } else { + [backgroundColorWell setColor:[NSColor blueColor]]; + } + + [showOnChangeCheckbox setState:([df boolForKey:@"showSongInfoOnChange"] ? NSOnState : NSOffState)]; + + [windowSizingPopup selectItem:[windowSizingPopup itemAtIndex:[windowSizingPopup indexOfItemWithTag:[df integerForKey:@"statusWindowSizing"]]]]; + // Setup the sharing controls if ([df boolForKey:@"enableSharing"]) { [shareMenuTunesCheckbox setState:NSOnState]; [useSharedMenuTunesCheckbox setEnabled:NO]; [selectSharedPlayerButton setEnabled:NO]; - [hostTextField setEnabled:NO]; + [passwordTextField setEnabled:YES]; + [usePasswordCheckbox setEnabled:YES]; + [nameTextField setEnabled:YES]; } else if ([df boolForKey:@"useSharedPlayer"]) { [useSharedMenuTunesCheckbox setState:NSOnState]; [shareMenuTunesCheckbox setEnabled:NO]; - [sharePasswordCheckbox setEnabled:NO]; - [sharePasswordTextField setEnabled:NO]; + [selectSharedPlayerButton setEnabled:YES]; } [[NSNotificationCenter defaultCenter] addObserver:sharingTableView selector:@selector(reloadData) name:@"ITMTFoundNetService" object:nil]; + serverName = [df stringForKey:@"sharedPlayerName"]; + if (!serverName || [serverName length] == 0) { + serverName = @"MenuTunes Shared Player"; + } + [nameTextField setStringValue:serverName]; + [selectPlayerBox setContentView:zeroConfView]; - [sharePasswordCheckbox setState:([df boolForKey:@"enableSharingPassword"] ? NSOnState : NSOffState)]; - //[sharePasswordTextField setStringValue:@""]; //DO THIS LATER + [usePasswordCheckbox setState:([df boolForKey:@"enableSharingPassword"] ? NSOnState : NSOffState)]; + if ([df dataForKey:@"sharedPlayerPassword"]) { + [passwordTextField setStringValue:@"password"]; + } if ([df stringForKey:@"sharedPlayerHost"]) { [hostTextField setStringValue:[df stringForKey:@"sharedPlayerHost"]]; } + + if ([[NetworkController sharedController] isConnectedToServer]) { + [selectedPlayerTextField setStringValue:[[[NetworkController sharedController] networkObject] serverName]]; + [locationTextField setStringValue:[[NetworkController sharedController] remoteHost]]; + } else { + [selectedPlayerTextField setStringValue:@"No shared player selected."]; + [locationTextField setStringValue:@"-"]; + } } - (IBAction)changeMenus:(id)sender @@ -678,6 +903,21 @@ static PreferencesController *prefs = nil; [(MainController *)controller closePreferences]; } +/*************************************************************************/ +#pragma mark - +#pragma mark NSTextField DELEGATE METHODS +/*************************************************************************/ + +- (void)controlTextDidChange:(NSNotification*)note +{ + if ([note object] == hostTextField) { + if ([[hostTextField stringValue] length] == 0) { + [sharingPanelOKButton setEnabled:NO]; + } else { + [sharingPanelOKButton setEnabled:YES]; + } + } +} /*************************************************************************/ #pragma mark - @@ -703,7 +943,7 @@ static PreferencesController *prefs = nil; NSString *object = [myItems objectAtIndex:rowIndex]; if ([[aTableColumn identifier] isEqualToString:@"name"]) { if ([object isEqualToString:@"showPlayer"]) { - NSString *string; + NSString *string = nil; NS_DURING string = [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"show", @"Show"), [[controller currentRemote] playerSimpleName]]; NS_HANDLER @@ -724,7 +964,7 @@ static PreferencesController *prefs = nil; NSString *object = [availableItems objectAtIndex:rowIndex]; if ([[aTableColumn identifier] isEqualToString:@"name"]) { if ([object isEqualToString:@"showPlayer"]) { - NSString *string; + NSString *string = nil; NS_DURING string = [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"show", @"Show"), [[controller currentRemote] playerSimpleName]]; NS_HANDLER @@ -747,11 +987,7 @@ static PreferencesController *prefs = nil; return [[hotKeysDictionary objectForKey:[hotKeysArray objectAtIndex:rowIndex]] description]; } } else { - if ([[aTableColumn identifier] isEqualToString:@"name"]) { - return [[[[NetworkController sharedController] remoteServices] objectAtIndex:rowIndex] objectForKey:@"name"]; - } else { - return @"X"; - } + return [[[[NetworkController sharedController] remoteServices] objectAtIndex:rowIndex] name]; } }