+- (void)rebuildSubmenus
+{
+ ITDebugLog(@"Rebuilding all of the submenus.");
+
+ NS_DURING
+ _currentPlaylist = [[[MainController sharedController] currentRemote] currentPlaylistIndex];
+ _currentTrack = [[[MainController sharedController] currentRemote] currentSongIndex];
+ _playingRadio = ([[[MainController sharedController] currentRemote] currentPlaylistClass] == ITMTRemotePlayerRadioPlaylist);
+ NS_HANDLER
+ [[MainController sharedController] networkError:localException];
+ NS_ENDHANDLER
+
+ [_ratingMenu release];
+ [_upcomingSongsMenu release];
+ [_playlistsMenu release];
+ [_eqMenu release];
+ ITDebugLog(@"Beginning Rebuild of \"Song Rating\" submenu.");
+ _ratingMenu = [self ratingMenu];
+ ITDebugLog(@"Beginning Rebuild of \"Upcoming Songs\" submenu.");
+ _upcomingSongsMenu = [self upcomingSongsMenu];
+ ITDebugLog(@"Beginning Rebuild of \"Playlists\" submenu.");
+ _playlistsMenu = [self playlistsMenu];
+ ITDebugLog(@"Beginning Rebuild of \"EQ Presets\" submenu.");
+ _eqMenu = [self eqMenu];
+ ITDebugLog(@"Done rebuilding all of the submenus.");
+}
+
+- (NSMenu *)ratingMenu
+{
+ NSMenu *ratingMenu = [[NSMenu alloc] initWithTitle:@""];
+ NSEnumerator *itemEnum;
+ id anItem;
+ int itemTag = 0;
+ SEL itemSelector = @selector(performRatingMenuAction:);
+
+ ITDebugLog(@"Building \"Song Rating\" menu.");
+
+ [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"☆☆☆☆☆"] action:nil keyEquivalent:@""];
+ [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★☆☆☆☆"] action:nil keyEquivalent:@""];
+ [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★☆☆☆"] action:nil keyEquivalent:@""];
+ [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★☆☆"] action:nil keyEquivalent:@""];
+ [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★☆"] action:nil keyEquivalent:@""];
+ [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★★"] action:nil keyEquivalent:@""];
+
+ itemEnum = [[ratingMenu itemArray] objectEnumerator];
+ while ( (anItem = [itemEnum nextObject]) ) {
+ ITDebugLog(@"Setting up \"%@\" menu item.", [anItem title]);
+ [anItem setAction:itemSelector];
+ [anItem setTarget:self];
+ [anItem setTag:itemTag];
+ itemTag += 20;
+ }
+ ITDebugLog(@"Done Building \"Song Rating\" menu.");
+ return ratingMenu;
+}
+
+- (NSMenu *)upcomingSongsMenu
+{
+ NSMenu *upcomingSongsMenu = [[NSMenu alloc] initWithTitle:@""];
+ int numSongs, numSongsInAdvance = [[NSUserDefaults standardUserDefaults] integerForKey:@"SongsInAdvance"];
+
+ NS_DURING
+ numSongs = [[[MainController sharedController] currentRemote] numberOfSongsInPlaylistAtIndex:_currentPlaylist];
+ NS_HANDLER
+ [[MainController sharedController] networkError:localException];
+ NS_ENDHANDLER
+
+ ITDebugLog(@"Building \"Upcoming Songs\" menu.");
+
+ if (_currentPlaylist && !_playingRadio) {
+ if (numSongs > 0) {
+ int i;
+
+ for (i = _currentTrack + 1; i <= _currentTrack + numSongsInAdvance; i++) {
+ if (i <= numSongs) {
+ NSString *curSong;
+ NS_DURING
+ curSong = [[[MainController sharedController] currentRemote] songTitleAtIndex:i];
+ NS_HANDLER
+ [[MainController sharedController] networkError:localException];
+ NS_ENDHANDLER
+ NSMenuItem *songItem;
+ ITDebugLog(@"Adding song: %@", curSong);
+ songItem = [upcomingSongsMenu addItemWithTitle:curSong action:@selector(performUpcomingSongsMenuAction:) keyEquivalent:@""];
+ [songItem setTag:i];
+ [songItem setTarget:self];
+ } else {
+ break;
+ }
+ }
+ }
+
+ if ([upcomingSongsMenu numberOfItems] == 0) {
+ [upcomingSongsMenu addItemWithTitle:NSLocalizedString(@"noUpcomingSongs", @"No upcoming songs.") action:NULL keyEquivalent:@""];
+ }
+ }
+ ITDebugLog(@"Done Building \"Upcoming Songs\" menu.");
+ return upcomingSongsMenu;
+}
+
+- (NSMenu *)playlistsMenu
+{
+ NSMenu *playlistsMenu = [[NSMenu alloc] initWithTitle:@""];
+ NSArray *playlists;
+ NSMenuItem *tempItem;
+ ITMTRemotePlayerSource source = [[[MainController sharedController] currentRemote] currentSource];
+ int i;
+
+ NS_DURING
+ playlists = [[[MainController sharedController] currentRemote] playlists];
+ NS_HANDLER
+ [[MainController sharedController] networkError:localException];
+ NS_ENDHANDLER
+
+ ITDebugLog(@"Building \"Playlists\" menu.");
+
+ for (i = 0; i < [playlists count]; i++) {
+ NSString *curPlaylist = [playlists objectAtIndex:i];
+ ITDebugLog(@"Adding playlist: %@", curPlaylist);
+ tempItem = [playlistsMenu addItemWithTitle:curPlaylist action:@selector(performPlaylistMenuAction:) keyEquivalent:@""];
+ [tempItem setTag:i + 1];
+ [tempItem setTarget:self];
+ }
+
+ if (source == ITMTRemoteRadioSource) {
+ [[playlistsMenu addItemWithTitle:NSLocalizedString(@"radio", @"Radio") action:NULL keyEquivalent:@""] setState:NSOnState];
+ } else if (source == ITMTRemoteGenericDeviceSource) {
+ [[playlistsMenu addItemWithTitle:NSLocalizedString(@"genericDevice", @"Generic Device") action:NULL keyEquivalent:@""] setState:NSOnState];
+ } else if (source == ITMTRemoteiPodSource) {
+ [[playlistsMenu addItemWithTitle:NSLocalizedString(@"iPod", @"iPod") action:NULL keyEquivalent:@""] setState:NSOnState];
+ } else if (source == ITMTRemoteCDSource) {
+ [[playlistsMenu addItemWithTitle:NSLocalizedString(@"cd", @"CD") action:NULL keyEquivalent:@""] setState:NSOnState];
+ } else if (source == ITMTRemoteSharedLibrarySource) {
+ [[playlistsMenu addItemWithTitle:NSLocalizedString(@"sharedLibrary", @"Shared Library") action:NULL keyEquivalent:@""] setState:NSOnState];
+ } else if (source == ITMTRemoteLibrarySource && _currentPlaylist) {
+ [[playlistsMenu itemAtIndex:_currentPlaylist - 1] setState:NSOnState];
+ }
+ ITDebugLog(@"Done Building \"Playlists\" menu");
+ return playlistsMenu;
+}
+
+- (NSMenu *)eqMenu
+{
+ NSMenu *eqMenu = [[NSMenu alloc] initWithTitle:@""];
+ NSArray *eqPresets;
+ NSMenuItem *tempItem;
+ int i;
+
+ NS_DURING
+ eqPresets = [[[MainController sharedController] currentRemote] eqPresets];
+ NS_HANDLER
+ [[MainController sharedController] networkError:localException];
+ NS_ENDHANDLER
+
+ ITDebugLog(@"Building \"EQ Presets\" menu.");
+
+ for (i = 0; i < [eqPresets count]; i++) {
+ NSString *name;
+ if ( ( name = [eqPresets objectAtIndex:i] ) ) {
+ ITDebugLog(@"Adding EQ Preset: %@", name);
+ tempItem = [eqMenu addItemWithTitle:name
+ action:@selector(performEqualizerMenuAction:)
+ keyEquivalent:@""];
+ [tempItem setTag:i];
+ [tempItem setTarget:self];
+ }
+ }
+ ITDebugLog(@"Done Building \"EQ Presets\" menu");
+ return eqMenu;
+}
+