X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/f16e2f1f2b4778b4bc890162fa9cd31d7dd79b54..3a1a21d1ea3e060f88ca1d24ea881f3ccb97640c:/PreferencesController.m diff --git a/PreferencesController.m b/PreferencesController.m index 1580fb6..590e6de 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -1,7 +1,20 @@ #import "PreferencesController.h" #import "MainController.h" +#import "StatusWindow.h" +#import "StatusWindowController.h" +#import "CustomMenuTableView.h" + #import +#import #import +#import + +#import +#import +#import +#import +#import + #define SENDER_STATE (([sender state] == NSOnState) ? YES : NO) @@ -47,6 +60,7 @@ static PreferencesController *prefs = nil; - (id)init { if ( (self = [super init]) ) { + ITDebugLog(@"Preferences initialized."); df = [[NSUserDefaults standardUserDefaults] retain]; hotKeysDictionary = [[NSMutableDictionary alloc] init]; controller = nil; @@ -79,7 +93,9 @@ static PreferencesController *prefs = nil; - (IBAction)showPrefsWindow:(id)sender { + ITDebugLog(@"Showing preferences window."); if (! window) { // If window does not exist yet, then the nib hasn't been loaded. + 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 @@ -90,15 +106,15 @@ static PreferencesController *prefs = nil; //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]; + [window center]; - [window makeKeyAndOrderFront:self]; [NSApp activateIgnoringOtherApps:YES]; + [window performSelector:@selector(makeKeyAndOrderFront:) withObject:self afterDelay:0.0]; } - (IBAction)changeGeneralSetting:(id)sender { + ITDebugLog(@"Changing general setting of tag %i.", [sender tag]); if ( [sender tag] == 1010) { [self setLaunchesAtLogin:SENDER_STATE]; } else if ( [sender tag] == 1020) { @@ -125,6 +141,8 @@ static PreferencesController *prefs = nil; - (IBAction)changeStatusWindowSetting:(id)sender { + StatusWindow *sw = [StatusWindow sharedWindow]; + ITDebugLog(@"Changing status window setting of tag %i", [sender tag]); if ( [sender tag] == 2010) { [df setInteger:[sender selectedRow] forKey:@"statusWindowVerticalPosition"]; [df setInteger:[sender selectedColumn] forKey:@"statusWindowHorizontalPosition"]; @@ -132,23 +150,65 @@ static PreferencesController *prefs = nil; } else if ( [sender tag] == 2020) { // update screen selection } else if ( [sender tag] == 2030) { - // Update appearance effect + int effectTag = [[sender selectedItem] tag]; + float time = ([df floatForKey:@"statusWindowAppearanceSpeed"] ? [df floatForKey:@"statusWindowAppearanceSpeed"] : 0.8); + [df setInteger:effectTag forKey:@"statusWindowAppearanceEffect"]; + + if ( effectTag == 2100 ) { + [sw setEntryEffect:[[[ITCutWindowEffect alloc] initWithWindow:sw] autorelease]]; + } else if ( effectTag == 2101 ) { + [sw setEntryEffect:[[[ITDissolveWindowEffect alloc] initWithWindow:sw] autorelease]]; + } else if ( effectTag == 2102 ) { + [sw setEntryEffect:[[[ITSlideVerticallyWindowEffect alloc] initWithWindow:sw] autorelease]]; + } else if ( effectTag == 2103 ) { + [sw setEntryEffect:[[[ITSlideHorizontallyWindowEffect alloc] initWithWindow:sw] autorelease]]; + } else if ( effectTag == 2104 ) { + NSLog(@"dflhgldf"); + [sw setEntryEffect:[[[ITPivotWindowEffect alloc] initWithWindow:sw] autorelease]]; + } + + [[sw entryEffect] setEffectTime:time]; + } else if ( [sender tag] == 2040) { - // Update Vanish Effect + int effectTag = [[sender selectedItem] tag]; + float time = ([df floatForKey:@"statusWindowVanishSpeed"] ? [df floatForKey:@"statusWindowVanishSpeed"] : 0.8); + + [df setInteger:[[sender selectedItem] tag] forKey:@"statusWindowVanishEffect"]; + + if ( effectTag == 2100 ) { + [sw setExitEffect:[[[ITCutWindowEffect alloc] initWithWindow:sw] autorelease]]; + } else if ( effectTag == 2101 ) { + [sw setExitEffect:[[[ITDissolveWindowEffect alloc] initWithWindow:sw] autorelease]]; + } else if ( effectTag == 2102 ) { + [sw setExitEffect:[[[ITSlideVerticallyWindowEffect alloc] initWithWindow:sw] autorelease]]; + } else if ( effectTag == 2103 ) { + [sw setExitEffect:[[[ITSlideHorizontallyWindowEffect alloc] initWithWindow:sw] autorelease]]; + } else if ( effectTag == 2104 ) { + [sw setExitEffect:[[[ITPivotWindowEffect alloc] initWithWindow:sw] autorelease]]; + } + + [[sw exitEffect] setEffectTime:time]; + } else if ( [sender tag] == 2050) { - // Update appearance speed + float newTime = (-([sender floatValue])); + [df setFloat:newTime forKey:@"statusWindowAppearanceSpeed"]; + [[sw entryEffect] setEffectTime:newTime]; } else if ( [sender tag] == 2060) { - // Update vanish speed + float newTime = (-([sender floatValue])); + [df setFloat:newTime forKey:@"statusWindowVanishSpeed"]; + [[sw exitEffect] setEffectTime:newTime]; } else if ( [sender tag] == 2070) { - // Update vanish delay + [df setFloat:[sender floatValue] forKey:@"statusWindowVanishDelay"]; + [sw setExitDelay:[sender floatValue]]; } else if ( [sender tag] == 2080) { - // Update "Song Info window when song changes" setting. [df setBool:SENDER_STATE forKey:@"showSongInfoOnChange"]; } + [df synchronize]; } - (IBAction)changeHotKey:(id)sender { + ITDebugLog(@"Changing hot keys."); [controller clearHotKeys]; switch ([sender tag]) { @@ -210,7 +270,7 @@ static PreferencesController *prefs = nil; NSMutableArray *loginArray; NSEnumerator *loginEnum; id anItem; - + ITDebugLog(@"Registering defaults."); [df setObject:[NSArray arrayWithObjects: @"playPause", @"prevTrack", @@ -247,32 +307,32 @@ static PreferencesController *prefs = nil; found = YES; } } - [loginWindow release]; - // This is teh sux - // We must fix it so it is no longer suxy if (!found) { - 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); - - AECreateDesc(typeChar, [script cString], [script cStringLength], - &scriptDesc); - - OSADoScript(asComponent, &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc); + [[StatusWindowController sharedController] showSetupQueryWindow]; + } +} - AEDisposeDesc(&scriptDesc); - AEDisposeDesc(&resultDesc); +- (void)autoLaunchOK +{ + [[StatusWindow sharedWindow] setLocked:NO]; + [[StatusWindow sharedWindow] vanish:self]; + [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; + + [self setLaunchesAtLogin:YES]; +} - CloseComponent(asComponent); - } - } +- (void)autoLaunchCancel +{ + [[StatusWindow sharedWindow] setLocked:NO]; + [[StatusWindow sharedWindow] vanish:self]; + [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; } - (IBAction)cancelHotKey:(id)sender { + ITDebugLog(@"Hot key canceled."); [[NSNotificationCenter defaultCenter] removeObserver:self]; [NSApp endSheet:keyComboPanel]; [keyComboPanel orderOut:nil]; @@ -280,6 +340,7 @@ static PreferencesController *prefs = nil; - (IBAction)clearHotKey:(id)sender { + ITDebugLog(@"Hot key cleared."); [self setKeyCombo:[ITKeyCombo clearKeyCombo]]; } @@ -289,43 +350,49 @@ static PreferencesController *prefs = nil; NSEnumerator *enumerator = [hotKeysDictionary keyEnumerator]; NSString *enumKey; + ITDebugLog(@"Hot key ok'd, saving."); + if (string == nil) { string = @""; } + ITDebugLog(@"Checking for duplicate hot keys."); while ( (enumKey = [enumerator nextObject]) ) { if (![enumKey isEqualToString:currentHotKey]) { if (![combo isEqual:[ITKeyCombo clearKeyCombo]] && [combo isEqual:[hotKeysDictionary objectForKey:enumKey]]) { [window setLevel:NSNormalWindowLevel]; + ITDebugLog(@"Duplicate hot key found: %@", enumKey); 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:[ITKeyCombo clearKeyCombo] forKey:currentHotKey]; if ([enumKey isEqualToString:@"PlayPause"]) { - [playPauseButton setTitle:@""]; + [playPauseButton setTitle:@"(None)"]; } else if ([enumKey isEqualToString:@"NextTrack"]) { - [nextTrackButton setTitle:@""]; + [nextTrackButton setTitle:@"(None)"]; } else if ([enumKey isEqualToString:@"PrevTrack"]) { - [previousTrackButton setTitle:@""]; + [previousTrackButton setTitle:@"(None)"]; } else if ([enumKey isEqualToString:@"ShowPlayer"]) { - [showPlayerButton setTitle:@""]; + [showPlayerButton setTitle:@"(None)"]; } else if ([enumKey isEqualToString:@"TrackInfo"]) { - [trackInfoButton setTitle:@""]; + [trackInfoButton setTitle:@"(None)"]; } else if ([enumKey isEqualToString:@"UpcomingSongs"]) { - [upcomingSongsButton setTitle:@""]; + [upcomingSongsButton setTitle:@"(None)"]; } else if ([enumKey isEqualToString:@"IncrementVolume"]) { - [volumeIncrementButton setTitle:@""]; + [volumeIncrementButton setTitle:@"(None)"]; } else if ([enumKey isEqualToString:@"DecrementVolume"]) { - [volumeDecrementButton setTitle:@""]; + [volumeDecrementButton setTitle:@"(None)"]; } else if ([enumKey isEqualToString:@"IncrementRating"]) { - [ratingIncrementButton setTitle:@""]; + [ratingIncrementButton setTitle:@"(None)"]; } else if ([enumKey isEqualToString:@"DecrementRating"]) { - [ratingDecrementButton setTitle:@""]; + [ratingDecrementButton setTitle:@"(None)"]; } else if ([enumKey isEqualToString:@"ToggleShuffle"]) { - [toggleShuffleButton setTitle:@""]; + [toggleShuffleButton setTitle:@"(None)"]; } else if ([enumKey isEqualToString:@"ToggleLoop"]) { - [toggleLoopButton setTitle:@""]; + [toggleLoopButton setTitle:@"(None)"]; } + ITDebugLog(@"Saved hot key named %@.", enumKey); [df setObject:[[ITKeyCombo clearKeyCombo] plistRepresentation] forKey:enumKey]; + [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:enumKey]; } else { return; } @@ -334,50 +401,63 @@ static PreferencesController *prefs = nil; } } + ITDebugLog(@"Saved hot key named %@.", currentHotKey); [hotKeysDictionary setObject:combo forKey:currentHotKey]; [df setObject:[combo plistRepresentation] forKey:currentHotKey]; + ITDebugLog(@"Setting button name."); if ([currentHotKey isEqualToString:@"PlayPause"]) { [playPauseButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"PlayPause" combo:combo target:[MainController sharedController] action:@selector(playPause)]; } else if ([currentHotKey isEqualToString:@"NextTrack"]) { [nextTrackButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"NextTrack" combo:combo target:[MainController sharedController] action:@selector(nextSong)]; } else if ([currentHotKey isEqualToString:@"PrevTrack"]) { [previousTrackButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"PrevTrack" combo:combo target:[MainController sharedController] action:@selector(prevSong)]; } else if ([currentHotKey isEqualToString:@"ShowPlayer"]) { [showPlayerButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"ShowPlayer" combo:combo target:[MainController sharedController] action:@selector(showPlayer)]; } else if ([currentHotKey isEqualToString:@"TrackInfo"]) { [trackInfoButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"TrackInfo" combo:combo target:[MainController sharedController] action:@selector(showCurrentTrackInfo)]; } else if ([currentHotKey isEqualToString:@"UpcomingSongs"]) { [upcomingSongsButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"UpcomingSongs" combo:combo target:[MainController sharedController] action:@selector(showUpcomingSongs)]; } else if ([currentHotKey isEqualToString:@"IncrementVolume"]) { [volumeIncrementButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"IncrementVolume" combo:combo target:[MainController sharedController] action:@selector(incrementVolume)]; } else if ([currentHotKey isEqualToString:@"DecrementVolume"]) { [volumeDecrementButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"DecrementVolume" combo:combo target:[MainController sharedController] action:@selector(decrementVolume)]; } else if ([currentHotKey isEqualToString:@"IncrementRating"]) { [ratingIncrementButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"IncrementRating" combo:combo target:[MainController sharedController] action:@selector(incrementRating)]; } else if ([currentHotKey isEqualToString:@"DecrementRating"]) { [ratingDecrementButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"DecrementRating" combo:combo target:[MainController sharedController] action:@selector(decrementRating)]; } else if ([currentHotKey isEqualToString:@"ToggleShuffle"]) { [toggleShuffleButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"ToggleShuffle" combo:combo target:[MainController sharedController] action:@selector(toggleShuffle)]; } else if ([currentHotKey isEqualToString:@"ToggleLoop"]) { [toggleLoopButton setTitle:string]; - //[[ITHotKeyCenter sharedCenter] addHotKey:@"ToggleLoop" combo:combo target:[MainController sharedController] action:@selector(toggleLoop)]; } [controller setupHotKeys]; [self cancelHotKey:sender]; } +- (void)deletePressedInTableView:(NSTableView *)tableView +{ + if (tableView == menuTableView) { + int selRow = [tableView selectedRow]; + ITDebugLog(@"Delete pressed in menu table view."); + if (selRow != - 1) { + NSString *object = [myItems objectAtIndex:selRow]; + + if ([object isEqualToString:@"preferences"]) { + NSBeep(); + return; + } + + if (![object isEqualToString:@"separator"]) + [availableItems addObject:object]; + ITDebugLog(@"Removing object named %@", object); + [myItems removeObjectAtIndex:selRow]; + [menuTableView reloadData]; + [allTableView reloadData]; + } + [self changeMenus:self]; + } +} /*************************************************************************/ @@ -387,24 +467,16 @@ static PreferencesController *prefs = nil; - (void)setCurrentHotKey:(NSString *)key { + ITDebugLog(@"Setting current hot key to %@", key); [currentHotKey autorelease]; currentHotKey = [key copy]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyEvent:) name:@"KeyBroadcasterEvent" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyEvent:) name:ITKeyBroadcasterKeyEvent object:nil]; [NSApp beginSheet:keyComboPanel modalForWindow:window modalDelegate:self didEndSelector:nil contextInfo:nil]; } - (void)keyEvent:(NSNotification *)note { - NSDictionary *info = [note userInfo]; - short keyCode; - long modifiers; - ITKeyCombo *newCombo; - - keyCode = [[info objectForKey:@"KeyCode"] shortValue]; - modifiers = [[info objectForKey:@"Modifiers"] longValue]; - - newCombo = [[ITKeyCombo alloc] initWithKeyCode:keyCode modifiers:modifiers]; - [self setKeyCombo:newCombo]; + [self setKeyCombo:[[[note userInfo] objectForKey:@"keyCombo"] copy]]; } - (void)setKeyCombo:(ITKeyCombo *)newCombo @@ -412,10 +484,10 @@ static PreferencesController *prefs = nil; NSString *string; [combo release]; combo = [newCombo copy]; - + ITDebugLog(@"Setting key combo to %@", newCombo); string = [combo description]; if (string == nil) { - string = @""; + string = @"(None)"; } [keyComboField setStringValue:string]; } @@ -428,8 +500,9 @@ static PreferencesController *prefs = nil; - (void)setupWindow { + ITDebugLog(@"Loading Preferences.nib."); if (![NSBundle loadNibNamed:@"Preferences" owner:self]) { - NSLog(@"MenuTunes: Failed to load Preferences.nib"); + ITDebugLog(@"Failed to load Preferences.nib."); NSBeep(); return; } @@ -438,7 +511,7 @@ static PreferencesController *prefs = nil; - (void)setupCustomizationTables { NSImageCell *imgCell = [[[NSImageCell alloc] initImageCell:nil] autorelease]; - + ITDebugLog(@"Setting up table views."); // Set the table view cells up [imgCell setImageScaling:NSScaleNone]; [[menuTableView tableColumnWithIdentifier:@"submenu"] setDataCell:imgCell]; @@ -459,8 +532,10 @@ static PreferencesController *prefs = nil; { NSEnumerator *itemEnum; id anItem; + ITDebugLog(@"Setting up table view arrays."); // Set the list of items you can have. availableItems = [[NSMutableArray alloc] initWithObjects: + @"separator", @"trackInfo", @"upcomingSongs", @"playlists", @@ -472,7 +547,7 @@ static PreferencesController *prefs = nil; @"fastForward", @"rewind", @"showPlayer", - @"separator", + @"quit", nil]; // Get our preferred menu @@ -501,107 +576,132 @@ static PreferencesController *prefs = nil; NSMutableArray *loginarray; NSEnumerator *loginEnum; id anItem; - + ITDebugLog(@"Setting up preferences UI."); // 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"]) { + ITDebugLog(@"Setting up \"PlayPause\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"PlayPause"]]; [hotKeysDictionary setObject:anItem forKey:@"PlayPause"]; [playPauseButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"PlayPause"]; + [playPauseButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"NextTrack"]) { + ITDebugLog(@"Setting up \"NextTrack\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"NextTrack"]]; [hotKeysDictionary setObject:anItem forKey:@"NextTrack"]; [nextTrackButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"NextTrack"]; + [nextTrackButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"PrevTrack"]) { + ITDebugLog(@"Setting up \"PrevTrack\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"PrevTrack"]]; [hotKeysDictionary setObject:anItem forKey:@"PrevTrack"]; [previousTrackButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"PrevTrack"]; + [previousTrackButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"ShowPlayer"]) { + ITDebugLog(@"Setting up \"ShowPlayer\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ShowPlayer"]]; [hotKeysDictionary setObject:anItem forKey:@"ShowPlayer"]; [showPlayerButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"ShowPlayer"]; + [showPlayerButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"TrackInfo"]) { + ITDebugLog(@"Setting up \"TrackInfo\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"TrackInfo"]]; [hotKeysDictionary setObject:anItem forKey:@"TrackInfo"]; [trackInfoButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"TrackInfo"]; + [trackInfoButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"UpcomingSongs"]) { + ITDebugLog(@"Setting up \"UpcomingSongs\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"UpcomingSongs"]]; [hotKeysDictionary setObject:anItem forKey:@"UpcomingSongs"]; [upcomingSongsButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"UpcomingSongs"]; + [upcomingSongsButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"IncrementVolume"]) { + ITDebugLog(@"Setting up \"IncrementVolume\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementVolume"]]; [hotKeysDictionary setObject:anItem forKey:@"IncrementVolume"]; [volumeIncrementButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"IncrementVolume"]; + [volumeIncrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"DecrementVolume"]) { + ITDebugLog(@"Setting up \"DecrementVolume\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementVolume"]]; [hotKeysDictionary setObject:anItem forKey:@"DecrementVolume"]; [volumeDecrementButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"DecrementVolume"]; + [volumeDecrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"IncrementRating"]) { + ITDebugLog(@"Setting up \"IncrementRating\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"IncrementRating"]]; [hotKeysDictionary setObject:anItem forKey:@"IncrementRating"]; [ratingIncrementButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"IncrementRating"]; + [ratingIncrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"DecrementRating"]) { + ITDebugLog(@"Setting up \"DecrementRating\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"DecrementRating"]]; [hotKeysDictionary setObject:anItem forKey:@"DecrementRating"]; [ratingDecrementButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"DecrementRating"]; + [ratingDecrementButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"ToggleLoop"]) { + ITDebugLog(@"Setting up \"ToggleLoop\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleLoop"]]; [hotKeysDictionary setObject:anItem forKey:@"ToggleLoop"]; [toggleLoopButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"ToggleLoop"]; + [toggleLoopButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } if ([df objectForKey:@"ToggleShuffle"]) { + ITDebugLog(@"Setting up \"ToggleShuffle\" hot key."); anItem = [ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"ToggleShuffle"]]; [hotKeysDictionary setObject:anItem forKey:@"ToggleShuffle"]; [toggleShuffleButton setTitle:[anItem description]]; } else { [hotKeysDictionary setObject:[ITKeyCombo clearKeyCombo] forKey:@"ToggleShuffle"]; + [toggleShuffleButton setTitle:[[ITKeyCombo clearKeyCombo] description]]; } + ITDebugLog(@"Setting up track info checkboxes."); // Check current track info buttons [albumCheckbox setState:[df boolForKey:@"showAlbum"] ? NSOnState : NSOffState]; [nameCheckbox setState:NSOnState]; // Song info will ALWAYS show song title. @@ -609,8 +709,10 @@ static PreferencesController *prefs = nil; [artistCheckbox setState:[df boolForKey:@"showArtist"] ? NSOnState : NSOffState]; [trackTimeCheckbox setState:[df boolForKey:@"showTime"] ? NSOnState : NSOffState]; [trackNumberCheckbox setState:[df boolForKey:@"showTrackNumber"] ? NSOnState : NSOffState]; + [ratingCheckbox setState:[df boolForKey:@"showTrackRating"] ? NSOnState : NSOffState]; // Set the launch at login checkbox state + ITDebugLog(@"Setting launch at login state."); [df synchronize]; loginwindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy]; loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; @@ -625,63 +727,39 @@ static PreferencesController *prefs = nil; - (IBAction)changeMenus:(id)sender { + ITDebugLog(@"Synchronizing menus"); [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); - } - + NSMutableDictionary *loginwindow; + NSMutableArray *loginarray; + ITDebugLog(@"Setting launches at login: %i", flag); + [df synchronize]; + loginwindow = [[df persistentDomainForName:@"loginwindow"] mutableCopy]; + loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; + + if (flag) { + NSDictionary *itemDict = [NSDictionary dictionaryWithObjectsAndKeys: + [[NSBundle mainBundle] bundlePath], @"Path", + [NSNumber numberWithInt:0], @"Hide", nil]; + [loginarray addObject:itemDict]; } 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; } } } + [df setPersistentDomain:loginwindow forName:@"loginwindow"]; + [df synchronize]; + [loginwindow release]; + ITDebugLog(@"Finished setting launches at login."); } @@ -713,14 +791,14 @@ static PreferencesController *prefs = nil; - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { if (aTableView == menuTableView) { + NSString *object = [myItems objectAtIndex:rowIndex]; if ([[aTableColumn identifier] isEqualToString:@"name"]) { - NSString *object = [myItems objectAtIndex:rowIndex]; - if ([object isEqualToString:@"Show Player"]) { + if ([object isEqualToString:@"showPlayer"]) { return [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"show", @"Show"), [[controller currentRemote] playerSimpleName]]; } return NSLocalizedString(object, @"ERROR"); } else { - if ([submenuItems containsObject:[myItems objectAtIndex:rowIndex]]) + if ([submenuItems containsObject:object]) { return [NSImage imageNamed:@"submenu"]; } else { @@ -728,10 +806,14 @@ static PreferencesController *prefs = nil; } } } else { + NSString *object = [availableItems objectAtIndex:rowIndex]; if ([[aTableColumn identifier] isEqualToString:@"name"]) { - return NSLocalizedString([availableItems objectAtIndex:rowIndex], @"ERROR"); + if ([object isEqualToString:@"showPlayer"]) { + return [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"show", @"Show"), [[controller currentRemote] playerSimpleName]]; + } + return NSLocalizedString(object, @"ERROR"); } else { - if ([submenuItems containsObject:[availableItems objectAtIndex:rowIndex]]) { + if ([submenuItems containsObject:object]) { return [NSImage imageNamed:@"submenu"]; } else { return nil; @@ -809,7 +891,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"]) { return NSDragOperationNone; } }