X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/24a440dccb5f6edb1e324e1cba03f373f89d0c30..e8516aa003a65e030ec6f7c4007ed04efa351477:/PreferencesController.m?ds=sidebyside diff --git a/PreferencesController.m b/PreferencesController.m index 3f3a8b3..a7c909e 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -1,6 +1,9 @@ #import "PreferencesController.h" #import "MainController.h" #import "HotKeyCenter.h" +#import + +#define SENDER_STATE (([sender state] == NSOnState) ? YES : NO) /*************************************************************************/ #pragma mark - @@ -12,6 +15,8 @@ - (void)setupCustomizationTables; - (void)setupMenuItems; - (void)setupUI; +- (IBAction)changeMenus:(id)sender; +- (void)setLaunchesAtLogin:(BOOL)flag; @end @@ -43,6 +48,7 @@ static PreferencesController *prefs = nil; { if ( (self = [super init]) ) { df = [[NSUserDefaults standardUserDefaults] retain]; + hotKeysDictionary = [[NSMutableDictionary alloc] init]; controller = nil; } return self; @@ -79,6 +85,10 @@ static PreferencesController *prefs = nil; [self setupMenuItems]; // Setup the arrays of menu items [self setupUI]; // Sets up additional UI [window setDelegate:self]; + [menuTableView reloadData]; + + //Change the launch player checkbox to the proper name + [launchPlayerAtLaunchCheckbox setTitle:[NSString stringWithFormat:@"Launch %@ when MenuTunes launches", [[controller currentRemote] playerSimpleName]]]; //This isn't localized... } [window setLevel:NSStatusWindowLevel]; @@ -87,100 +97,110 @@ static PreferencesController *prefs = nil; [NSApp activateIgnoringOtherApps:YES]; } -- (IBAction)apply:(id)sender +- (IBAction)changeGeneralSetting:(id)sender { - [df setObject:myItems forKey:@"menu"]; - - //Set key combos - [df setKeyCombo:playPauseCombo forKey:@"PlayPause"]; - [df setKeyCombo:nextTrackCombo forKey:@"NextTrack"]; - [df setKeyCombo:prevTrackCombo forKey:@"PrevTrack"]; - [df setKeyCombo:trackInfoCombo forKey:@"TrackInfo"]; - [df setKeyCombo:upcomingSongsCombo forKey:@"UpcomingSongs"]; - [df setKeyCombo:volumeIncrementCombo forKey:@"IncrementVolume"]; - [df setKeyCombo:volumeDecrementCombo forKey:@"DecrementVolume"]; - [df setKeyCombo:ratingIncrementCombo forKey:@"IncrementRating"]; - [df setKeyCombo:ratingDecrementCombo forKey:@"DecrementRating"]; - [df setKeyCombo:toggleLoopCombo forKey:@"ToggleLoop"]; - [df setKeyCombo:toggleShuffleCombo forKey:@"ToggleShuffle"]; - - //Set info checkboxes - [df setBool:[albumCheckbox state] forKey:@"showAlbum"]; - [df setBool:[nameCheckbox state] forKey:@"showName"]; - [df setBool:[artistCheckbox state] forKey:@"showArtist"]; - [df setBool:[trackTimeCheckbox state] forKey:@"showTime"]; - - //Here we set whether we will launch at login by modifying loginwindow.plist - if ([launchAtLoginCheckbox state] == NSOnState) { - NSMutableDictionary *loginwindow; - NSMutableArray *loginarray; - ComponentInstance temp = OpenDefaultComponent(kOSAComponentType, kAppleScriptSubtype);; - int i; - BOOL skip = NO; - - [df synchronize]; - loginwindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy]; - loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; - - for (i = 0; i < [loginarray count]; i++) { - NSDictionary *tempDict = [loginarray objectAtIndex:i]; - if ([[[tempDict objectForKey:@"Path"] lastPathComponent] isEqualToString:[[[NSBundle mainBundle] bundlePath] lastPathComponent]]) { - skip = YES; - } - } - - if (!skip) { - AEDesc scriptDesc, resultDesc; - NSString *script = [NSString stringWithFormat:@"tell application \"System Events\"\nmake new login item at end of login items with properties {path:\"%@\", kind:\"APPLICATION\"}\nend tell", [[NSBundle mainBundle] bundlePath]]; - - AECreateDesc(typeChar, [script cString], [script cStringLength], - &scriptDesc); - - OSADoScript(temp, &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc); - - AEDisposeDesc(&scriptDesc); - AEDisposeDesc(&resultDesc); - CloseComponent(temp); - } - } else { - NSMutableDictionary *loginwindow; - NSMutableArray *loginarray; - int i; - - [df synchronize]; - loginwindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy]; - loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; - - for (i = 0; i < [loginarray count]; i++) { - NSDictionary *tempDict = [loginarray objectAtIndex:i]; - if ([[[tempDict objectForKey:@"Path"] lastPathComponent] isEqualToString:[[[NSBundle mainBundle] bundlePath] lastPathComponent]]) { - [loginarray removeObjectAtIndex:i]; - [df setPersistentDomain:loginwindow forName:@"loginwindow"]; - [df synchronize]; - break; - } - } + if ( [sender tag] == 1010) { + [self setLaunchesAtLogin:SENDER_STATE]; + } else if ( [sender tag] == 1020) { + [df setBool:SENDER_STATE forKey:@"LaunchPlayerWithMT"]; + } else if ( [sender tag] == 1030) { + [df setInteger:[sender intValue] forKey:@"SongsInAdvance"]; + + } else if ( [sender tag] == 1040) { + // This will not be executed. Song info always shows the title of the song. + // [df setBool:SENDER_STATE forKey:@"showName"]; + } else if ( [sender tag] == 1050) { + [df setBool:SENDER_STATE forKey:@"showArtist"]; + } else if ( [sender tag] == 1060) { + [df setBool:SENDER_STATE forKey:@"showAlbum"]; + } else if ( [sender tag] == 1070) { + [df setBool:SENDER_STATE forKey:@"showTime"]; + } else if ( [sender tag] == 1080) { + [df setBool:SENDER_STATE forKey:@"showTrackNumber"]; + } else if ( [sender tag] == 1090) { + [df setBool:SENDER_STATE forKey:@"showTrackRating"]; } - - //Set songs in advance - if ([songsInAdvance intValue]) { - [df setInteger:[songsInAdvance intValue] forKey:@"SongsInAdvance"]; - } else { - [df setInteger:5 forKey:@"SongsInAdvance"]; + [df synchronize]; +} + +- (IBAction)changeStatusWindowSetting:(id)sender +{ + if ( [sender tag] == 2010) { + [df setInteger:[sender selectedRow] forKey:@"statusWindowVerticalPosition"]; + [df setInteger:[sender selectedColumn] forKey:@"statusWindowHorizontalPosition"]; + // update the window's position here + } else if ( [sender tag] == 2020) { + // update screen selection + } else if ( [sender tag] == 2030) { + // Update appearance effect + } else if ( [sender tag] == 2040) { + // Update Vanish Effect + } else if ( [sender tag] == 2050) { + // Update appearance speed + } else if ( [sender tag] == 2060) { + // Update vanish speed + } else if ( [sender tag] == 2070) { + // Update vanish delay + } else if ( [sender tag] == 2080) { + // Update "Song Info window when song changes" setting. + [df setBool:SENDER_STATE forKey:@"showSongInfoOnChange"]; } - - /*{ - NSArray *apps = [[NSWorkspace sharedWorkspace] launchedApplications]; - int i; - - for (i = 0; i < [apps count]; i++) { - if ([[[apps objectAtIndex:i] objectForKey:@"NSApplicationName"] - isEqualToString:@"iTunes"]) { - [controller rebuildMenu]; - } - } - }*/ +} + +- (IBAction)changeHotKey:(id)sender +{ [controller clearHotKeys]; + switch ([sender tag]) + { + case 4010: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"PlayPause"]]; + [self setCurrentHotKey:@"PlayPause"]; + break; + case 4020: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"NextTrack"]]; + [self setCurrentHotKey:@"NextTrack"]; + break; + case 4030: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"PrevTrack"]]; + [self setCurrentHotKey:@"PrevTrack"]; + break; + case 4035: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"ShowPlayer"]]; + [self setCurrentHotKey:@"ShowPlayer"]; + break; + case 4040: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"ToggleLoop"]]; + [self setCurrentHotKey:@"ToggleLoop"]; + break; + case 4050: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"ToggleShuffle"]]; + [self setCurrentHotKey:@"ToggleShuffle"]; + break; + case 4060: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"TrackInfo"]]; + [self setCurrentHotKey:@"TrackInfo"]; + break; + case 4070: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"UpcomingSongs"]]; + [self setCurrentHotKey:@"UpcomingSongs"]; + break; + case 4080: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"IncrementVolume"]]; + [self setCurrentHotKey:@"IncrementVolume"]; + break; + case 4090: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"DecrementVolume"]]; + [self setCurrentHotKey:@"DecrementVolume"]; + break; + case 4100: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"IncrementRating"]]; + [self setCurrentHotKey:@"IncrementRating"]; + break; + case 4110: + [self setKeyCombo:[hotKeysDictionary objectForKey:@"DecrementRating"]]; + [self setCurrentHotKey:@"DecrementRating"]; + break; + } } - (void)registerDefaults @@ -192,25 +212,26 @@ static PreferencesController *prefs = nil; id anItem; [df setObject:[NSArray arrayWithObjects: - @"Play/Pause", - @"Next Track", - @"Previous Track", - @"Fast Forward", - @"Rewind", - @"Show Player", - @"", - @"Upcoming Songs", - @"Playlists", - @"Song Rating", - @"", - @"PreferencesÉ", - @"Quit", - @"", - @"Current Track Info", + @"playPause", + @"prevTrack", + @"nextTrack", + @"fastForward", + @"rewind", + @"showPlayer", + @"separator", + @"songRating", + @"eqPresets", + @"playlists", + @"upcomingSongs", + @"separator", + @"preferences", + @"quit", + @"separator", + @"trackInfo", nil] forKey:@"menu"]; [df setInteger:5 forKey:@"SongsInAdvance"]; - [df setBool:YES forKey:@"showName"]; + // [df setBool:YES forKey:@"showName"]; // Song info will always show song title. [df setBool:YES forKey:@"showArtist"]; [df setBool:NO forKey:@"showAlbum"]; [df setBool:NO forKey:@"showTime"]; @@ -232,7 +253,7 @@ static PreferencesController *prefs = nil; // This is teh sux // We must fix it so it is no longer suxy if (!found) { - if (NSRunInformationalAlertPanel(@"Auto-launch MenuTunes", @"Would you like MenuTunes to automatically launch at login?", @"Yes", @"No", nil) == NSOKButton) { + if (NSRunInformationalAlertPanel(NSLocalizedString(@"autolaunch", @"Auto-launch MenuTunes"), NSLocalizedString(@"autolaunch_msg", @"Would you like MenuTunes to automatically launch at login?"), @"Yes", @"No", nil) == NSOKButton) { AEDesc scriptDesc, resultDesc; NSString *script = [NSString stringWithFormat:@"tell application \"System Events\"\nmake new login item at end of login items with properties {path:\"%@\", kind:\"APPLICATION\"}\nend tell", [[NSBundle mainBundle] bundlePath]]; ComponentInstance asComponent = OpenDefaultComponent(kOSAComponentType, kAppleScriptSubtype); @@ -265,230 +286,98 @@ static PreferencesController *prefs = nil; - (IBAction)okHotKey:(id)sender { NSString *string = [combo userDisplayRep]; + NSEnumerator *enumerator = [hotKeysDictionary keyEnumerator]; + NSString *enumKey; if (string == nil) { string = @""; } - if ([setHotKey isEqualToString:@"PlayPause"]) { - if (([combo isEqual:nextTrackCombo] || [combo isEqual:prevTrackCombo] || - [combo isEqual:trackInfoCombo] || [combo isEqual:upcomingSongsCombo] || - [combo isEqual:ratingIncrementCombo] || [combo isEqual:ratingDecrementCombo] || - [combo isEqual:volumeIncrementCombo] || [combo isEqual:volumeDecrementCombo] || - [combo isEqual:toggleLoopCombo] || [combo isEqual:toggleShuffleCombo]) && - !(([combo modifiers] == -1) && ([combo keyCode] == -1))) { - - [window setLevel:NSNormalWindowLevel]; - NSRunAlertPanel(@"Duplicate Key Combo", @"Please choose a unique key combo.", @"OK", nil, nil, nil); - [window setLevel:NSStatusWindowLevel]; - return; + + while ( (enumKey = [enumerator nextObject]) ) { + if (![enumKey isEqualToString:currentHotKey]) { + if (![combo isEqual:[KeyCombo clearKeyCombo]] && + [combo isEqual:[hotKeysDictionary objectForKey:enumKey]]) { + [window setLevel:NSNormalWindowLevel]; + if ( NSRunAlertPanel(NSLocalizedString(@"duplicateCombo", @"Duplicate Key Combo") , NSLocalizedString(@"duplicateCombo_msg", @"The specified key combo is already in use..."), NSLocalizedString(@"replace", @"Replace"), NSLocalizedString(@"cancel", @"Cancel"), nil) ) { + [hotKeysDictionary setObject:[KeyCombo clearKeyCombo] forKey:currentHotKey]; + if ([enumKey isEqualToString:@"PlayPause"]) { + [playPauseButton setTitle:@""]; + } else if ([enumKey isEqualToString:@"NextTrack"]) { + [nextTrackButton setTitle:@""]; + } else if ([enumKey isEqualToString:@"PrevTrack"]) { + [previousTrackButton setTitle:@""]; + } else if ([enumKey isEqualToString:@"ShowPlayer"]) { + [showPlayerButton setTitle:@""]; + } else if ([enumKey isEqualToString:@"TrackInfo"]) { + [trackInfoButton setTitle:@""]; + } else if ([enumKey isEqualToString:@"UpcomingSongs"]) { + [upcomingSongsButton setTitle:@""]; + } else if ([enumKey isEqualToString:@"IncrementVolume"]) { + [volumeIncrementButton setTitle:@""]; + } else if ([enumKey isEqualToString:@"DecrementVolume"]) { + [volumeDecrementButton setTitle:@""]; + } else if ([enumKey isEqualToString:@"IncrementRating"]) { + [ratingIncrementButton setTitle:@""]; + } else if ([enumKey isEqualToString:@"DecrementRating"]) { + [ratingDecrementButton setTitle:@""]; + } else if ([enumKey isEqualToString:@"ToggleShuffle"]) { + [toggleShuffleButton setTitle:@""]; + } else if ([enumKey isEqualToString:@"ToggleLoop"]) { + [toggleLoopButton setTitle:@""]; + } + [df setKeyCombo:[KeyCombo clearKeyCombo] forKey:enumKey]; + } else { + return; + } + [window setLevel:NSStatusWindowLevel]; + } } - playPauseCombo = [combo copy]; + } + + [hotKeysDictionary setObject:combo forKey:currentHotKey]; + [df setKeyCombo:combo forKey:currentHotKey]; + + if ([currentHotKey isEqualToString:@"PlayPause"]) { [playPauseButton setTitle:string]; - } else if ([setHotKey isEqualToString:@"NextTrack"]) { - if (([combo isEqual:playPauseCombo] || [combo isEqual:prevTrackCombo] || - [combo isEqual:trackInfoCombo] || [combo isEqual:upcomingSongsCombo] || - [combo isEqual:ratingIncrementCombo] || [combo isEqual:ratingDecrementCombo] || - [combo isEqual:volumeIncrementCombo] || [combo isEqual:volumeDecrementCombo] || - [combo isEqual:toggleLoopCombo] || [combo isEqual:toggleShuffleCombo]) && - !(([combo modifiers] == -1) && ([combo keyCode] == -1))) { - - [window setLevel:NSNormalWindowLevel]; - NSRunAlertPanel(@"Duplicate Key Combo", @"Please choose a unique key combo.", @"OK", nil, nil, nil); - [window setLevel:NSStatusWindowLevel]; - return; - } - nextTrackCombo = [combo copy]; + //[[HotKeyCenter sharedCenter] addHotKey:@"PlayPause" combo:combo target:[MainController sharedController] action:@selector(playPause)]; + } else if ([currentHotKey isEqualToString:@"NextTrack"]) { [nextTrackButton setTitle:string]; - } else if ([setHotKey isEqualToString:@"PrevTrack"]) { - if (([combo isEqual:nextTrackCombo] || [combo isEqual:playPauseCombo] || - [combo isEqual:trackInfoCombo] || [combo isEqual:upcomingSongsCombo] || - [combo isEqual:ratingIncrementCombo] || [combo isEqual:ratingDecrementCombo] || - [combo isEqual:volumeIncrementCombo] || [combo isEqual:volumeDecrementCombo] || - [combo isEqual:toggleLoopCombo] || [combo isEqual:toggleShuffleCombo]) && - !(([combo modifiers] == -1) && ([combo keyCode] == -1))) { - - [window setLevel:NSNormalWindowLevel]; - NSRunAlertPanel(@"Duplicate Key Combo", @"Please choose a unique key combo.", @"OK", nil, nil, nil); - [window setLevel:NSStatusWindowLevel]; - return; - } - prevTrackCombo = [combo copy]; + //[[HotKeyCenter sharedCenter] addHotKey:@"NextTrack" combo:combo target:[MainController sharedController] action:@selector(nextSong)]; + } else if ([currentHotKey isEqualToString:@"PrevTrack"]) { [previousTrackButton setTitle:string]; - } else if ([setHotKey isEqualToString:@"TrackInfo"]) { - if (([combo isEqual:nextTrackCombo] || [combo isEqual:prevTrackCombo] || - [combo isEqual:playPauseCombo] || [combo isEqual:upcomingSongsCombo] || - [combo isEqual:ratingIncrementCombo] || [combo isEqual:ratingDecrementCombo] || - [combo isEqual:volumeIncrementCombo] || [combo isEqual:volumeDecrementCombo] || - [combo isEqual:toggleLoopCombo] || [combo isEqual:toggleShuffleCombo]) && - !(([combo modifiers] == -1) && ([combo keyCode] == -1))) { - - [window setLevel:NSNormalWindowLevel]; - NSRunAlertPanel(@"Duplicate Key Combo", @"Please choose a unique key combo.", @"OK", nil, nil, nil); - [window setLevel:NSStatusWindowLevel]; - return; - } - trackInfoCombo = [combo copy]; + //[[HotKeyCenter sharedCenter] addHotKey:@"PrevTrack" combo:combo target:[MainController sharedController] action:@selector(prevSong)]; + } else if ([currentHotKey isEqualToString:@"ShowPlayer"]) { + [showPlayerButton setTitle:string]; + //[[HotKeyCenter sharedCenter] addHotKey:@"ShowPlayer" combo:combo target:[MainController sharedController] action:@selector(showPlayer)]; + } else if ([currentHotKey isEqualToString:@"TrackInfo"]) { [trackInfoButton setTitle:string]; - } else if ([setHotKey isEqualToString:@"UpcomingSongs"]) { - if (([combo isEqual:nextTrackCombo] || [combo isEqual:prevTrackCombo] || - [combo isEqual:trackInfoCombo] || [combo isEqual:playPauseCombo] || - [combo isEqual:ratingIncrementCombo] || [combo isEqual:ratingDecrementCombo] || - [combo isEqual:volumeIncrementCombo] || [combo isEqual:volumeDecrementCombo] || - [combo isEqual:toggleLoopCombo] || [combo isEqual:toggleShuffleCombo]) && - !(([combo modifiers] == -1) && ([combo keyCode] == -1))) { - - [window setLevel:NSNormalWindowLevel]; - NSRunAlertPanel(@"Duplicate Key Combo", @"Please choose a unique key combo.", @"OK", nil, nil, nil); - [window setLevel:NSStatusWindowLevel]; - return; - } - upcomingSongsCombo = [combo copy]; + //[[HotKeyCenter sharedCenter] addHotKey:@"TrackInfo" combo:combo target:[MainController sharedController] action:@selector(showCurrentTrackInfo)]; + } else if ([currentHotKey isEqualToString:@"UpcomingSongs"]) { [upcomingSongsButton setTitle:string]; - //THE NEW COMBOS! - } else if ([setHotKey isEqualToString:@"IncrementVolume"]) { - if (([combo isEqual:nextTrackCombo] || [combo isEqual:prevTrackCombo] || - [combo isEqual:trackInfoCombo] || [combo isEqual:playPauseCombo] || - [combo isEqual:ratingIncrementCombo] || [combo isEqual:ratingDecrementCombo] || - [combo isEqual:upcomingSongsCombo] || [combo isEqual:volumeDecrementCombo] || - [combo isEqual:toggleLoopCombo] || [combo isEqual:toggleShuffleCombo]) && - !(([combo modifiers] == -1) && ([combo keyCode] == -1))) { - - [window setLevel:NSNormalWindowLevel]; - NSRunAlertPanel(@"Duplicate Key Combo", @"Please choose a unique key combo.", @"OK", nil, nil, nil); - [window setLevel:NSStatusWindowLevel]; - return; - } - volumeIncrementCombo = [combo copy]; + //[[HotKeyCenter sharedCenter] addHotKey:@"UpcomingSongs" combo:combo target:[MainController sharedController] action:@selector(showUpcomingSongs)]; + } else if ([currentHotKey isEqualToString:@"IncrementVolume"]) { [volumeIncrementButton setTitle:string]; - } else if ([setHotKey isEqualToString:@"DecrementVolume"]) { - if (([combo isEqual:nextTrackCombo] || [combo isEqual:prevTrackCombo] || - [combo isEqual:trackInfoCombo] || [combo isEqual:playPauseCombo] || - [combo isEqual:ratingIncrementCombo] || [combo isEqual:ratingDecrementCombo] || - [combo isEqual:volumeIncrementCombo] || [combo isEqual:upcomingSongsCombo] || - [combo isEqual:toggleLoopCombo] || [combo isEqual:toggleShuffleCombo]) && - !(([combo modifiers] == -1) && ([combo keyCode] == -1))) { - - [window setLevel:NSNormalWindowLevel]; - NSRunAlertPanel(@"Duplicate Key Combo", @"Please choose a unique key combo.", @"OK", nil, nil, nil); - [window setLevel:NSStatusWindowLevel]; - return; - } - volumeDecrementCombo = [combo copy]; + //[[HotKeyCenter sharedCenter] addHotKey:@"IncrementVolume" combo:combo target:[MainController sharedController] action:@selector(incrementVolume)]; + } else if ([currentHotKey isEqualToString:@"DecrementVolume"]) { [volumeDecrementButton setTitle:string]; - } else if ([setHotKey isEqualToString:@"IncrementRating"]) { - if (([combo isEqual:nextTrackCombo] || [combo isEqual:prevTrackCombo] || - [combo isEqual:trackInfoCombo] || [combo isEqual:playPauseCombo] || - [combo isEqual:upcomingSongsCombo] || [combo isEqual:ratingDecrementCombo] || - [combo isEqual:volumeIncrementCombo] || [combo isEqual:volumeDecrementCombo] || - [combo isEqual:toggleLoopCombo] || [combo isEqual:toggleShuffleCombo]) && - !(([combo modifiers] == -1) && ([combo keyCode] == -1))) { - - [window setLevel:NSNormalWindowLevel]; - NSRunAlertPanel(@"Duplicate Key Combo", @"Please choose a unique key combo.", @"OK", nil, nil, nil); - [window setLevel:NSStatusWindowLevel]; - return; - } - ratingIncrementCombo = [combo copy]; + //[[HotKeyCenter sharedCenter] addHotKey:@"DecrementVolume" combo:combo target:[MainController sharedController] action:@selector(decrementVolume)]; + } else if ([currentHotKey isEqualToString:@"IncrementRating"]) { [ratingIncrementButton setTitle:string]; - } else if ([setHotKey isEqualToString:@"DecrementRating"]) { - if (([combo isEqual:nextTrackCombo] || [combo isEqual:prevTrackCombo] || - [combo isEqual:trackInfoCombo] || [combo isEqual:playPauseCombo] || - [combo isEqual:ratingIncrementCombo] || [combo isEqual:upcomingSongsCombo] || - [combo isEqual:volumeIncrementCombo] || [combo isEqual:volumeDecrementCombo] || - [combo isEqual:toggleLoopCombo] || [combo isEqual:toggleShuffleCombo]) && - !(([combo modifiers] == -1) && ([combo keyCode] == -1))) { - - [window setLevel:NSNormalWindowLevel]; - NSRunAlertPanel(@"Duplicate Key Combo", @"Please choose a unique key combo.", @"OK", nil, nil, nil); - [window setLevel:NSStatusWindowLevel]; - return; - } - ratingDecrementCombo = [combo copy]; + //[[HotKeyCenter sharedCenter] addHotKey:@"IncrementRating" combo:combo target:[MainController sharedController] action:@selector(incrementRating)]; + } else if ([currentHotKey isEqualToString:@"DecrementRating"]) { [ratingDecrementButton setTitle:string]; - } else if ([setHotKey isEqualToString:@"ToggleLoop"]) { - if (([combo isEqual:nextTrackCombo] || [combo isEqual:prevTrackCombo] || - [combo isEqual:trackInfoCombo] || [combo isEqual:playPauseCombo] || - [combo isEqual:ratingIncrementCombo] || [combo isEqual:ratingDecrementCombo] || - [combo isEqual:volumeIncrementCombo] || [combo isEqual:volumeDecrementCombo] || - [combo isEqual:upcomingSongsCombo] || [combo isEqual:toggleShuffleCombo]) && - !(([combo modifiers] == -1) && ([combo keyCode] == -1))) { - - [window setLevel:NSNormalWindowLevel]; - NSRunAlertPanel(@"Duplicate Key Combo", @"Please choose a unique key combo.", @"OK", nil, nil, nil); - [window setLevel:NSStatusWindowLevel]; - return; - } - toggleLoopCombo = [combo copy]; - [toggleLoopButton setTitle:string]; - } else if ([setHotKey isEqualToString:@"ToggleShuffle"]) { - if (([combo isEqual:nextTrackCombo] || [combo isEqual:prevTrackCombo] || - [combo isEqual:trackInfoCombo] || [combo isEqual:playPauseCombo] || - [combo isEqual:ratingIncrementCombo] || [combo isEqual:ratingDecrementCombo] || - [combo isEqual:volumeIncrementCombo] || [combo isEqual:volumeDecrementCombo] || - [combo isEqual:toggleLoopCombo] || [combo isEqual:upcomingSongsCombo]) && - !(([combo modifiers] == -1) && ([combo keyCode] == -1))) { - - [window setLevel:NSNormalWindowLevel]; - NSRunAlertPanel(@"Duplicate Key Combo", @"Please choose a unique key combo.", @"OK", nil, nil, nil); - [window setLevel:NSStatusWindowLevel]; - return; - } - toggleShuffleCombo = [combo copy]; + //[[HotKeyCenter sharedCenter] addHotKey:@"DecrementRating" combo:combo target:[MainController sharedController] action:@selector(decrementRating)]; + } else if ([currentHotKey isEqualToString:@"ToggleShuffle"]) { [toggleShuffleButton setTitle:string]; + //[[HotKeyCenter sharedCenter] addHotKey:@"ToggleShuffle" combo:combo target:[MainController sharedController] action:@selector(toggleShuffle)]; + } else if ([currentHotKey isEqualToString:@"ToggleLoop"]) { + [toggleLoopButton setTitle:string]; + //[[HotKeyCenter sharedCenter] addHotKey:@"ToggleLoop" combo:combo target:[MainController sharedController] action:@selector(toggleLoop)]; } + [controller setupHotKeys]; [self cancelHotKey:sender]; } -- (IBAction)setNewHotKey:(id)sender -{ - switch ([sender tag]) - { - case 401: - [self setKeyCombo:playPauseCombo]; - [self setHotKey:@"PlayPause"]; - break; - case 402: - [self setKeyCombo:nextTrackCombo]; - [self setHotKey:@"NextTrack"]; - break; - case 403: - [self setKeyCombo:prevTrackCombo]; - [self setHotKey:@"PrevTrack"]; - break; - case 404: - [self setKeyCombo:toggleLoopCombo]; - [self setHotKey:@"ToggleLoop"]; - break; - case 405: - [self setKeyCombo:toggleShuffleCombo]; - [self setHotKey:@"ToggleShuffle"]; - break; - case 406: - [self setKeyCombo:trackInfoCombo]; - [self setHotKey:@"TrackInfo"]; - break; - case 407: - [self setKeyCombo:upcomingSongsCombo]; - [self setHotKey:@"UpcomingSongs"]; - break; - case 408: - [self setKeyCombo:volumeIncrementCombo]; - [self setHotKey:@"IncrementVolume"]; - break; - case 409: - [self setKeyCombo:volumeDecrementCombo]; - [self setHotKey:@"DecrementVolume"]; - break; - case 410: - [self setKeyCombo:ratingIncrementCombo]; - [self setHotKey:@"IncrementRating"]; - break; - case 411: - [self setKeyCombo:ratingDecrementCombo]; - [self setHotKey:@"DecrementRating"]; - break; - } -} /*************************************************************************/ @@ -496,9 +385,10 @@ static PreferencesController *prefs = nil; #pragma mark HOTKEY SUPPORT METHODS /*************************************************************************/ -- (void)setHotKey:(NSString *)key +- (void)setCurrentHotKey:(NSString *)key { - setHotKey = key; + [currentHotKey autorelease]; + currentHotKey = [key copy]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyEvent:) name:@"KeyBroadcasterEvent" object:nil]; [NSApp beginSheet:keyComboPanel modalForWindow:window modalDelegate:self didEndSelector:nil contextInfo:nil]; } @@ -538,8 +428,8 @@ static PreferencesController *prefs = nil; - (void)setupWindow { - if ( ! [NSBundle loadNibNamed:@"Preferences" owner:self] ) { - NSLog( @"Failed to load Preferences.nib" ); + if (![NSBundle loadNibNamed:@"Preferences" owner:self]) { + NSLog(@"MenuTunes: Failed to load Preferences.nib"); NSBeep(); return; } @@ -571,18 +461,18 @@ static PreferencesController *prefs = nil; id anItem; // Set the list of items you can have. availableItems = [[NSMutableArray alloc] initWithObjects: - @"Current Track Info", - @"Upcoming Songs", - @"Playlists", - @"EQ Presets", - @"Song Rating", - @"Play/Pause", - @"Next Track", - @"Previous Track", - @"Fast Forward", - @"Rewind", - @"Show Player", - @"", + @"trackInfo", + @"upcomingSongs", + @"playlists", + @"eqPresets", + @"songRating", + @"playPause", + @"nextTrack", + @"prevTrack", + @"fastForward", + @"rewind", + @"showPlayer", + @"separator", nil]; // Get our preferred menu @@ -591,17 +481,17 @@ static PreferencesController *prefs = nil; // Delete items in the availableItems array that are already part of the menu itemEnum = [myItems objectEnumerator]; while ( (anItem = [itemEnum nextObject]) ) { - if ( ! [anItem isEqualToString:@""] ) { + if (![anItem isEqualToString:@"separator"]) { [availableItems removeObject:anItem]; } } // Items that show should a submenu image submenuItems = [[NSArray alloc] initWithObjects: - @"Upcoming Songs", - @"Playlists", - @"EQ Presets", - @"Song Rating", + @"upcomingSongs", + @"playlists", + @"eqPresets", + @"songRating", nil]; } @@ -611,93 +501,114 @@ static PreferencesController *prefs = nil; NSMutableArray *loginarray; NSEnumerator *loginEnum; id anItem; - + // Fill in the number of songs in advance to show field [songsInAdvance setIntValue:[df integerForKey:@"SongsInAdvance"]]; // Fill in hot key buttons - if ([df objectForKey:@"PlayPause"]){ - playPauseCombo = [df keyComboForKey:@"PlayPause"]; - [playPauseButton setTitle:[playPauseCombo userDisplayRep]]; + if ([df objectForKey:@"PlayPause"]) { + anItem = [df keyComboForKey:@"PlayPause"]; + [hotKeysDictionary setObject:anItem forKey:@"PlayPause"]; + [playPauseButton setTitle:[anItem userDisplayRep]]; } else { - playPauseCombo = [[KeyCombo alloc] init]; + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"PlayPause"]; } if ([df objectForKey:@"NextTrack"]) { - nextTrackCombo = [df keyComboForKey:@"NextTrack"]; - [nextTrackButton setTitle:[nextTrackCombo userDisplayRep]]; + anItem = [df keyComboForKey:@"NextTrack"]; + [hotKeysDictionary setObject:anItem forKey:@"NextTrack"]; + [nextTrackButton setTitle:[anItem userDisplayRep]]; } else { - nextTrackCombo = [[KeyCombo alloc] init]; + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"NextTrack"]; } if ([df objectForKey:@"PrevTrack"]) { - prevTrackCombo = [df keyComboForKey:@"PrevTrack"]; - [previousTrackButton setTitle:[prevTrackCombo userDisplayRep]]; + anItem = [df keyComboForKey:@"PrevTrack"]; + [hotKeysDictionary setObject:anItem forKey:@"PrevTrack"]; + [previousTrackButton setTitle:[anItem userDisplayRep]]; } else { - prevTrackCombo = [[KeyCombo alloc] init]; + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"PrevTrack"]; + } + + if ([df objectForKey:@"ShowPlayer"]) { + anItem = [df keyComboForKey:@"ShowPlayer"]; + [hotKeysDictionary setObject:anItem forKey:@"ShowPlayer"]; + [showPlayerButton setTitle:[anItem userDisplayRep]]; + } else { + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"ShowPlayer"]; } if ([df objectForKey:@"TrackInfo"]) { - trackInfoCombo = [df keyComboForKey:@"TrackInfo"]; - [trackInfoButton setTitle:[trackInfoCombo userDisplayRep]]; + anItem = [df keyComboForKey:@"TrackInfo"]; + [hotKeysDictionary setObject:anItem forKey:@"TrackInfo"]; + [trackInfoButton setTitle:[anItem userDisplayRep]]; } else { - trackInfoCombo = [[KeyCombo alloc] init]; + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"TrackInfo"]; } if ([df objectForKey:@"UpcomingSongs"]) { - upcomingSongsCombo = [df keyComboForKey:@"UpcomingSongs"]; - [upcomingSongsButton setTitle:[upcomingSongsCombo userDisplayRep]]; + anItem = [df keyComboForKey:@"UpcomingSongs"]; + [hotKeysDictionary setObject:anItem forKey:@"UpcomingSongs"]; + [upcomingSongsButton setTitle:[anItem userDisplayRep]]; } else { - upcomingSongsCombo = [[KeyCombo alloc] init]; + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"UpcomingSongs"]; } if ([df objectForKey:@"IncrementVolume"]) { - volumeIncrementCombo = [df keyComboForKey:@"IncrementVolume"]; - [volumeIncrementButton setTitle:[volumeIncrementCombo userDisplayRep]]; + anItem = [df keyComboForKey:@"IncrementVolume"]; + [hotKeysDictionary setObject:anItem forKey:@"IncrementVolume"]; + [volumeIncrementButton setTitle:[anItem userDisplayRep]]; } else { - volumeIncrementCombo = [[KeyCombo alloc] init]; + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"IncrementVolume"]; } if ([df objectForKey:@"DecrementVolume"]) { - volumeDecrementCombo = [df keyComboForKey:@"DecrementVolume"]; - [volumeDecrementButton setTitle:[volumeDecrementCombo userDisplayRep]]; + anItem = [df keyComboForKey:@"DecrementVolume"]; + [hotKeysDictionary setObject:anItem forKey:@"DecrementVolume"]; + [volumeDecrementButton setTitle:[anItem userDisplayRep]]; } else { - volumeDecrementCombo = [[KeyCombo alloc] init]; + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"DecrementVolume"]; } if ([df objectForKey:@"IncrementRating"]) { - ratingIncrementCombo = [df keyComboForKey:@"IncrementRating"]; - [ratingIncrementButton setTitle:[ratingIncrementCombo userDisplayRep]]; + anItem = [df keyComboForKey:@"IncrementRating"]; + [hotKeysDictionary setObject:anItem forKey:@"IncrementRating"]; + [ratingIncrementButton setTitle:[anItem userDisplayRep]]; } else { - ratingIncrementCombo = [[KeyCombo alloc] init]; + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"IncrementRating"]; } if ([df objectForKey:@"DecrementRating"]) { - ratingDecrementCombo = [df keyComboForKey:@"DecrementRating"]; - [ratingDecrementButton setTitle:[ratingDecrementCombo userDisplayRep]]; + anItem = [df keyComboForKey:@"DecrementRating"]; + [hotKeysDictionary setObject:anItem forKey:@"DecrementRating"]; + [ratingDecrementButton setTitle:[anItem userDisplayRep]]; } else { - ratingDecrementCombo = [[KeyCombo alloc] init]; + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"DecrementRating"]; } if ([df objectForKey:@"ToggleLoop"]) { - toggleLoopCombo = [df keyComboForKey:@"ToggleLoop"]; - [toggleLoopButton setTitle:[toggleLoopCombo userDisplayRep]]; + anItem = [df keyComboForKey:@"ToggleLoop"]; + [hotKeysDictionary setObject:anItem forKey:@"ToggleLoop"]; + [toggleLoopButton setTitle:[anItem userDisplayRep]]; } else { - toggleLoopCombo = [[KeyCombo alloc] init]; + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"ToggleLoop"]; } if ([df objectForKey:@"ToggleShuffle"]) { - toggleShuffleCombo = [df keyComboForKey:@"ToggleShuffle"]; - [toggleShuffleButton setTitle:[toggleShuffleCombo userDisplayRep]]; + anItem = [df keyComboForKey:@"ToggleShuffle"]; + [hotKeysDictionary setObject:anItem forKey:@"ToggleShuffle"]; + [toggleShuffleButton setTitle:[anItem userDisplayRep]]; } else { - toggleShuffleCombo = [[KeyCombo alloc] init]; + [hotKeysDictionary setObject:[KeyCombo keyCombo] forKey:@"ToggleShuffle"]; } // Check current track info buttons [albumCheckbox setState:[df boolForKey:@"showAlbum"] ? NSOnState : NSOffState]; - [nameCheckbox setState:[df boolForKey:@"showName"] ? NSOnState : NSOffState]; + [nameCheckbox setState:NSOnState]; // Song info will ALWAYS show song title. + [nameCheckbox setEnabled:NO]; // Song info will ALWAYS show song title. [artistCheckbox setState:[df boolForKey:@"showArtist"] ? NSOnState : NSOffState]; [trackTimeCheckbox setState:[df boolForKey:@"showTime"] ? NSOnState : NSOffState]; + [trackNumberCheckbox setState:[df boolForKey:@"showTrackNumber"] ? NSOnState : NSOffState]; // Set the launch at login checkbox state [df synchronize]; @@ -712,6 +623,67 @@ static PreferencesController *prefs = nil; } } +- (IBAction)changeMenus:(id)sender +{ + [df setObject:myItems forKey:@"menu"]; + [df synchronize]; +} + +- (void)setLaunchesAtLogin:(BOOL)flag +{ + if ( flag ) { + NSMutableDictionary *loginwindow; + NSMutableArray *loginarray; + ComponentInstance temp = OpenDefaultComponent(kOSAComponentType, kAppleScriptSubtype); + int i; + BOOL skip = NO; + + [df synchronize]; + loginwindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy]; + loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; + + for (i = 0; i < [loginarray count]; i++) { + NSDictionary *tempDict = [loginarray objectAtIndex:i]; + if ([[[tempDict objectForKey:@"Path"] lastPathComponent] isEqualToString:[[[NSBundle mainBundle] bundlePath] lastPathComponent]]) { + skip = YES; + } + } + + if (!skip) { + AEDesc scriptDesc, resultDesc; + NSString *script = [NSString stringWithFormat:@"tell application \"System Events\"\nmake new login item at end of login items with properties {path:\"%@\", kind:\"APPLICATION\"}\nend tell", [[NSBundle mainBundle] bundlePath]]; + + AECreateDesc(typeChar, [script cString], [script cStringLength], + &scriptDesc); + + OSADoScript(temp, &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc); + + AEDisposeDesc(&scriptDesc); + AEDisposeDesc(&resultDesc); + CloseComponent(temp); + } + + } else { + NSMutableDictionary *loginwindow; + NSMutableArray *loginarray; + int i; + + [df synchronize]; + loginwindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy]; + loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; + + for (i = 0; i < [loginarray count]; i++) { + NSDictionary *tempDict = [loginarray objectAtIndex:i]; + if ([[[tempDict objectForKey:@"Path"] lastPathComponent] isEqualToString:[[[NSBundle mainBundle] bundlePath] lastPathComponent]]) { + [loginarray removeObjectAtIndex:i]; + [df setPersistentDomain:loginwindow forName:@"loginwindow"]; + [df synchronize]; + break; + } + } + } +} + /*************************************************************************/ #pragma mark - @@ -742,7 +714,11 @@ static PreferencesController *prefs = nil; { if (aTableView == menuTableView) { if ([[aTableColumn identifier] isEqualToString:@"name"]) { - return [myItems objectAtIndex:rowIndex]; + NSString *object = [myItems objectAtIndex:rowIndex]; + if ([object isEqualToString:@"Show Player"]) { + return [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"show", @"Show"), [[controller currentRemote] playerSimpleName]]; + } + return NSLocalizedString(object, @"ERROR"); } else { if ([submenuItems containsObject:[myItems objectAtIndex:rowIndex]]) { @@ -753,7 +729,7 @@ static PreferencesController *prefs = nil; } } else { if ([[aTableColumn identifier] isEqualToString:@"name"]) { - return [availableItems objectAtIndex:rowIndex]; + return NSLocalizedString([availableItems objectAtIndex:rowIndex], @"ERROR"); } else { if ([submenuItems containsObject:[availableItems objectAtIndex:rowIndex]]) { return [NSImage imageNamed:@"submenu"]; @@ -792,32 +768,35 @@ static PreferencesController *prefs = nil; dragData = [pb stringForType:@"MenuTableViewPboardType"]; dragRow = [dragData intValue]; temp = [myItems objectAtIndex:dragRow]; - [myItems removeObjectAtIndex:dragRow]; if (tableView == menuTableView) { + [myItems insertObject:temp atIndex:row]; if (row > dragRow) { - [myItems insertObject:temp atIndex:row - 1]; + [myItems removeObjectAtIndex:dragRow]; } else { - [myItems insertObject:temp atIndex:row]; + [myItems removeObjectAtIndex:dragRow + 1]; } } else { - if (![temp isEqualToString:@""]) { + if (![temp isEqualToString:@"separator"]) { [availableItems addObject:temp]; } + [myItems removeObjectAtIndex:dragRow]; } } else if ([[pb types] containsObject:@"AllTableViewPboardType"]) { dragData = [pb stringForType:@"AllTableViewPboardType"]; dragRow = [dragData intValue]; temp = [availableItems objectAtIndex:dragRow]; - if (![temp isEqualToString:@""]) { + [myItems insertObject:temp atIndex:row]; + + if (![temp isEqualToString:@"separator"]) { [availableItems removeObjectAtIndex:dragRow]; } - [myItems insertObject:temp atIndex:row]; } [menuTableView reloadData]; [allTableView reloadData]; + [self changeMenus:self]; return YES; } @@ -830,7 +809,7 @@ static PreferencesController *prefs = nil; if ([[[info draggingPasteboard] types] containsObject:@"MenuTableViewPboardType"]) { NSString *item = [myItems objectAtIndex:[[[info draggingPasteboard] stringForType:@"MenuTableViewPboardType"] intValue]]; - if ([item isEqualToString:@"PreferencesÉ"] || [item isEqualToString:@"Quit"]) { + if ([item isEqualToString:@"Preferences"] || [item isEqualToString:@"Quit"]) { return NSDragOperationNone; } } @@ -856,11 +835,7 @@ static PreferencesController *prefs = nil; - (void)dealloc { [self setKeyCombo:nil]; - [playPauseCombo release]; - [nextTrackCombo release]; - [prevTrackCombo release]; - [trackInfoCombo release]; - [upcomingSongsCombo release]; + [hotKeysDictionary release]; [keyComboPanel release]; [menuTableView setDataSource:nil]; [allTableView setDataSource:nil];