Tons of new stuff. Made is compile now too :)
[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     // dynamically create menu from supplied data and layout information.
37     while ( (nextObject = [enumerator nextObject]) ) {
38         if ([nextObject isEqualToString:@"Play/Pause"]) {
39             if ([currentRemote playerPlayingState] == ITMTRemotePlayerPlaying) {
40                 tempItem = [menu addItemWithTitle:@"Pause"
41                         action:@selector(performMainMenuAction:)
42                         keyEquivalent:@""];
43                 [tempItem setTag:MTMenuPlayPauseItem];
44                 [tempItem setTarget:self];
45             } else {
46                 tempItem = [menu addItemWithTitle:@"Play"
47                         action:@selector(performMainMenuAction:)
48                         keyEquivalent:@""];
49                 [tempItem setTag:MTMenuPlayPauseItem];
50                 [tempItem setTarget:self];
51             }
52         }
53         
54         if ([nextObject isEqualToString:@"Current Track Info"]) {
55             NSString *title = [currentRemote currentSongTitle];
56             [menu addItemWithTitle:@"Now Playing" action:NULL keyEquivalent:@""];
57             
58             if ([title length] > 0) {
59                 [menu addItemWithTitle:[NSString stringWithFormat:@"     %@", title] action:nil keyEquivalent:@""];
60             }
61         }
62         //Do cool stuff here woo hehe gack yay! 0_o
63     }
64     
65     [_currentMenu release];
66     _currentMenu = menu;
67     return _currentMenu;
68 }
69
70 - (void)performMainMenuAction:(id)sender
71 {
72     switch ( [sender tag] )
73     {
74         case MTMenuPlayPauseItem:
75             NSLog(@"MenuController: Play/Pause");
76             [[MainController sharedController] playPause];
77             //We're gonna have to change the Play menu item to Pause here too.
78             break;
79         case MTMenuFastForwardItem:
80             NSLog(@"MenuController: Fast Forward");
81             [[MainController sharedController] fastForward];
82             //make sure play/pause item says sane through this
83             break;
84         case MTMenuRewindItem:
85             NSLog(@"MenuController: Rewind");
86             [[MainController sharedController] rewind];
87             //make sure play/pause item says sane through this
88             break;
89         case MTMenuPreviousTrackItem:
90             NSLog(@"MenuController: Previous Track");
91             [[MainController sharedController] prevSong];
92             break;
93         case MTMenuNextTrackItem:
94             NSLog(@"MenuController: Next Track");
95             [[MainController sharedController] nextSong];
96             break;
97         case MTMenuPreferencesItem:
98             NSLog(@"MenuController: Preferences...");
99             [[MainController sharedController] showPreferences];
100             break;
101         case MTMenuQuitItem:
102             NSLog(@"MenuController: Quit");
103             [[MainController sharedController] quitMenuTunes];
104             break;
105         default:
106             NSLog(@"MenuController: Unimplemented Menu Item OR Child-bearing Menu Item");
107             break;
108     }
109 }
110
111 - (void)performRatingMenuAction:(id)sender
112 {
113     [[MainController sharedController] selectSongRating:[sender tag]];
114 }
115
116 - (void)performPlaylistMenuAction:(id)sender
117 {
118     [[MainController sharedController] selectPlaylistAtIndex:[sender tag]];
119 }
120
121 - (void)performEqualizerMenuAction:(id)sender
122 {
123     [[MainController sharedController] selectEQPresetAtIndex:[sender tag]];
124 }
125
126 - (void)performUpcomingSongsMenuAction:(id)sender
127 {
128     [[MainController sharedController] selectSongAtIndex:[sender tag]];
129 }
130
131 - (void)updateMenu
132 {
133     
134     [_currentMenu update];
135 }
136
137 - (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem
138 {
139     return YES;
140 }
141
142 - (NSString *)systemUIColor
143 {
144     NSDictionary *tmpDict;
145     NSNumber *tmpNumber;
146     if ( (tmpDict = [NSDictionary dictionaryWithContentsOfFile:[@"~/Library/Preferences/.GlobalPreferences.plist" stringByExpandingTildeInPath]]) ) {
147         if ( (tmpNumber = [tmpDict objectForKey:@"AppleAquaColorVariant"]) ) {
148             if ( ([tmpNumber intValue] == 1) ) {
149                 return @"Aqua";
150             } else {
151                 return @"Graphite";
152             }
153         } else {
154             return @"Aqua";
155         }
156     } else {
157         return @"Aqua";
158     }
159 }
160
161 - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers
162         onItem:(NSMenuItem *)item
163 {
164     unichar charcode = 'a';
165     int i;
166     long cocoaModifiers = 0;
167     static long carbonToCocoa[6][2] = 
168     {
169         { cmdKey, NSCommandKeyMask },
170         { optionKey, NSAlternateKeyMask },
171         { controlKey, NSControlKeyMask },
172         { shiftKey, NSShiftKeyMask },
173     };
174     
175     for (i = 0; i < 6; i++) {
176         if (modifiers & carbonToCocoa[i][0]) {
177             cocoaModifiers += carbonToCocoa[i][1];
178         }
179     }
180     [item setKeyEquivalentModifierMask:cocoaModifiers];
181     
182     //Missing key combos for some keys. Must find them later.
183     switch (code)
184     {
185         case 36:
186             charcode = '\r';
187         break;
188         
189         case 48:
190             charcode = '\t';
191         break;
192         
193         //Space -- ARGH!
194         case 49:
195         {
196             // Haven't tested this, though it should work.
197             unichar buffer;
198             [[NSString stringWithString:@"Space"] getCharacters:&buffer];
199             charcode = buffer;
200             /*MenuRef menuRef = _NSGetCarbonMenu([item menu]);
201             NSLog(@"%@", menuRef);
202             SetMenuItemCommandKey(menuRef, 0, NO, 49);
203             SetMenuItemModifiers(menuRef, 0, kMenuNoCommandModifier);
204             SetMenuItemKeyGlyph(menuRef, 0, kMenuBlankGlyph);
205             charcode = 'b';*/
206             
207         }
208         break;
209         
210         case 51:
211             charcode = NSDeleteFunctionKey;
212         break;
213         
214         case 53:
215             charcode = '\e';
216         break;
217         
218         case 71:
219             charcode = '\e';
220         break;
221         
222         case 76:
223             charcode = '\r';
224         break;
225         
226         case 96:
227             charcode = NSF5FunctionKey;
228         break;
229         
230         case 97:
231             charcode = NSF6FunctionKey;
232         break;
233         
234         case 98:
235             charcode = NSF7FunctionKey;
236         break;
237         
238         case 99:
239             charcode = NSF3FunctionKey;
240         break;
241         
242         case 100:
243             charcode = NSF8FunctionKey;
244         break;
245         
246         case 101:
247             charcode = NSF9FunctionKey;
248         break;
249         
250         case 103:
251             charcode = NSF11FunctionKey;
252         break;
253         
254         case 105:
255             charcode = NSF3FunctionKey;
256         break;
257         
258         case 107:
259             charcode = NSF14FunctionKey;
260         break;
261         
262         case 109:
263             charcode = NSF10FunctionKey;
264         break;
265         
266         case 111:
267             charcode = NSF12FunctionKey;
268         break;
269         
270         case 113:
271             charcode = NSF13FunctionKey;
272         break;
273         
274         case 114:
275             charcode = NSInsertFunctionKey;
276         break;
277         
278         case 115:
279             charcode = NSHomeFunctionKey;
280         break;
281         
282         case 116:
283             charcode = NSPageUpFunctionKey;
284         break;
285         
286         case 117:
287             charcode = NSDeleteFunctionKey;
288         break;
289         
290         case 118:
291             charcode = NSF4FunctionKey;
292         break;
293         
294         case 119:
295             charcode = NSEndFunctionKey;
296         break;
297         
298         case 120:
299             charcode = NSF2FunctionKey;
300         break;
301         
302         case 121:
303             charcode = NSPageDownFunctionKey;
304         break;
305         
306         case 122:
307             charcode = NSF1FunctionKey;
308         break;
309         
310         case 123:
311             charcode = NSLeftArrowFunctionKey;
312         break;
313         
314         case 124:
315             charcode = NSRightArrowFunctionKey;
316         break;
317         
318         case 125:
319             charcode = NSDownArrowFunctionKey;
320         break;
321         
322         case 126:
323             charcode = NSUpArrowFunctionKey;
324         break;
325     }
326     
327     if (charcode == 'a') {
328         unsigned long state;
329         long keyTrans;
330         char charCode;
331         Ptr kchr;
332         state = 0;
333         kchr = (Ptr) GetScriptVariable(smCurrentScript, smKCHRCache);
334         keyTrans = KeyTranslate(kchr, code, &state);
335         charCode = keyTrans;
336         [item setKeyEquivalent:[NSString stringWithCString:&charCode length:1]];
337     } else if (charcode != 'b') {
338         [item setKeyEquivalent:[NSString stringWithCharacters:&charcode length:1]];
339     }
340 }
341
342 @end