From fcbc4baf73d5054212eb69f728ef9c303e1c62a5 Mon Sep 17 00:00:00 2001 From: Kent Sutherland Date: Sun, 1 Dec 2002 16:50:45 +0000 Subject: [PATCH] Added launch at login. --- English.lproj/Preferences.nib/classes.nib | 5 +- English.lproj/Preferences.nib/objects.nib | Bin 8624 -> 16368 bytes MenuTunes.h | 6 +- MenuTunes.m | 243 +++++++++++++--------- PreferencesController.h | 4 +- PreferencesController.m | 100 ++++++++- StatusWindowController.m | 1 - 7 files changed, 238 insertions(+), 121 deletions(-) diff --git a/English.lproj/Preferences.nib/classes.nib b/English.lproj/Preferences.nib/classes.nib index 3c22618..10e4f8f 100755 --- a/English.lproj/Preferences.nib/classes.nib +++ b/English.lproj/Preferences.nib/classes.nib @@ -22,22 +22,19 @@ albumCheckbox = NSButton; allTableView = NSTableView; artistCheckbox = NSButton; - genreCheckbox = NSButton; keyComboField = NSTextField; keyComboPanel = NSPanel; + launchAtLoginCheckbox = NSButton; menuTableView = NSTableView; nameCheckbox = NSButton; nextTrackButton = NSButton; playPauseButton = NSButton; previousTrackButton = NSButton; - songRatingCheckbox = NSButton; songsInAdvance = NSTextField; trackInfoButton = NSButton; - trackNumberCheckbox = NSButton; trackTimeCheckbox = NSButton; upcomingSongsButton = NSButton; window = NSWindow; - yearCheckbox = NSButton; }; SUPERCLASS = NSObject; } diff --git a/English.lproj/Preferences.nib/objects.nib b/English.lproj/Preferences.nib/objects.nib index bbf55df183a76d19a2309f9544fdc5f8273571c6..d14359cc7b25af24d1c9d42469c35b924c57db9f 100755 GIT binary patch literal 16368 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 literal 8624 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", @"Upcoming Songs", @"Playlists", @"", @"PreferencesÉ", @"Quit", @"", @"Current Track Info", nil] forKey:@"menu"]; } + menu = [[NSMenu alloc] initWithTitle:@""]; iTunesPSN = [self iTunesPSN]; //Get PSN of iTunes if it's running - [self rebuildMenu]; //Create the status item menu - - statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength]; - [statusItem setImage:[NSImage imageNamed:@"menu.tiff"]]; - [statusItem setHighlightMode:YES]; - [statusItem setMenu:menu]; - [statusItem retain]; - - view = [[MenuTunesView alloc] initWithFrame:[[statusItem view] frame]]; - //[statusItem setView:view]; - //If iTunes is running, start the timer if (!((iTunesPSN.highLongOfPSN == kNoProcess) && (iTunesPSN.lowLongOfPSN == 0))) { + [self rebuildMenu]; refreshTimer = [NSTimer scheduledTimerWithTimeInterval:3.5 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; } else { - NSMenu *menu2 = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - //Register for the workspace note + menu = [[NSMenu alloc] initWithTitle:@""]; + [[menu addItemWithTitle:@"Open iTunes" action:@selector(openiTunes:) keyEquivalent:@""] setTarget:self]; + [[menu addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; + [[menu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self]; [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(iTunesLaunched:) name:NSWorkspaceDidLaunchApplicationNotification object:nil]; - refreshTimer = NULL; - - [[menu2 addItemWithTitle:@"Open iTunes" action:@selector(openiTunes:) keyEquivalent:@""] setTarget:self]; - [[menu2 addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; - [[menu2 addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self]; - [statusItem setMenu:menu2]; + refreshTimer = nil; } + + statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength]; + [statusItem setImage:[NSImage imageNamed:@"menu.tiff"]]; + [statusItem setHighlightMode:YES]; + [statusItem setMenu:menu]; + [statusItem retain]; + view = [[MenuTunesView alloc] initWithFrame:[[statusItem view] frame]]; + //[statusItem setView:view]; } - (void)applicationWillTerminate:(NSNotification *)note @@ -95,14 +85,7 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; int i; trackInfoIndex = -1; - if (!((iTunesPSN.highLongOfPSN == kNoProcess) && (iTunesPSN.lowLongOfPSN == 0))) - { - didHaveAlbumName = (([[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn album of current track\nend tell"] length] > 0) ? YES : NO); - } - else - { - didHaveAlbumName = NO; - } + didHaveAlbumName = (([[self runScriptAndReturnResult:@"return album of current track"] length] > 0) ? YES : NO); while ([menu numberOfItems] > 0) { @@ -112,6 +95,11 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; playPauseMenuItem = nil; upcomingSongsItem = nil; playlistItem = nil; + [playlistMenu release]; + playlistMenu = nil; + eqItem = nil; + [eqMenu release]; + eqMenu = nil; for (i = 0; i < [myMenu count]; i++) { @@ -145,6 +133,10 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; { playlistItem = [menu addItemWithTitle:@"Playlists" action:NULL keyEquivalent:@""]; } + else if ([item isEqualToString:@"EQ Presets"]) + { + eqItem = [menu addItemWithTitle:@"EQ Presets" action:NULL keyEquivalent:@""]; + } else if ([item isEqualToString:@"PreferencesÉ"]) { [[menu addItemWithTitle:@"PreferencesÉ" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; @@ -182,8 +174,8 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; } //Get the current track name and album. - curSongName = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn name of current track\nend tell"]; - curAlbumName = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn album of current track\nend tell"]; + curSongName = [self runScriptAndReturnResult:@"return name of current track"]; + curAlbumName = [self runScriptAndReturnResult:@"return album of current track"]; if (upcomingSongsItem) { @@ -193,6 +185,10 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; { [self rebuildPlaylistMenu]; } + if (eqItem) + { + [self rebuildEQPresetsMenu]; + } if ([curSongName length] > 0) { @@ -245,12 +241,12 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; //Rebuild the upcoming songs submenu. Can be improved a lot. - (void)rebuildUpcomingSongsMenu { - int numSongs = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn number of tracks in current playlist\nend tell"] intValue]; + int numSongs = [[self runScriptAndReturnResult:@"return number of tracks in current playlist"] intValue]; int numSongsInAdvance = [[NSUserDefaults standardUserDefaults] integerForKey:@"SongsInAdvance"]; if (numSongs > 0) { - int curTrack = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn index of current track\nend tell"] intValue]; + int curTrack = [[self runScriptAndReturnResult:@"return index of current track"] intValue]; int i; [upcomingSongsMenu release]; @@ -260,10 +256,11 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; { if (i <= numSongs) { - NSString *curSong = [self runScriptAndReturnResult:[NSString stringWithFormat:@"tell application \"iTunes\"\nreturn name of track %i of current playlist\nend tell", i]]; + NSString *curSong = [self runScriptAndReturnResult:[NSString stringWithFormat:@"return name of track %i of current playlist", i]]; NSMenuItem *songItem; songItem = [[NSMenuItem alloc] initWithTitle:curSong action:@selector(playTrack:) keyEquivalent:@""]; [songItem setTarget:self]; + [songItem setEnabled:YES]; [songItem setRepresentedObject:[NSNumber numberWithInt:i]]; [upcomingSongsMenu addItem:songItem]; [songItem release]; @@ -275,20 +272,24 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; } } [upcomingSongsItem setSubmenu:upcomingSongsMenu]; + [upcomingSongsItem setEnabled:YES]; } } - (void)rebuildPlaylistMenu { - int numPlaylists = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn number of playlists\nend tell"] intValue]; - int i; + int numPlaylists = [[self runScriptAndReturnResult:@"return number of playlists"] intValue]; + int i, curPlaylist = [[self runScriptAndReturnResult:@"return index of current playlist"] intValue]; + + if (playlistMenu && (numPlaylists == [playlistMenu numberOfItems])) + return; [playlistMenu release]; playlistMenu = [[NSMenu alloc] initWithTitle:@""]; for (i = 1; i <= numPlaylists; i++) { - NSString *playlistName = [self runScriptAndReturnResult:[NSString stringWithFormat:@"tell application \"iTunes\"\nreturn name of playlist %i\nend tell", i]]; + NSString *playlistName = [self runScriptAndReturnResult:[NSString stringWithFormat:@"return name of playlist %i", i]]; NSMenuItem *tempItem; tempItem = [[NSMenuItem alloc] initWithTitle:playlistName action:@selector(selectPlaylist:) keyEquivalent:@""]; [tempItem setTarget:self]; @@ -297,6 +298,38 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; [tempItem release]; } [playlistItem setSubmenu:playlistMenu]; + + if (curPlaylist) + { + [[playlistMenu itemAtIndex:curPlaylist - 1] setState:NSOnState]; + } +} + +//Build a menu with the list of all available EQ presets +- (void)rebuildEQPresetsMenu +{ + int numSets = [[self runScriptAndReturnResult:@"return number of EQ presets"] intValue]; + int i; + + if (eqMenu && (numSets == [eqMenu numberOfItems])) + return; + + [eqMenu release]; + eqMenu = [[NSMenu alloc] initWithTitle:@""]; + + for (i = 1; i <= numSets; i++) + { + NSString *setName = [self runScriptAndReturnResult:[NSString stringWithFormat:@"return name of EQ preset %i", i]]; + NSMenuItem *tempItem; + tempItem = [[NSMenuItem alloc] initWithTitle:setName action:@selector(selectEQPreset:) keyEquivalent:@""]; + [tempItem setTarget:self]; + [tempItem setRepresentedObject:[NSNumber numberWithInt:i]]; + [eqMenu addItem:tempItem]; + [tempItem release]; + } + [eqItem setSubmenu:eqMenu]; + + [[eqMenu itemAtIndex:[[self runScriptAndReturnResult:@"return index of current EQ preset"] intValue] - 1] setState:NSOnState]; } - (void)clearHotKeys @@ -348,7 +381,7 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; } } -//Runs an AppleScript and returns the result as an NSString after stripping quotes, if needed. +//Runs an AppleScript and returns the result as an NSString after stripping quotes, if needed. It takes in script and automatically adds the tell iTunes and end tell statements. - (NSString *)runScriptAndReturnResult:(NSString *)script { AEDesc scriptDesc, resultDesc; @@ -356,6 +389,8 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; NSString *result; Ptr buffer; + script = [NSString stringWithFormat:@"tell application \"iTunes\"\n%@\nend tell", script]; + AECreateDesc(typeChar, [script cString], [script cStringLength], &scriptDesc); @@ -381,29 +416,19 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; - (void)timerUpdate { int pid; - if ((GetProcessPID(&iTunesPSN, &pid) == noErr) && (pid > 0)) + if (GetProcessPID(&iTunesPSN, &pid) == noErr) { - int trackPlayingIndex = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn index of current track\nend tell"] intValue]; + int trackPlayingIndex = [[self runScriptAndReturnResult:@"return index of current track"] intValue]; if (trackPlayingIndex != curTrackIndex) { [self updateMenu]; curTrackIndex = trackPlayingIndex; } - /*else - { - NSString *playlist = [self runScriptAndReturnResult:@"tell application\n\"iTunes\"\nreturn name of current playlist\nend tell"]; - - if (![playlist isEqualToString:curPlaylist]) - { - [self updateMenu]; - NSLog(@"update due to playlist change"); - curPlaylist = [NSString stringWithString:playlist]; - } - }*/ + //Update Play/Pause menu item if (playPauseMenuItem) { - if ([[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn player state\nend tell"] isEqualToString:@"playing"]) + if ([[self runScriptAndReturnResult:@"return player state"] isEqualToString:@"playing"]) { [playPauseMenuItem setTitle:@"Pause"]; } @@ -415,19 +440,17 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES]; } else { - NSMenu *menu2 = [[[NSMenu alloc] initWithTitle:@""] autorelease]; + [menu release]; + menu = [[NSMenu alloc] initWithTitle:@""]; + [[menu addItemWithTitle:@"Open iTunes" action:@selector(openiTunes:) keyEquivalent:@""] setTarget:self]; + [[menu addItemWithTitle:@"Preferences" action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; + [[menu addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) keyEquivalent:@""] setTarget:self]; + [statusItem setMenu:menu]; - [refreshTimer invalidate]; //Stop the timer - refreshTimer = NULL; [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(iTunesLaunched:) name:NSWorkspaceDidLaunchApplicationNotification object:nil]; - - [[menu2 addItemWithTitle:@"Open iTunes" -action:@selector(openiTunes:) keyEquivalent:@""] setTarget:self]; - [[menu2 addItemWithTitle:@"Preferences" -action:@selector(showPreferences:) keyEquivalent:@""] setTarget:self]; - [[menu2 addItemWithTitle:@"Quit" action:@selector(quitMenuTunes:) -keyEquivalent:@""] setTarget:self]; - [statusItem setMenu:menu2]; + [refreshTimer invalidate]; + refreshTimer = nil; + [self clearHotKeys]; } } @@ -443,7 +466,6 @@ keyEquivalent:@""] setTarget:self]; [self rebuildMenu]; //Rebuild the menu since no songs will be playing [statusItem setMenu:menu]; //Set the menu back to the main one - [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self]; } @@ -457,7 +479,6 @@ keyEquivalent:@""] setTarget:self]; while ( (GetNextProcess(&procNum) == noErr) ) { CFStringRef procName; - if ( (CopyProcessName(&procNum, &procName) == noErr) ) { if ([(NSString *)procName isEqualToString:@"iTunes"]) @@ -490,19 +511,31 @@ andEventID:(AEEventID)eventID - (void)playTrack:(id)sender { - [self runScriptAndReturnResult:[NSString stringWithFormat:@"tell application \"iTunes\"\nplay track %i of current playlist\nend tell", [[sender representedObject] intValue]]]; + [self runScriptAndReturnResult:[NSString stringWithFormat:@"play track %i of current playlist", [[sender representedObject] intValue]]]; [self updateMenu]; } - (void)selectPlaylist:(id)sender { - [self runScriptAndReturnResult:[NSString stringWithFormat:@"tell application \"iTunes\"\nplay playlist %i\nend tell", [[sender representedObject] intValue]]]; + int playlist = [[sender representedObject] intValue]; + [self runScriptAndReturnResult:[NSString stringWithFormat:@"play playlist %i", playlist]]; + [[playlistMenu itemAtIndex:playlist - 1] setState:NSOnState]; [self updateMenu]; } +- (void)selectEQPreset:(id)sender +{ + int curSet = [[self runScriptAndReturnResult:@"return index of current EQ preset"] intValue]; + int item = [[sender representedObject] intValue]; + [self runScriptAndReturnResult:[NSString stringWithFormat:@"set current EQ preset to EQ preset %i", item]]; + [self runScriptAndReturnResult:@"set EQ enabled to 1"]; + [[eqMenu itemAtIndex:curSet - 1] setState:NSOffState]; + [[eqMenu itemAtIndex:item - 1] setState:NSOnState]; +} + - (void)playPause:(id)sender { - NSString *state = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn player state\nend tell"]; + NSString *state = [self runScriptAndReturnResult:@"return player state"]; if ([state isEqualToString:@"playing"]) { [self sendAEWithEventClass:'hook' andEventID:'Paus']; @@ -563,7 +596,10 @@ isEqualToString:@"rewinding"]) - (void)closePreferences { - [self setupHotKeys]; + if (!((iTunesPSN.highLongOfPSN == kNoProcess) && (iTunesPSN.lowLongOfPSN == 0))) + { + [self setupHotKeys]; + } [prefsController release]; prefsController = nil; } @@ -576,7 +612,7 @@ isEqualToString:@"rewinding"]) - (void)showCurrentTrackInfo { - NSString *trackName = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn name of current track\nend tell"]; + NSString *trackName = [self runScriptAndReturnResult:@"return name of current track"]; if (!statusController && [trackName length]) { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; @@ -585,40 +621,43 @@ isEqualToString:@"rewinding"]) if ([defaults boolForKey:@"showName"]) { + if ([defaults boolForKey:@"showArtist"]) + { + NSString *trackArtist = [self runScriptAndReturnResult:@"return artist of current track"]; + trackName = [NSString stringWithFormat:@"%@ - %@", trackArtist, trackName]; + } stringToShow = [stringToShow stringByAppendingString:trackName]; stringToShow = [stringToShow stringByAppendingString:@"\n"]; - lines++; - } - - if ([defaults boolForKey:@"showArtist"]) - { - NSString *trackArtist = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn artist of current track\nend tell"]; - stringToShow = [stringToShow stringByAppendingString:trackArtist]; - stringToShow = [stringToShow stringByAppendingString:@"\n"]; + if ([trackName length] > 38) + { + lines++; + } lines++; } if ([defaults boolForKey:@"showAlbum"]) { - NSString *trackAlbum = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn album of current track\nend tell"]; - stringToShow = [stringToShow stringByAppendingString:trackAlbum]; - stringToShow = [stringToShow stringByAppendingString:@"\n"]; - lines++; + NSString *trackAlbum = [self runScriptAndReturnResult:@"return album of current track"]; + if ([trackAlbum length]) + { + stringToShow = [stringToShow stringByAppendingString:trackAlbum]; + stringToShow = [stringToShow stringByAppendingString:@"\n"]; + lines++; + } } - //Rating - maybe - //Year - maybe - if ([defaults boolForKey:@"showTime"]) { - NSString *trackLength = [self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn time of current track\nend tell"]; - stringToShow = [stringToShow stringByAppendingString:trackLength]; - stringToShow = [stringToShow stringByAppendingString:@"\n"]; - lines++; + NSString *trackTime = [self runScriptAndReturnResult:@"return time of current track"]; + if ([trackTime length]) + { + stringToShow = [NSString stringWithFormat:@"%@Total Time: %@\n", stringToShow, trackTime]; + lines++; + } } { - int trackTimeLeft = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn (duration of current track) - player position\nend tell"] intValue]; + int trackTimeLeft = [[self runScriptAndReturnResult:@"return (duration of current track) - player position"] intValue]; int minutes = trackTimeLeft / 60, seconds = trackTimeLeft % 60; if (seconds < 10) { @@ -642,12 +681,12 @@ isEqualToString:@"rewinding"]) { if (!statusController) { - int numSongs = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn number of tracks in current playlist\nend tell"] intValue]; + int numSongs = [[self runScriptAndReturnResult:@"return number of tracks in current playlist"] intValue]; if (numSongs > 0) { int numSongsInAdvance = [[NSUserDefaults standardUserDefaults] integerForKey:@"SongsInAdvance"]; - int curTrack = [[self runScriptAndReturnResult:@"tell application \"iTunes\"\nreturn index of current track\nend tell"] intValue]; + int curTrack = [[self runScriptAndReturnResult:@"return index of current track"] intValue]; int i; NSString *songs = @""; @@ -656,7 +695,7 @@ isEqualToString:@"rewinding"]) { if (i <= numSongs) { - NSString *curSong = [self runScriptAndReturnResult:[NSString stringWithFormat:@"tell application \"iTunes\"\nreturn name of track %i of current playlist\nend tell", i]]; + NSString *curSong = [self runScriptAndReturnResult:[NSString stringWithFormat:@"return name of track %i of current playlist", i]]; songs = [songs stringByAppendingString:curSong]; songs = [songs stringByAppendingString:@"\n"]; } diff --git a/PreferencesController.h b/PreferencesController.h index f1e3be7..e03a1c8 100755 --- a/PreferencesController.h +++ b/PreferencesController.h @@ -11,19 +11,17 @@ IBOutlet NSButton *artistCheckbox; IBOutlet NSTextField *keyComboField; IBOutlet NSPanel *keyComboPanel; + IBOutlet NSButton *launchAtLoginCheckbox; IBOutlet NSTableView *menuTableView; IBOutlet NSButton *nameCheckbox; IBOutlet NSButton *nextTrackButton; IBOutlet NSButton *playPauseButton; IBOutlet NSButton *previousTrackButton; - IBOutlet NSButton *songRatingCheckbox; IBOutlet NSTextField *songsInAdvance; IBOutlet NSButton *trackInfoButton; - IBOutlet NSButton *trackNumberCheckbox; IBOutlet NSButton *trackTimeCheckbox; IBOutlet NSButton *upcomingSongsButton; IBOutlet NSWindow *window; - IBOutlet NSButton *yearCheckbox; MenuTunes *mt; NSMutableArray *availableItems, *myItems; diff --git a/PreferencesController.m b/PreferencesController.m index 9568696..4a2d389 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -33,13 +33,13 @@ [allTableView registerForDraggedTypes:[NSArray arrayWithObjects:@"MenuTableViewPboardType", @"AllTableViewPboardType", nil]]; //Set the list of items you can have. - availableItems = [[NSMutableArray alloc] initWithObjects:@"Current Track Info", @"Upcoming Songs", @"Playlists", @"Play/Pause", @"Next Track", @"Previous Track", @"Fast Forward", @"Rewind", @"", nil]; + availableItems = [[NSMutableArray alloc] initWithObjects:@"Current Track Info", @"Upcoming Songs", @"Playlists", @"EQ Presets", @"Play/Pause", @"Next Track", @"Previous Track", @"Fast Forward", @"Rewind", @"", nil]; //Get our preferred menu myItems = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"menu"] mutableCopy]; if (myItems == nil) { - myItems = [[NSMutableArray alloc] initWithObjects:@"Play/Pause", @"Next Track", @"Previous Track", @"Fast Forward", @"Rewind", @"", @"Upcoming Songs", @"Playlists", @"", @"PreferencesÉ", @"Quit", @"", @"Current Track Info", nil]; + myItems = [[NSMutableArray alloc] initWithObjects:@"Play/Pause", @"Next Track", @"Previous Track", @"Fast Forward", @"Rewind", @"", @"Upcoming Songs", @"Playlists", @"EQ Presets", @"", @"PreferencesÉ", @"Quit", @"", @"Current Track Info", nil]; [[NSUserDefaults standardUserDefaults] setObject:myItems forKey:@"menu"]; } @@ -54,7 +54,7 @@ } //Items that show should a submenu image - submenuItems = [[NSArray alloc] initWithObjects:@"Upcoming Songs", @"Playlists", nil]; + submenuItems = [[NSArray alloc] initWithObjects:@"Upcoming Songs", @"Playlists", @"EQ Presets", nil]; //Fill in the number of songs in advance to show field if ([defaults integerForKey:@"SongsInAdvance"]) @@ -145,10 +145,31 @@ } [artistCheckbox setState:[defaults boolForKey:@"showArtist"] ? NSOnState : NSOffState]; - [songRatingCheckbox setState:[defaults boolForKey:@"showRating"] ? NSOnState : NSOffState]; - [trackNumberCheckbox setState:[defaults boolForKey:@"showTrackNum"] ? NSOnState : NSOffState]; [trackTimeCheckbox setState:[defaults boolForKey:@"showTime"] ? NSOnState : NSOffState]; - [yearCheckbox setState:[defaults boolForKey:@"showYear"] ? NSOnState : NSOffState]; + + //Set the launch at login checkbox state + { + NSMutableDictionary *loginwindow; + NSMutableArray *loginarray; + int i; + + [defaults synchronize]; + loginwindow = [[defaults persistentDomainForName:@"loginwindow"] mutableCopy]; + loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; + + for (i = 0; i < [loginarray count]; i++) + { + NSDictionary *tempDict = [loginarray objectAtIndex:i]; + + //Here we are seeing if our program is already in loginwindow.plist. + //See the problem below for this problem here. We will do the same thing. + + if ([[[tempDict objectForKey:@"Path"] lastPathComponent] isEqualToString:@"VocabularyBuilder.app"]) + { + [launchAtLoginCheckbox setState:NSOnState]; + } + } + } } return self; } @@ -172,6 +193,7 @@ - (IBAction)apply:(id)sender { + ProcessSerialNumber psn; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:myItems forKey:@"menu"]; @@ -186,10 +208,64 @@ [defaults setBool:[albumCheckbox state] forKey:@"showAlbum"]; [defaults setBool:[nameCheckbox state] forKey:@"showName"]; [defaults setBool:[artistCheckbox state] forKey:@"showArtist"]; - [defaults setBool:[songRatingCheckbox state] forKey:@"showRating"]; - [defaults setBool:[trackNumberCheckbox state] forKey:@"showTrackNum"]; [defaults setBool:[trackTimeCheckbox state] forKey:@"showTime"]; - [defaults setBool:[yearCheckbox state] forKey:@"showYear"]; + + //Here we set whether we will launch at login by modifying loginwindow.plist + if ([launchAtLoginCheckbox state] == NSOnState) + { + NSMutableDictionary *loginwindow; + NSMutableArray *loginarray; + int i; + BOOL skip = NO; + + [defaults synchronize]; + loginwindow = [[defaults persistentDomainForName:@"loginwindow"] mutableCopy]; + loginarray = [loginwindow objectForKey:@"AutoLaunchedApplicationDictionary"]; + + for (i = 0; i < [loginarray count]; i++) + { + NSDictionary *tempDict = [loginarray objectAtIndex:i]; + + //Here we are seeing if our program is already in loginwindow.plist. + //See the problem below for this problem here. We will do the same thing. + + if ([[[tempDict objectForKey:@"Path"] lastPathComponent] isEqualToString:@"VocabularyBuilder.app"]) + { + skip = YES; + } + } + + if (!skip) + { + [loginarray addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], @"Hide", [[NSBundle mainBundle] bundlePath], @"Path", nil]]; + + [defaults setPersistentDomain:loginwindow forName:@"loginwindow"]; + [defaults synchronize]; + } + } + else + { + NSMutableDictionary *loginwindow; + NSMutableArray *loginarray; + int i; + + [[NSUserDefaults standardUserDefaults] synchronize]; + loginwindow = [[[NSUserDefaults standardUserDefaults] 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:@"VocabularyBuilder.app"]) + { + [loginarray removeObjectAtIndex:i]; + [defaults setPersistentDomain:loginwindow forName:@"loginwindow"]; + [defaults synchronize]; + break; + } + } + } //Set songs in advance if ([songsInAdvance intValue]) @@ -201,7 +277,11 @@ [defaults setInteger:5 forKey:@"SongsInAdvance"]; } - [mt rebuildMenu]; + psn = [mt iTunesPSN]; + if (!((psn.highLongOfPSN == kNoProcess) && (psn.lowLongOfPSN == 0))) + { + [mt rebuildMenu]; + } [mt clearHotKeys]; } diff --git a/StatusWindowController.m b/StatusWindowController.m index a9859c3..807e89c 100755 --- a/StatusWindowController.m +++ b/StatusWindowController.m @@ -32,7 +32,6 @@ - (void)fadeWindowOut { [NSThread detachNewThreadSelector:@selector(fadeOutAux) toTarget:self withObject:nil]; - } - (void)fadeOutAux -- 2.20.1