Added more the MenuController. All of the main menu things are added in now.
[MenuTunes.git] / MenuController.m
1 //
2 //  MenuController.m
3 //  MenuTunes
4 //
5 //  Created by Joseph Spiros on Wed Apr 30 2003.
6 //  Copyright (c) 2003 iThink Software. All rights reserved.
7 //
8
9 #import "MenuController.h"
10 #import "NewMainController.h"
11 #import "ITMTRemote.h"
12
13 @implementation MenuController
14
15 - (id)init
16 {
17     if ( (self = [super init]) ) {
18         _menuLayout = [[NSMutableArray alloc] initWithCapacity:0];
19     }
20     return self;
21 }
22
23 - (NSMenu *)menu
24 {
25     NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
26     NSArray *menuArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"menu"];
27     NSEnumerator *enumerator = [menuArray objectEnumerator];
28     NSString *nextObject;
29     ITMTRemote *currentRemote = [[MainController sharedController] currentRemote];
30     NSMenuItem *tempItem;
31     
32     //Get the current playlist, track index, etc.
33     int playlistIndex = [currentRemote currentPlaylistIndex];
34     //int trackIndex = [currentRemote currentSongIndex];
35     
36     //create our menu
37     while ( (nextObject = [enumerator nextObject]) ) {
38         //Main menu items
39         if ([nextObject isEqualToString:@"Play/Pause"]) {
40             tempItem = [menu addItemWithTitle:@"Play"
41                     action:@selector(performMainMenuAction:)
42                     keyEquivalent:@""];
43             [tempItem setTag:MTMenuPlayPauseItem];
44             [tempItem setTarget:self];
45             
46             switch ([currentRemote playerPlayingState]) {
47                 case ITMTRemotePlayerPlaying:
48                     [tempItem setTitle:@"Pause"];
49                 break;
50                 case ITMTRemotePlayerRewinding:
51                 case ITMTRemotePlayerForwarding:
52                     [tempItem setTitle:@"Resume"];
53                 break;
54                 default:
55                 break;
56             }
57         } else if ([nextObject isEqualToString:@"Next Track"]) {
58             tempItem = [menu addItemWithTitle:@"Next Track"
59                     action:@selector(performMainMenuAction:)
60                     keyEquivalent:@""];
61             if (playlistIndex) {
62                 [tempItem setTag:MTMenuNextTrackItem];
63                 [tempItem setTarget:self];
64             }
65         } else if ([nextObject isEqualToString:@"Previous Track"]) {
66             tempItem = [menu addItemWithTitle:@"Previous Track"
67                     action:@selector(performMainMenuAction:)
68                     keyEquivalent:@""];
69             if (playlistIndex) {
70                 [tempItem setTag:MTMenuPreviousTrackItem];
71                 [tempItem setTarget:self];
72             }
73         } else if ([nextObject isEqualToString:@"Fast Forward"]) {
74             tempItem = [menu addItemWithTitle:@"Fast Forward"
75                     action:@selector(performMainMenuAction:)
76                     keyEquivalent:@""];
77             if (playlistIndex) {
78                 [tempItem setTag:MTMenuFastForwardItem];
79                 [tempItem setTarget:self];
80             }
81         } else if ([nextObject isEqualToString:@"Rewind"]) {
82             tempItem = [menu addItemWithTitle:@"Rewind"
83                     action:@selector(performMainMenuAction:)
84                     keyEquivalent:@""];
85             if (playlistIndex) {
86                 [tempItem setTag:MTMenuRewindItem];
87                 [tempItem setTarget:self];
88             }
89         } else if ([nextObject isEqualToString:@"Preferences"]) {
90             tempItem = [menu addItemWithTitle:@"Preferences..."
91                     action:@selector(performMainMenuAction:)
92                     keyEquivalent:@""];
93             [tempItem setTag:MTMenuPreferencesItem];
94             [tempItem setTarget:self];
95         } else if ([nextObject isEqualToString:@"Quit"]) {
96             tempItem = [menu addItemWithTitle:@"Quit"
97                     action:@selector(performMainMenuAction:)
98                     keyEquivalent:@""];
99             [tempItem setTag:MTMenuQuitItem];
100             [tempItem setTarget:self];
101         } else if ([nextObject isEqualToString:@"Current Track Info"]) {
102             if (playlistIndex) {
103                 NSString *title = [currentRemote currentSongTitle];
104                 
105                 [menu addItemWithTitle:@"Now Playing" action:NULL keyEquivalent:@""];
106                 
107                 if ([title length] > 0) {
108                     [menu addItemWithTitle:[NSString stringWithFormat:@"         %@", title] action:nil keyEquivalent:@""];
109                 }
110             } else {
111                 [menu addItemWithTitle:@"No Song" action:NULL keyEquivalent:@""];
112             }
113         } else if ([nextObject isEqualToString:@"<separator>"]) {
114             [menu addItem:[NSMenuItem separatorItem]];
115         //Submenu items
116         } else if ([nextObject isEqualToString:@"Song Rating"]) {
117             tempItem = [menu addItemWithTitle:@"Song Rating"
118                     action:nil
119                     keyEquivalent:@""];
120             //[tempItem setSubmenu:[self ratingMenu]];
121         } else if ([nextObject isEqualToString:@"Upcoming Songs"]) {
122             tempItem = [menu addItemWithTitle:@"Upcoming Songs"
123                     action:nil
124                     keyEquivalent:@""];
125             //[tempItem setSubmenu:[self upcomingSongsMenu]];
126         } else if ([nextObject isEqualToString:@"Playlists"]) {
127             tempItem = [menu addItemWithTitle:@"Playlists"
128                     action:nil
129                     keyEquivalent:@""];
130             //[tempItem setSubmenu:[self playlistsMenu]];
131         } else if ([nextObject isEqualToString:@"EQ Presets"]) {
132             tempItem = [menu addItemWithTitle:@"EQ Presets"
133                     action:nil
134                     keyEquivalent:@""];
135             //[tempItem setSubmenu:[self eqMenu]];
136         }
137     }
138     
139     [_currentMenu release];
140     _currentMenu = menu;
141     return _currentMenu;
142 }
143
144 - (NSMenu *)menuForNoPlayer
145 {
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];
157 }
158
159 - (void)performMainMenuAction:(id)sender
160 {
161     switch ( [sender tag] )
162     {
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.
167             break;
168         case MTMenuFastForwardItem:
169             NSLog(@"MenuController: Fast Forward");
170             [[MainController sharedController] fastForward];
171             //make sure play/pause item says sane through this
172             break;
173         case MTMenuRewindItem:
174             NSLog(@"MenuController: Rewind");
175             [[MainController sharedController] rewind];
176             //make sure play/pause item says sane through this
177             break;
178         case MTMenuPreviousTrackItem:
179             NSLog(@"MenuController: Previous Track");
180             [[MainController sharedController] prevSong];
181             break;
182         case MTMenuNextTrackItem:
183             NSLog(@"MenuController: Next Track");
184             [[MainController sharedController] nextSong];
185             break;
186         case MTMenuPreferencesItem:
187             NSLog(@"MenuController: Preferences...");
188             [[MainController sharedController] showPreferences];
189             break;
190         case MTMenuQuitItem:
191             NSLog(@"MenuController: Quit");
192             [[MainController sharedController] quitMenuTunes];
193             break;
194         default:
195             NSLog(@"MenuController: Unimplemented Menu Item OR Child-bearing Menu Item");
196             break;
197     }
198 }
199
200 - (void)performRatingMenuAction:(id)sender
201 {
202     [[MainController sharedController] selectSongRating:[sender tag]];
203 }
204
205 - (void)performPlaylistMenuAction:(id)sender
206 {
207     [[MainController sharedController] selectPlaylistAtIndex:[sender tag]];
208 }
209
210 - (void)performEqualizerMenuAction:(id)sender
211 {
212     [[MainController sharedController] selectEQPresetAtIndex:[sender tag]];
213 }
214
215 - (void)performUpcomingSongsMenuAction:(id)sender
216 {
217     [[MainController sharedController] selectSongAtIndex:[sender tag]];
218 }
219
220 - (void)updateMenu
221 {
222     
223     [_currentMenu update];
224 }
225
226 - (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem
227 {
228     return YES;
229 }
230
231 - (NSString *)systemUIColor
232 {
233     NSDictionary *tmpDict;
234     NSNumber *tmpNumber;
235     if ( (tmpDict = [NSDictionary dictionaryWithContentsOfFile:[@"~/Library/Preferences/.GlobalPreferences.plist" stringByExpandingTildeInPath]]) ) {
236         if ( (tmpNumber = [tmpDict objectForKey:@"AppleAquaColorVariant"]) ) {
237             if ( ([tmpNumber intValue] == 1) ) {
238                 return @"Aqua";
239             } else {
240                 return @"Graphite";
241             }
242         } else {
243             return @"Aqua";
244         }
245     } else {
246         return @"Aqua";
247     }
248 }
249
250 - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers
251         onItem:(NSMenuItem *)item
252 {
253     unichar charcode = 'a';
254     int i;
255     long cocoaModifiers = 0;
256     static long carbonToCocoa[6][2] = 
257     {
258         { cmdKey, NSCommandKeyMask },
259         { optionKey, NSAlternateKeyMask },
260         { controlKey, NSControlKeyMask },
261         { shiftKey, NSShiftKeyMask },
262     };
263     
264     for (i = 0; i < 6; i++) {
265         if (modifiers & carbonToCocoa[i][0]) {
266             cocoaModifiers += carbonToCocoa[i][1];
267         }
268     }
269     [item setKeyEquivalentModifierMask:cocoaModifiers];
270     
271     //Missing key combos for some keys. Must find them later.
272     switch (code)
273     {
274         case 36:
275             charcode = '\r';
276         break;
277         
278         case 48:
279             charcode = '\t';
280         break;
281         
282         //Space -- ARGH!
283         case 49:
284         {
285             // Haven't tested this, though it should work.
286             // This doesn't work. :'(
287             unichar buffer;
288             [[NSString stringWithString:@"Space"] getCharacters:&buffer];
289             charcode = 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);
295             charcode = 'b';*/
296             
297         }
298         break;
299         
300         case 51:
301             charcode = NSDeleteFunctionKey;
302         break;
303         
304         case 53:
305             charcode = '\e';
306         break;
307         
308         case 71:
309             charcode = '\e';
310         break;
311         
312         case 76:
313             charcode = '\r';
314         break;
315         
316         case 96:
317             charcode = NSF5FunctionKey;
318         break;
319         
320         case 97:
321             charcode = NSF6FunctionKey;
322         break;
323         
324         case 98:
325             charcode = NSF7FunctionKey;
326         break;
327         
328         case 99:
329             charcode = NSF3FunctionKey;
330         break;
331         
332         case 100:
333             charcode = NSF8FunctionKey;
334         break;
335         
336         case 101:
337             charcode = NSF9FunctionKey;
338         break;
339         
340         case 103:
341             charcode = NSF11FunctionKey;
342         break;
343         
344         case 105:
345             charcode = NSF3FunctionKey;
346         break;
347         
348         case 107:
349             charcode = NSF14FunctionKey;
350         break;
351         
352         case 109:
353             charcode = NSF10FunctionKey;
354         break;
355         
356         case 111:
357             charcode = NSF12FunctionKey;
358         break;
359         
360         case 113:
361             charcode = NSF13FunctionKey;
362         break;
363         
364         case 114:
365             charcode = NSInsertFunctionKey;
366         break;
367         
368         case 115:
369             charcode = NSHomeFunctionKey;
370         break;
371         
372         case 116:
373             charcode = NSPageUpFunctionKey;
374         break;
375         
376         case 117:
377             charcode = NSDeleteFunctionKey;
378         break;
379         
380         case 118:
381             charcode = NSF4FunctionKey;
382         break;
383         
384         case 119:
385             charcode = NSEndFunctionKey;
386         break;
387         
388         case 120:
389             charcode = NSF2FunctionKey;
390         break;
391         
392         case 121:
393             charcode = NSPageDownFunctionKey;
394         break;
395         
396         case 122:
397             charcode = NSF1FunctionKey;
398         break;
399         
400         case 123:
401             charcode = NSLeftArrowFunctionKey;
402         break;
403         
404         case 124:
405             charcode = NSRightArrowFunctionKey;
406         break;
407         
408         case 125:
409             charcode = NSDownArrowFunctionKey;
410         break;
411         
412         case 126:
413             charcode = NSUpArrowFunctionKey;
414         break;
415     }
416     
417     if (charcode == 'a') {
418         unsigned long state;
419         long keyTrans;
420         char charCode;
421         Ptr kchr;
422         state = 0;
423         kchr = (Ptr) GetScriptVariable(smCurrentScript, smKCHRCache);
424         keyTrans = KeyTranslate(kchr, code, &state);
425         charCode = keyTrans;
426         [item setKeyEquivalent:[NSString stringWithCString:&charCode length:1]];
427     } else if (charcode != 'b') {
428         [item setKeyEquivalent:[NSString stringWithCharacters:&charcode length:1]];
429     }
430 }
431
432 @end