5 // Created by Joseph Spiros on Wed Apr 30 2003.
6 // Copyright (c) 2003 iThink Software. All rights reserved.
9 #import "MenuController.h"
10 #import "NewMainController.h"
12 @interface MenuController (SubmenuMethods)
13 - (NSMenu *)ratingMenu;
14 - (NSMenu *)upcomingSongsMenu;
15 - (NSMenu *)playlistsMenu;
19 @implementation MenuController
23 if ( (self = [super init]) ) {
24 _menuLayout = [[NSMutableArray alloc] initWithCapacity:0];
31 NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
32 NSArray *menuArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"menu"];
33 NSEnumerator *enumerator = [menuArray objectEnumerator];
37 //Get the current playlist, track index, etc.
38 currentRemote = [[MainController sharedController] currentRemote];
39 _currentPlaylist = [currentRemote currentPlaylistIndex];
40 _currentTrack = [currentRemote currentSongIndex];
41 _playingRadio = ([currentRemote currentPlaylistClass] == ITMTRemotePlayerRadioPlaylist);
44 while ( (nextObject = [enumerator nextObject]) ) {
46 if ([nextObject isEqualToString:@"Play/Pause"]) {
47 tempItem = [menu addItemWithTitle:@"Play"
48 action:@selector(performMainMenuAction:)
50 [tempItem setTag:MTMenuPlayPauseItem];
51 [tempItem setTarget:self];
53 switch ([currentRemote playerPlayingState]) {
54 case ITMTRemotePlayerPlaying:
55 [tempItem setTitle:@"Pause"];
57 case ITMTRemotePlayerRewinding:
58 case ITMTRemotePlayerForwarding:
59 [tempItem setTitle:@"Resume"];
64 } else if ([nextObject isEqualToString:@"Next Track"]) {
65 tempItem = [menu addItemWithTitle:@"Next Track"
66 action:@selector(performMainMenuAction:)
68 if (_currentPlaylist) {
69 [tempItem setTag:MTMenuNextTrackItem];
70 [tempItem setTarget:self];
72 } else if ([nextObject isEqualToString:@"Previous Track"]) {
73 tempItem = [menu addItemWithTitle:@"Previous Track"
74 action:@selector(performMainMenuAction:)
76 if (_currentPlaylist) {
77 [tempItem setTag:MTMenuPreviousTrackItem];
78 [tempItem setTarget:self];
80 } else if ([nextObject isEqualToString:@"Fast Forward"]) {
81 tempItem = [menu addItemWithTitle:@"Fast Forward"
82 action:@selector(performMainMenuAction:)
84 if (_currentPlaylist) {
85 [tempItem setTag:MTMenuFastForwardItem];
86 [tempItem setTarget:self];
88 } else if ([nextObject isEqualToString:@"Rewind"]) {
89 tempItem = [menu addItemWithTitle:@"Rewind"
90 action:@selector(performMainMenuAction:)
92 if (_currentPlaylist) {
93 [tempItem setTag:MTMenuRewindItem];
94 [tempItem setTarget:self];
96 } else if ([nextObject isEqualToString:@"Preferences"]) {
97 tempItem = [menu addItemWithTitle:@"Preferences..."
98 action:@selector(performMainMenuAction:)
100 [tempItem setTag:MTMenuPreferencesItem];
101 [tempItem setTarget:self];
102 } else if ([nextObject isEqualToString:@"Quit"]) {
103 tempItem = [menu addItemWithTitle:@"Quit"
104 action:@selector(performMainMenuAction:)
106 [tempItem setTag:MTMenuQuitItem];
107 [tempItem setTarget:self];
108 } else if ([nextObject isEqualToString:@"Current Track Info"]) {
109 if (_currentPlaylist) {
110 NSString *title = [currentRemote currentSongTitle];
112 [menu addItemWithTitle:@"Now Playing" action:NULL keyEquivalent:@""];
114 if ([title length] > 0) {
115 [menu addItemWithTitle:[NSString stringWithFormat:@" %@", title] action:nil keyEquivalent:@""];
117 //Gotta add artist, album, track, time, etc, blah, blah, blah...
119 [menu addItemWithTitle:@"No Song" action:NULL keyEquivalent:@""];
121 } else if ([nextObject isEqualToString:@"<separator>"]) {
122 [menu addItem:[NSMenuItem separatorItem]];
124 } else if ([nextObject isEqualToString:@"Song Rating"]) {
125 tempItem = [menu addItemWithTitle:@"Song Rating"
128 [tempItem setSubmenu:[self ratingMenu]];
129 } else if ([nextObject isEqualToString:@"Upcoming Songs"]) {
130 tempItem = [menu addItemWithTitle:@"Upcoming Songs"
133 [tempItem setSubmenu:[self upcomingSongsMenu]];
134 } else if ([nextObject isEqualToString:@"Playlists"]) {
135 tempItem = [menu addItemWithTitle:@"Playlists"
138 [tempItem setSubmenu:[self playlistsMenu]];
139 } else if ([nextObject isEqualToString:@"EQ Presets"]) {
140 tempItem = [menu addItemWithTitle:@"EQ Presets"
143 [tempItem setSubmenu:[self eqMenu]];
147 [_currentMenu release];
152 - (NSMenu *)menuForNoPlayer
154 NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
155 NSMenuItem *tempItem;
156 tempItem = [menu addItemWithTitle:[NSString stringWithFormat:@"Open %@", [[[MainController sharedController] currentRemote] playerSimpleName]] action:@selector(performMainMenuAction:) keyEquivalent:@""];
157 [tempItem setTag:MTMenuShowPlayerItem];
158 [tempItem setTarget:self];
159 [menu addItem:[NSMenuItem separatorItem]];
160 tempItem = [menu addItemWithTitle:@"Preferences" action:@selector(performMainMenuAction:) keyEquivalent:@""];
161 [tempItem setTag:MTMenuPreferencesItem];
162 [tempItem setTarget:self];
163 tempItem = [menu addItemWithTitle:@"Quit" action:@selector(performMainMenuAction:) keyEquivalent:@""];
164 [tempItem setTag:MTMenuQuitItem];
165 [tempItem setTarget:self];
166 return [menu autorelease];
169 - (NSMenu *)ratingMenu
171 NSMenu *ratingMenu = [[NSMenu alloc] initWithTitle:@""];
172 return [ratingMenu autorelease];
175 - (NSMenu *)upcomingSongsMenu
177 NSMenu *upcomingSongsMenu = [[NSMenu alloc] initWithTitle:@""];
178 int numSongs = [currentRemote numberOfSongsInPlaylistAtIndex:_currentPlaylist];
179 int numSongsInAdvance = [[NSUserDefaults standardUserDefaults] integerForKey:@"SongsInAdvance"];
181 if (_currentPlaylist && !_playingRadio) {
185 for (i = _currentTrack + 1; i <= _currentTrack + numSongsInAdvance; i++) {
187 NSString *curSong = [currentRemote songTitleAtIndex:i];
188 NSMenuItem *songItem;
189 songItem = [upcomingSongsMenu addItemWithTitle:curSong action:@selector(performUpcomingSongsMenuAction:) keyEquivalent:@""];
191 [songItem setTarget:self];
198 return [upcomingSongsMenu autorelease];
201 - (NSMenu *)playlistsMenu
203 NSMenu *playlistsMenu = [[NSMenu alloc] initWithTitle:@""];
204 return [playlistsMenu autorelease];
209 NSMenu *eqMenu = [[NSMenu alloc] initWithTitle:@""];
210 return [eqMenu autorelease];
213 - (void)performMainMenuAction:(id)sender
215 switch ( [sender tag] )
217 case MTMenuPlayPauseItem:
218 NSLog(@"MenuController: Play/Pause");
219 [[MainController sharedController] playPause];
220 //We're gonna have to change the Play menu item to Pause here too.
222 case MTMenuFastForwardItem:
223 NSLog(@"MenuController: Fast Forward");
224 [[MainController sharedController] fastForward];
225 //make sure play/pause item says sane through this
227 case MTMenuRewindItem:
228 NSLog(@"MenuController: Rewind");
229 [[MainController sharedController] rewind];
230 //make sure play/pause item says sane through this
232 case MTMenuPreviousTrackItem:
233 NSLog(@"MenuController: Previous Track");
234 [[MainController sharedController] prevSong];
236 case MTMenuNextTrackItem:
237 NSLog(@"MenuController: Next Track");
238 [[MainController sharedController] nextSong];
240 case MTMenuShowPlayerItem:
241 NSLog(@"MainController: Show Main Interface");
242 [[MainController sharedController] showPlayer];
244 case MTMenuPreferencesItem:
245 NSLog(@"MenuController: Preferences...");
246 [[MainController sharedController] showPreferences];
249 NSLog(@"MenuController: Quit");
250 [[MainController sharedController] quitMenuTunes];
253 NSLog(@"MenuController: Unimplemented Menu Item OR Child-bearing Menu Item");
258 - (void)performRatingMenuAction:(id)sender
260 [[MainController sharedController] selectSongRating:[sender tag]];
263 - (void)performPlaylistMenuAction:(id)sender
265 [[MainController sharedController] selectPlaylistAtIndex:[sender tag]];
268 - (void)performEqualizerMenuAction:(id)sender
270 [[MainController sharedController] selectEQPresetAtIndex:[sender tag]];
273 - (void)performUpcomingSongsMenuAction:(id)sender
275 [[MainController sharedController] selectSongAtIndex:[sender tag]];
281 [_currentMenu update];
284 - (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem
289 - (NSString *)systemUIColor
291 NSDictionary *tmpDict;
293 if ( (tmpDict = [NSDictionary dictionaryWithContentsOfFile:[@"~/Library/Preferences/.GlobalPreferences.plist" stringByExpandingTildeInPath]]) ) {
294 if ( (tmpNumber = [tmpDict objectForKey:@"AppleAquaColorVariant"]) ) {
295 if ( ([tmpNumber intValue] == 1) ) {
308 - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers
309 onItem:(NSMenuItem *)item
311 unichar charcode = 'a';
313 long cocoaModifiers = 0;
314 static long carbonToCocoa[6][2] =
316 { cmdKey, NSCommandKeyMask },
317 { optionKey, NSAlternateKeyMask },
318 { controlKey, NSControlKeyMask },
319 { shiftKey, NSShiftKeyMask },
322 for (i = 0; i < 6; i++) {
323 if (modifiers & carbonToCocoa[i][0]) {
324 cocoaModifiers += carbonToCocoa[i][1];
327 [item setKeyEquivalentModifierMask:cocoaModifiers];
329 //Missing key combos for some keys. Must find them later.
343 // Haven't tested this, though it should work.
344 // This doesn't work. :'(
346 [[NSString stringWithString:@"Space"] getCharacters:&buffer];
348 /*MenuRef menuRef = _NSGetCarbonMenu([item menu]);
349 NSLog(@"%@", menuRef);
350 SetMenuItemCommandKey(menuRef, 0, NO, 49);
351 SetMenuItemModifiers(menuRef, 0, kMenuNoCommandModifier);
352 SetMenuItemKeyGlyph(menuRef, 0, kMenuBlankGlyph);
359 charcode = NSDeleteFunctionKey;
375 charcode = NSF5FunctionKey;
379 charcode = NSF6FunctionKey;
383 charcode = NSF7FunctionKey;
387 charcode = NSF3FunctionKey;
391 charcode = NSF8FunctionKey;
395 charcode = NSF9FunctionKey;
399 charcode = NSF11FunctionKey;
403 charcode = NSF3FunctionKey;
407 charcode = NSF14FunctionKey;
411 charcode = NSF10FunctionKey;
415 charcode = NSF12FunctionKey;
419 charcode = NSF13FunctionKey;
423 charcode = NSInsertFunctionKey;
427 charcode = NSHomeFunctionKey;
431 charcode = NSPageUpFunctionKey;
435 charcode = NSDeleteFunctionKey;
439 charcode = NSF4FunctionKey;
443 charcode = NSEndFunctionKey;
447 charcode = NSF2FunctionKey;
451 charcode = NSPageDownFunctionKey;
455 charcode = NSF1FunctionKey;
459 charcode = NSLeftArrowFunctionKey;
463 charcode = NSRightArrowFunctionKey;
467 charcode = NSDownArrowFunctionKey;
471 charcode = NSUpArrowFunctionKey;
475 if (charcode == 'a') {
481 kchr = (Ptr) GetScriptVariable(smCurrentScript, smKCHRCache);
482 keyTrans = KeyTranslate(kchr, code, &state);
484 [item setKeyEquivalent:[NSString stringWithCString:&charCode length:1]];
485 } else if (charcode != 'b') {
486 [item setKeyEquivalent:[NSString stringWithCharacters:&charcode length:1]];