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"
11 #import "ITMTRemote.h"
13 @implementation MenuController
17 if ( (self = [super init]) ) {
18 _menuLayout = [[NSMutableArray alloc] initWithCapacity:0];
25 NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
26 NSArray *menuArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"menu"];
27 NSEnumerator *enumerator = [menuArray objectEnumerator];
29 ITMTRemote *currentRemote = [[MainController sharedController] currentRemote];
32 //Get the current playlist, track index, etc.
33 int playlistIndex = [currentRemote currentPlaylistIndex];
34 //int trackIndex = [currentRemote currentSongIndex];
37 while ( (nextObject = [enumerator nextObject]) ) {
39 if ([nextObject isEqualToString:@"Play/Pause"]) {
40 tempItem = [menu addItemWithTitle:@"Play"
41 action:@selector(performMainMenuAction:)
43 [tempItem setTag:MTMenuPlayPauseItem];
44 [tempItem setTarget:self];
46 switch ([currentRemote playerPlayingState]) {
47 case ITMTRemotePlayerPlaying:
48 [tempItem setTitle:@"Pause"];
50 case ITMTRemotePlayerRewinding:
51 case ITMTRemotePlayerForwarding:
52 [tempItem setTitle:@"Resume"];
57 } else if ([nextObject isEqualToString:@"Next Track"]) {
58 tempItem = [menu addItemWithTitle:@"Next Track"
59 action:@selector(performMainMenuAction:)
62 [tempItem setTag:MTMenuNextTrackItem];
63 [tempItem setTarget:self];
65 } else if ([nextObject isEqualToString:@"Previous Track"]) {
66 tempItem = [menu addItemWithTitle:@"Previous Track"
67 action:@selector(performMainMenuAction:)
70 [tempItem setTag:MTMenuPreviousTrackItem];
71 [tempItem setTarget:self];
73 } else if ([nextObject isEqualToString:@"Fast Forward"]) {
74 tempItem = [menu addItemWithTitle:@"Fast Forward"
75 action:@selector(performMainMenuAction:)
78 [tempItem setTag:MTMenuFastForwardItem];
79 [tempItem setTarget:self];
81 } else if ([nextObject isEqualToString:@"Rewind"]) {
82 tempItem = [menu addItemWithTitle:@"Rewind"
83 action:@selector(performMainMenuAction:)
86 [tempItem setTag:MTMenuRewindItem];
87 [tempItem setTarget:self];
89 } else if ([nextObject isEqualToString:@"Preferences"]) {
90 tempItem = [menu addItemWithTitle:@"Preferences..."
91 action:@selector(performMainMenuAction:)
93 [tempItem setTag:MTMenuPreferencesItem];
94 [tempItem setTarget:self];
95 } else if ([nextObject isEqualToString:@"Quit"]) {
96 tempItem = [menu addItemWithTitle:@"Quit"
97 action:@selector(performMainMenuAction:)
99 [tempItem setTag:MTMenuQuitItem];
100 [tempItem setTarget:self];
101 } else if ([nextObject isEqualToString:@"Current Track Info"]) {
103 NSString *title = [currentRemote currentSongTitle];
105 [menu addItemWithTitle:@"Now Playing" action:NULL keyEquivalent:@""];
107 if ([title length] > 0) {
108 [menu addItemWithTitle:[NSString stringWithFormat:@" %@", title] action:nil keyEquivalent:@""];
111 [menu addItemWithTitle:@"No Song" action:NULL keyEquivalent:@""];
113 } else if ([nextObject isEqualToString:@"<separator>"]) {
114 [menu addItem:[NSMenuItem separatorItem]];
116 } else if ([nextObject isEqualToString:@"Song Rating"]) {
117 tempItem = [menu addItemWithTitle:@"Song Rating"
120 //[tempItem setSubmenu:[self ratingMenu]];
121 } else if ([nextObject isEqualToString:@"Upcoming Songs"]) {
122 tempItem = [menu addItemWithTitle:@"Upcoming Songs"
125 //[tempItem setSubmenu:[self upcomingSongsMenu]];
126 } else if ([nextObject isEqualToString:@"Playlists"]) {
127 tempItem = [menu addItemWithTitle:@"Playlists"
130 //[tempItem setSubmenu:[self playlistsMenu]];
131 } else if ([nextObject isEqualToString:@"EQ Presets"]) {
132 tempItem = [menu addItemWithTitle:@"EQ Presets"
135 //[tempItem setSubmenu:[self eqMenu]];
139 [_currentMenu release];
144 - (NSMenu *)menuForNoPlayer
146 NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
147 NSMenuItem *tempItem;
148 [menu addItemWithTitle:[NSString stringWithFormat:@"Open %@", [[[MainController sharedController] currentRemote] playerSimpleName]] action:@selector(performMainMenuAction:) keyEquivalent:@""];
149 [menu addItem:[NSMenuItem separatorItem]];
150 tempItem = [menu addItemWithTitle:@"Preferences" action:@selector(performMainMenuAction:) keyEquivalent:@""];
151 [tempItem setTag:MTMenuPreferencesItem];
152 [tempItem setTarget:self];
153 tempItem = [menu addItemWithTitle:@"Quit" action:@selector(performMainMenuAction:) keyEquivalent:@""];
154 [tempItem setTag:MTMenuQuitItem];
155 [tempItem setTarget:self];
156 return [menu autorelease];
159 - (void)performMainMenuAction:(id)sender
161 switch ( [sender tag] )
163 case MTMenuPlayPauseItem:
164 NSLog(@"MenuController: Play/Pause");
165 [[MainController sharedController] playPause];
166 //We're gonna have to change the Play menu item to Pause here too.
168 case MTMenuFastForwardItem:
169 NSLog(@"MenuController: Fast Forward");
170 [[MainController sharedController] fastForward];
171 //make sure play/pause item says sane through this
173 case MTMenuRewindItem:
174 NSLog(@"MenuController: Rewind");
175 [[MainController sharedController] rewind];
176 //make sure play/pause item says sane through this
178 case MTMenuPreviousTrackItem:
179 NSLog(@"MenuController: Previous Track");
180 [[MainController sharedController] prevSong];
182 case MTMenuNextTrackItem:
183 NSLog(@"MenuController: Next Track");
184 [[MainController sharedController] nextSong];
186 case MTMenuPreferencesItem:
187 NSLog(@"MenuController: Preferences...");
188 [[MainController sharedController] showPreferences];
191 NSLog(@"MenuController: Quit");
192 [[MainController sharedController] quitMenuTunes];
195 NSLog(@"MenuController: Unimplemented Menu Item OR Child-bearing Menu Item");
200 - (void)performRatingMenuAction:(id)sender
202 [[MainController sharedController] selectSongRating:[sender tag]];
205 - (void)performPlaylistMenuAction:(id)sender
207 [[MainController sharedController] selectPlaylistAtIndex:[sender tag]];
210 - (void)performEqualizerMenuAction:(id)sender
212 [[MainController sharedController] selectEQPresetAtIndex:[sender tag]];
215 - (void)performUpcomingSongsMenuAction:(id)sender
217 [[MainController sharedController] selectSongAtIndex:[sender tag]];
223 [_currentMenu update];
226 - (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem
231 - (NSString *)systemUIColor
233 NSDictionary *tmpDict;
235 if ( (tmpDict = [NSDictionary dictionaryWithContentsOfFile:[@"~/Library/Preferences/.GlobalPreferences.plist" stringByExpandingTildeInPath]]) ) {
236 if ( (tmpNumber = [tmpDict objectForKey:@"AppleAquaColorVariant"]) ) {
237 if ( ([tmpNumber intValue] == 1) ) {
250 - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers
251 onItem:(NSMenuItem *)item
253 unichar charcode = 'a';
255 long cocoaModifiers = 0;
256 static long carbonToCocoa[6][2] =
258 { cmdKey, NSCommandKeyMask },
259 { optionKey, NSAlternateKeyMask },
260 { controlKey, NSControlKeyMask },
261 { shiftKey, NSShiftKeyMask },
264 for (i = 0; i < 6; i++) {
265 if (modifiers & carbonToCocoa[i][0]) {
266 cocoaModifiers += carbonToCocoa[i][1];
269 [item setKeyEquivalentModifierMask:cocoaModifiers];
271 //Missing key combos for some keys. Must find them later.
285 // Haven't tested this, though it should work.
286 // This doesn't work. :'(
288 [[NSString stringWithString:@"Space"] getCharacters:&buffer];
290 /*MenuRef menuRef = _NSGetCarbonMenu([item menu]);
291 NSLog(@"%@", menuRef);
292 SetMenuItemCommandKey(menuRef, 0, NO, 49);
293 SetMenuItemModifiers(menuRef, 0, kMenuNoCommandModifier);
294 SetMenuItemKeyGlyph(menuRef, 0, kMenuBlankGlyph);
301 charcode = NSDeleteFunctionKey;
317 charcode = NSF5FunctionKey;
321 charcode = NSF6FunctionKey;
325 charcode = NSF7FunctionKey;
329 charcode = NSF3FunctionKey;
333 charcode = NSF8FunctionKey;
337 charcode = NSF9FunctionKey;
341 charcode = NSF11FunctionKey;
345 charcode = NSF3FunctionKey;
349 charcode = NSF14FunctionKey;
353 charcode = NSF10FunctionKey;
357 charcode = NSF12FunctionKey;
361 charcode = NSF13FunctionKey;
365 charcode = NSInsertFunctionKey;
369 charcode = NSHomeFunctionKey;
373 charcode = NSPageUpFunctionKey;
377 charcode = NSDeleteFunctionKey;
381 charcode = NSF4FunctionKey;
385 charcode = NSEndFunctionKey;
389 charcode = NSF2FunctionKey;
393 charcode = NSPageDownFunctionKey;
397 charcode = NSF1FunctionKey;
401 charcode = NSLeftArrowFunctionKey;
405 charcode = NSRightArrowFunctionKey;
409 charcode = NSDownArrowFunctionKey;
413 charcode = NSUpArrowFunctionKey;
417 if (charcode == 'a') {
423 kchr = (Ptr) GetScriptVariable(smCurrentScript, smKCHRCache);
424 keyTrans = KeyTranslate(kchr, code, &state);
426 [item setKeyEquivalent:[NSString stringWithCString:&charCode length:1]];
427 } else if (charcode != 'b') {
428 [item setKeyEquivalent:[NSString stringWithCharacters:&charcode length:1]];