Menu now indents using carbon.
[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 "MainController.h"
11 #import <ITFoundation/ITDebug.h>
12 #import <ITKit/ITHotKeyCenter.h>
13 #import <ITKit/ITHotKey.h>
14 #import <ITKit/ITKeyCombo.h>
15 #import <ITKit/ITCategory-NSMenu.h>
16
17 @interface MenuController (SubmenuMethods)
18 - (NSMenu *)ratingMenu;
19 - (NSMenu *)upcomingSongsMenu;
20 - (NSMenu *)playlistsMenu;
21 - (NSMenu *)eqMenu;
22 - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers
23         onItem:(NSMenuItem *)item;
24 @end
25
26 @implementation MenuController
27
28 - (id)init
29 {
30     if ( (self = [super init]) ) {
31         _menuLayout = [[NSMutableArray alloc] initWithCapacity:0];
32     }
33     return self;
34 }
35
36 - (NSMenu *)menu
37 {
38     NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
39     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
40     NSArray *menuArray = [defaults arrayForKey:@"menu"];
41     NSEnumerator *enumerator = [menuArray objectEnumerator];
42     NSString *nextObject;
43     NSMenuItem *tempItem;
44     NSEnumerator *itemEnum;
45     ITHotKey *hotKey;
46     NSArray *hotKeys = [[ITHotKeyCenter sharedCenter] allHotKeys];
47     
48     //Get the information
49     _currentPlaylist = [currentRemote currentPlaylistIndex];
50     _playingRadio = ([currentRemote currentPlaylistClass] == ITMTRemotePlayerRadioPlaylist);
51     
52     //Kill the old submenu items
53     if ( (tempItem = [_currentMenu itemWithTag:1]) ) {
54         [tempItem setSubmenu:nil];
55     }
56     
57     if ( (tempItem = [_currentMenu itemWithTag:2]) ) {
58         [tempItem setSubmenu:nil];
59     }
60     
61     if ( (tempItem = [_currentMenu itemWithTag:3]) ) {
62         [tempItem setSubmenu:nil];
63     }
64     
65     if ( (tempItem = [_currentMenu itemWithTag:4]) ) {
66         [tempItem setSubmenu:nil];
67     }
68     
69     ITDebugLog(@"Begin building menu.");
70     
71     //create our menu
72     while ( (nextObject = [enumerator nextObject]) ) {
73         //Main menu items
74         if ([nextObject isEqualToString:@"playPause"]) {
75             ITDebugLog(@"Add play/pause menu item.");
76             tempItem = [menu addItemWithTitle:NSLocalizedString(@"play", @"Play")
77                     action:@selector(performMainMenuAction:)
78                     keyEquivalent:@""];
79             [tempItem setTag:MTMenuPlayPauseItem];
80             [tempItem setTarget:self];
81             
82             itemEnum = [hotKeys objectEnumerator];
83             while ( (hotKey = [itemEnum nextObject]) ) {
84                 if ([[hotKey name] isEqualToString:@"PlayPause"]) {
85                     ITKeyCombo *combo = [hotKey keyCombo];
86                     [self setKeyEquivalentForCode:[combo keyCode]
87                           andModifiers:[combo modifiers]
88                           onItem:tempItem];
89                 }
90             }
91             
92             switch ([currentRemote playerPlayingState]) {
93                 case ITMTRemotePlayerPlaying:
94                     [tempItem setTitle:NSLocalizedString(@"pause", @"Pause")];
95                 break;
96                 case ITMTRemotePlayerRewinding:
97                 case ITMTRemotePlayerForwarding:
98                     [tempItem setTitle:NSLocalizedString(@"resume", @"Resume")];
99                 break;
100                 default:
101                 break;
102             }
103         } else if ([nextObject isEqualToString:@"nextTrack"]) {
104             ITDebugLog(@"Add next track menu item.");
105             tempItem = [menu addItemWithTitle:NSLocalizedString(@"nextTrack", @"Next Track")
106                     action:@selector(performMainMenuAction:)
107                     keyEquivalent:@""];
108             
109             itemEnum = [hotKeys objectEnumerator];
110             while ( (hotKey = [itemEnum nextObject]) ) {
111                 if ([[hotKey name] isEqualToString:@"NextTrack"]) {
112                     ITKeyCombo *combo = [hotKey keyCombo];
113                     [self setKeyEquivalentForCode:[combo keyCode]
114                           andModifiers:[combo modifiers]
115                           onItem:tempItem];
116                 }
117             }
118             
119             if (_currentPlaylist) {
120                 [tempItem setTag:MTMenuNextTrackItem];
121                 [tempItem setTarget:self];
122             }
123         } else if ([nextObject isEqualToString:@"prevTrack"]) {
124             ITDebugLog(@"Add previous track menu item.");
125             tempItem = [menu addItemWithTitle:NSLocalizedString(@"prevTrack", @"Previous Track")
126                     action:@selector(performMainMenuAction:)
127                     keyEquivalent:@""];
128             
129             itemEnum = [hotKeys objectEnumerator];
130             while ( (hotKey = [itemEnum nextObject]) ) {
131                 if ([[hotKey name] isEqualToString:@"PrevTrack"]) {
132                     ITKeyCombo *combo = [hotKey keyCombo];
133                     [self setKeyEquivalentForCode:[combo keyCode]
134                           andModifiers:[combo modifiers]
135                           onItem:tempItem];
136                 }
137             }
138             
139             if (_currentPlaylist) {
140                 [tempItem setTag:MTMenuPreviousTrackItem];
141                 [tempItem setTarget:self];
142             }
143         } else if ([nextObject isEqualToString:@"fastForward"]) {
144             ITDebugLog(@"Add fast forward menu item.");
145             tempItem = [menu addItemWithTitle:NSLocalizedString(@"fastForward", @"Fast Forward")
146                     action:@selector(performMainMenuAction:)
147                     keyEquivalent:@""];
148             if (_currentPlaylist) {
149                 [tempItem setTag:MTMenuFastForwardItem];
150                 [tempItem setTarget:self];
151             }
152         } else if ([nextObject isEqualToString:@"rewind"]) {
153             ITDebugLog(@"Add rewind menu item.");
154             tempItem = [menu addItemWithTitle:NSLocalizedString(@"rewind", @"Rewind")
155                     action:@selector(performMainMenuAction:)
156                     keyEquivalent:@""];
157             if (_currentPlaylist) {
158                 [tempItem setTag:MTMenuRewindItem];
159                 [tempItem setTarget:self];
160             }
161         } else if ([nextObject isEqualToString:@"showPlayer"]) {
162             ITDebugLog(@"Add show player menu item.");
163             tempItem = [menu addItemWithTitle:[NSString stringWithFormat:@"%@ %@",
164                             NSLocalizedString(@"show", @"Show"),
165                             [[[MainController sharedController] currentRemote] playerSimpleName]]
166                     action:@selector(performMainMenuAction:)
167                     keyEquivalent:@""];
168             
169             itemEnum = [hotKeys objectEnumerator];
170             while ( (hotKey = [itemEnum nextObject]) ) {
171                 if ([[hotKey name] isEqualToString:@"ShowPlayer"]) {
172                     ITKeyCombo *combo = [hotKey keyCombo];
173                     [self setKeyEquivalentForCode:[combo keyCode]
174                           andModifiers:[combo modifiers]
175                           onItem:tempItem];
176                 }
177             }
178             
179             [tempItem setTarget:self];
180             [tempItem setTag:MTMenuShowPlayerItem];
181         } else if ([nextObject isEqualToString:@"preferences"]) {
182             ITDebugLog(@"Add preferences menu item.");
183             tempItem = [menu addItemWithTitle:NSLocalizedString(@"preferences", @"Preferences...")
184                     action:@selector(performMainMenuAction:)
185                     keyEquivalent:@""];
186             [tempItem setTag:MTMenuPreferencesItem];
187             [tempItem setTarget:self];
188         } else if ([nextObject isEqualToString:@"quit"]) {
189             tempItem = [menu addItemWithTitle:NSLocalizedString(@"quit", @"Quit")
190                     action:@selector(performMainMenuAction:)
191                     keyEquivalent:@""];
192             [tempItem setTag:MTMenuQuitItem];
193             [tempItem setTarget:self];
194         } else if ([nextObject isEqualToString:@"trackInfo"]) {
195             ITDebugLog(@"Add track info menu items.");
196             //Handle playing radio too
197             if (_currentPlaylist) {
198                 NSString *title = [currentRemote currentSongTitle];
199                 
200                 [menu addItemWithTitle:NSLocalizedString(@"nowPlaying", @"Now Playing") action:NULL keyEquivalent:@""];
201                 
202                 if ([title length] > 0) {
203                     [menu indentItem:
204                         [menu addItemWithTitle:title action:nil keyEquivalent:@""]];
205                 }
206                 
207                 if ([defaults boolForKey:@"showAlbum"]) {
208                     NSString *curAlbum = [currentRemote currentSongAlbum];
209                     if ([curAlbum length]) {
210                         [menu indentItem:
211                             [menu addItemWithTitle:curAlbum action:nil keyEquivalent:@""]];
212                     }
213                 }
214                 
215                 if ([defaults boolForKey:@"showArtist"]) {
216                     NSString *curArtist = [currentRemote currentSongArtist];
217                     if ([curArtist length]) {
218                         [menu indentItem:
219                             [menu addItemWithTitle:curArtist action:nil keyEquivalent:@""]];
220                     }
221                 }
222                 
223                 if ([defaults boolForKey:@"showTrackNumber"]) {
224                     int track = [currentRemote currentSongTrack];
225                     if (track) {
226                         [menu indentItem:
227                             [menu addItemWithTitle:[NSString stringWithFormat:@"%@ %i", NSLocalizedString(@"track", @"Track"), track] action:nil keyEquivalent:@""]];
228                     }
229                 }
230                 
231                 if ([defaults boolForKey:@"showTime"]) {
232                     int left = [[currentRemote currentSongRemaining] intValue];
233                     NSString *remaining = [NSString stringWithFormat:@"%i:%02i", left / 60, left % 60];
234                     [menu indentItem:[menu addItemWithTitle:[NSString stringWithFormat:@"%@/%@", remaining, [currentRemote currentSongLength]] action:nil keyEquivalent:@""]];
235                 }
236                 
237                 if ([defaults boolForKey:@"showTrackRating"]) {
238                     NSString *string = nil;
239                     switch ((int)([currentRemote currentSongRating] * 5)) {
240                         case 0:
241                             string = [NSString stringWithUTF8String:"☆☆☆☆☆"];
242                         break;
243                         case 1:
244                             string = [NSString stringWithUTF8String:"★☆☆☆☆"];
245                         break;
246                         case 2:
247                             string = [NSString stringWithUTF8String:"★★☆☆☆"];
248                         break;
249                         case 3:
250                             string = [NSString stringWithUTF8String:"★★★☆☆"];
251                         break;
252                         case 4:
253                             string = [NSString stringWithUTF8String:"★★★★☆"];
254                         break;
255                         case 5:
256                             string = [NSString stringWithUTF8String:"★★★★★"];
257                         break;
258                     }
259                     [menu indentItem:[menu addItemWithTitle:string action:nil keyEquivalent:@""]];
260                 }
261             } else {
262                 [menu addItemWithTitle:NSLocalizedString(@"noSong", @"No Song") action:NULL keyEquivalent:@""];
263             }
264         } else if ([nextObject isEqualToString:@"separator"]) {
265             ITDebugLog(@"Add separator menu item.");
266             [menu addItem:[NSMenuItem separatorItem]];
267         //Submenu items
268         } else if ([nextObject isEqualToString:@"songRating"]) {
269             ITDebugLog(@"Add song rating menu item.");
270             tempItem = [menu addItemWithTitle:NSLocalizedString(@"songRating", @"Song Rating")
271                     action:nil
272                     keyEquivalent:@""];
273             [tempItem setSubmenu:_ratingMenu];
274             [tempItem setTag:1];
275             if (_playingRadio || !_currentPlaylist) {
276                 [tempItem setEnabled:NO];
277             }
278             
279             itemEnum = [[_ratingMenu itemArray] objectEnumerator];
280             while ( (tempItem = [itemEnum nextObject]) ) {
281                 [tempItem setState:NSOffState];
282             }
283             
284             [[_ratingMenu itemAtIndex:([currentRemote currentSongRating] * 5)] setState:NSOnState];
285         } else if ([nextObject isEqualToString:@"upcomingSongs"]) {
286             ITDebugLog(@"Add upcoming songs menu item.");
287             tempItem = [menu addItemWithTitle:NSLocalizedString(@"upcomingSongs", @"Upcoming Songs")
288                     action:nil
289                     keyEquivalent:@""];
290             [tempItem setSubmenu:_upcomingSongsMenu];
291             [tempItem setTag:2];
292             if (_playingRadio || !_currentPlaylist) {
293                 [tempItem setEnabled:NO];
294             }
295         } else if ([nextObject isEqualToString:@"playlists"]) {
296             tempItem = [menu addItemWithTitle:NSLocalizedString(@"playlists", @"Playlists")
297                     action:nil
298                     keyEquivalent:@""];
299             [tempItem setSubmenu:_playlistsMenu];
300             [tempItem setTag:3];
301         } else if ([nextObject isEqualToString:@"eqPresets"]) {
302             ITDebugLog(@"Add eq presets menu item.");
303             tempItem = [menu addItemWithTitle:NSLocalizedString(@"eqPresets", @"EQ Presets")
304                     action:nil
305                     keyEquivalent:@""];
306             [tempItem setSubmenu:_eqMenu];
307             [tempItem setTag:4];
308             
309             itemEnum = [[_eqMenu itemArray] objectEnumerator];
310             while ( (tempItem = [itemEnum nextObject]) ) {
311                 [tempItem setState:NSOffState];
312             }
313             [[_eqMenu itemAtIndex:([currentRemote currentEQPresetIndex] - 1)] setState:NSOnState];
314         }
315     }
316     ITDebugLog(@"Finished building menu.");
317     [_currentMenu release];
318     _currentMenu = menu;
319     return _currentMenu;
320 }
321
322 - (NSMenu *)menuForNoPlayer
323 {
324     NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
325     NSMenuItem *tempItem;
326     tempItem = [menu addItemWithTitle:[NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"open", @"Open"), [[[MainController sharedController] currentRemote] playerSimpleName]] action:@selector(performMainMenuAction:) keyEquivalent:@""];
327     [tempItem setTag:MTMenuShowPlayerItem];
328     [tempItem setTarget:self];
329     [menu addItem:[NSMenuItem separatorItem]];
330     tempItem = [menu addItemWithTitle:NSLocalizedString(@"preferences", @"Preferences...") action:@selector(performMainMenuAction:) keyEquivalent:@""];
331     [tempItem setTag:MTMenuPreferencesItem];
332     [tempItem setTarget:self];
333     tempItem = [menu addItemWithTitle:NSLocalizedString(@"quit", @"Quit") action:@selector(performMainMenuAction:) keyEquivalent:@""];
334     [tempItem setTag:MTMenuQuitItem];
335     [tempItem setTarget:self];
336     return [menu autorelease];
337 }
338
339 - (void)rebuildSubmenus
340 {
341     currentRemote = [[MainController sharedController] currentRemote];
342     _currentPlaylist = [currentRemote currentPlaylistIndex];
343     _currentTrack = [currentRemote currentSongIndex];
344     _playingRadio = ([currentRemote currentPlaylistClass] == ITMTRemotePlayerRadioPlaylist);
345     
346     [_ratingMenu release];
347     [_upcomingSongsMenu release];
348     [_playlistsMenu release];
349     [_eqMenu release];
350     _ratingMenu = [self ratingMenu];
351     _upcomingSongsMenu = [self upcomingSongsMenu];
352     _playlistsMenu = [self playlistsMenu];
353     _eqMenu = [self eqMenu];
354 }
355
356 - (NSMenu *)ratingMenu
357 {
358     NSMenu *ratingMenu = [[NSMenu alloc] initWithTitle:@""];
359     NSEnumerator *itemEnum;
360     id  anItem;
361     int itemTag = 0;
362     SEL itemSelector = @selector(performRatingMenuAction:);
363     
364     ITDebugLog(@"Building rating menu.");
365     
366     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"☆☆☆☆☆"] action:nil keyEquivalent:@""];
367     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★☆☆☆☆"] action:nil keyEquivalent:@""];
368     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★☆☆☆"] action:nil keyEquivalent:@""];
369     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★☆☆"] action:nil keyEquivalent:@""];
370     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★☆"] action:nil keyEquivalent:@""];
371     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★★"] action:nil keyEquivalent:@""];
372     
373     itemEnum = [[ratingMenu itemArray] objectEnumerator];
374     while ( (anItem = [itemEnum nextObject]) ) {
375         [anItem setAction:itemSelector];
376         [anItem setTarget:self];
377         [anItem setTag:itemTag];
378         itemTag += 20;
379     }
380     return ratingMenu;
381 }
382
383 - (NSMenu *)upcomingSongsMenu
384 {
385     NSMenu *upcomingSongsMenu = [[NSMenu alloc] initWithTitle:@""];
386     int numSongs = [currentRemote numberOfSongsInPlaylistAtIndex:_currentPlaylist];
387     int numSongsInAdvance = [[NSUserDefaults standardUserDefaults] integerForKey:@"SongsInAdvance"];
388     
389     ITDebugLog(@"Building upcoming songs menu.");
390     
391     if (_currentPlaylist && !_playingRadio) {
392         if (numSongs > 0) {
393             int i;
394             
395             for (i = _currentTrack + 1; i <= _currentTrack + numSongsInAdvance; i++) {
396                 if (i <= numSongs) {
397                     NSString *curSong = [currentRemote songTitleAtIndex:i];
398                     NSMenuItem *songItem;
399                     songItem = [upcomingSongsMenu addItemWithTitle:curSong action:@selector(performUpcomingSongsMenuAction:) keyEquivalent:@""];
400                     [songItem setTag:i];
401                     [songItem setTarget:self];
402                 } else {
403                     break;
404                 }
405             }
406         }
407     }
408     return upcomingSongsMenu;
409 }
410
411 - (NSMenu *)playlistsMenu
412 {
413     NSMenu *playlistsMenu = [[NSMenu alloc] initWithTitle:@""];
414     NSArray *playlists = [currentRemote playlists];
415     NSMenuItem *tempItem;
416     int i;
417     
418     ITDebugLog(@"Building playlists menu.");
419     
420     for (i = 0; i < [playlists count]; i++) {
421         tempItem = [playlistsMenu addItemWithTitle:[playlists objectAtIndex:i] action:@selector(performPlaylistMenuAction:) keyEquivalent:@""];
422         [tempItem setTag:i + 1];
423         [tempItem setTarget:self];
424     }
425     
426     if (!_playingRadio && _currentPlaylist) {
427         [[playlistsMenu itemAtIndex:_currentPlaylist - 1] setState:NSOnState];
428     }
429     return playlistsMenu;
430 }
431
432 - (NSMenu *)eqMenu
433 {
434     NSMenu *eqMenu = [[NSMenu alloc] initWithTitle:@""];
435     NSArray *eqPresets = [currentRemote eqPresets];
436     NSMenuItem *tempItem;
437     int i;
438     
439     ITDebugLog(@"Building EQ presets menu.");
440     
441     for (i = 0; i < [eqPresets count]; i++) {
442         NSString *name;
443         if ( ( name = [eqPresets objectAtIndex:i] ) ) {
444             tempItem = [eqMenu addItemWithTitle:name action:@selector(performEqualizerMenuAction:) keyEquivalent:@""];
445             [tempItem setTag:i];
446             [tempItem setTarget:self];
447         }
448     }
449     return eqMenu;
450 }
451
452 - (void)performMainMenuAction:(id)sender
453 {
454     switch ( [sender tag] )
455     {
456         case MTMenuPlayPauseItem:
457             ITDebugLog(@"MenuController: Play/Pause");
458             [[MainController sharedController] playPause];
459             break;
460         case MTMenuFastForwardItem:
461             ITDebugLog(@"MenuController: Fast Forward");
462             [[MainController sharedController] fastForward];
463             break;
464         case MTMenuRewindItem:
465             ITDebugLog(@"MenuController: Rewind");
466             [[MainController sharedController] rewind];
467             break;
468         case MTMenuPreviousTrackItem:
469             ITDebugLog(@"MenuController: Previous Track");
470             [[MainController sharedController] prevSong];
471             break;
472         case MTMenuNextTrackItem:
473             ITDebugLog(@"MenuController: Next Track");
474             [[MainController sharedController] nextSong];
475             break;
476         case MTMenuShowPlayerItem:
477             ITDebugLog(@"MainController: Show Main Interface");
478             [[MainController sharedController] showPlayer];
479             break;
480         case MTMenuPreferencesItem:
481             ITDebugLog(@"MenuController: Preferences...");
482             [[MainController sharedController] showPreferences];
483             break;
484         case MTMenuQuitItem:
485             ITDebugLog(@"MenuController: Quit");
486             [[MainController sharedController] quitMenuTunes];
487             break;
488         default:
489             ITDebugLog(@"MenuController: Unimplemented Menu Item OR Child-bearing Menu Item");
490             break;
491     }
492 }
493
494 - (void)performRatingMenuAction:(id)sender
495 {
496     [[MainController sharedController] selectSongRating:[sender tag]];
497 }
498
499 - (void)performPlaylistMenuAction:(id)sender
500 {
501     [[MainController sharedController] selectPlaylistAtIndex:[sender tag]];
502 }
503
504 - (void)performEqualizerMenuAction:(id)sender
505 {
506     [[MainController sharedController] selectEQPresetAtIndex:[sender tag]];
507 }
508
509 - (void)performUpcomingSongsMenuAction:(id)sender
510 {
511     [[MainController sharedController] selectSongAtIndex:[sender tag]];
512 }
513
514 - (void)updateMenu
515 {
516     
517     [_currentMenu update];
518 }
519
520 - (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem
521 {
522     return YES;
523 }
524
525 - (NSString *)systemUIColor
526 {
527     NSDictionary *tmpDict;
528     NSNumber *tmpNumber;
529     if ( (tmpDict = [NSDictionary dictionaryWithContentsOfFile:[@"~/Library/Preferences/.GlobalPreferences.plist" stringByExpandingTildeInPath]]) ) {
530         if ( (tmpNumber = [tmpDict objectForKey:@"AppleAquaColorVariant"]) ) {
531             if ( ([tmpNumber intValue] == 1) ) {
532                 return @"Aqua";
533             } else {
534                 return @"Graphite";
535             }
536         } else {
537             return @"Aqua";
538         }
539     } else {
540         return @"Aqua";
541     }
542 }
543
544 - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers
545         onItem:(NSMenuItem *)item
546 {
547     unichar charcode = 'a';
548     int i;
549     long cocoaModifiers = 0;
550     static long carbonToCocoa[6][2] = 
551     {
552         { cmdKey, NSCommandKeyMask },
553         { optionKey, NSAlternateKeyMask },
554         { controlKey, NSControlKeyMask },
555         { shiftKey, NSShiftKeyMask },
556     };
557     
558     for (i = 0; i < 6; i++) {
559         if (modifiers & carbonToCocoa[i][0]) {
560             cocoaModifiers += carbonToCocoa[i][1];
561         }
562     }
563     [item setKeyEquivalentModifierMask:cocoaModifiers];
564     
565     //Missing key combos for some keys. Must find them later.
566     switch (code)
567     {
568         case 36:
569             charcode = '\r';
570         break;
571         
572         case 48:
573             charcode = '\t';
574         break;
575         
576         //Space -- ARGH!
577         case 49:
578         {
579             // Haven't tested this, though it should work.
580             // This doesn't work. :'(
581             unichar buffer;
582             [[NSString stringWithString:@"Space"] getCharacters:&buffer];
583             charcode = buffer;
584             /*MenuRef menuRef = _NSGetCarbonMenu([item menu]);
585             ITDebugLog(@"%@", menuRef);
586             SetMenuItemCommandKey(menuRef, 0, NO, 49);
587             SetMenuItemModifiers(menuRef, 0, kMenuNoCommandModifier);
588             SetMenuItemKeyGlyph(menuRef, 0, kMenuBlankGlyph);
589             charcode = 'b';*/
590             
591         }
592         break;
593         
594         case 51:
595             charcode = NSDeleteFunctionKey;
596         break;
597         
598         case 53:
599             charcode = '\e';
600         break;
601         
602         case 71:
603             charcode = '\e';
604         break;
605         
606         case 76:
607             charcode = '\r';
608         break;
609         
610         case 96:
611             charcode = NSF5FunctionKey;
612         break;
613         
614         case 97:
615             charcode = NSF6FunctionKey;
616         break;
617         
618         case 98:
619             charcode = NSF7FunctionKey;
620         break;
621         
622         case 99:
623             charcode = NSF3FunctionKey;
624         break;
625         
626         case 100:
627             charcode = NSF8FunctionKey;
628         break;
629         
630         case 101:
631             charcode = NSF9FunctionKey;
632         break;
633         
634         case 103:
635             charcode = NSF11FunctionKey;
636         break;
637         
638         case 105:
639             charcode = NSF3FunctionKey;
640         break;
641         
642         case 107:
643             charcode = NSF14FunctionKey;
644         break;
645         
646         case 109:
647             charcode = NSF10FunctionKey;
648         break;
649         
650         case 111:
651             charcode = NSF12FunctionKey;
652         break;
653         
654         case 113:
655             charcode = NSF13FunctionKey;
656         break;
657         
658         case 114:
659             charcode = NSInsertFunctionKey;
660         break;
661         
662         case 115:
663             charcode = NSHomeFunctionKey;
664         break;
665         
666         case 116:
667             charcode = NSPageUpFunctionKey;
668         break;
669         
670         case 117:
671             charcode = NSDeleteFunctionKey;
672         break;
673         
674         case 118:
675             charcode = NSF4FunctionKey;
676         break;
677         
678         case 119:
679             charcode = NSEndFunctionKey;
680         break;
681         
682         case 120:
683             charcode = NSF2FunctionKey;
684         break;
685         
686         case 121:
687             charcode = NSPageDownFunctionKey;
688         break;
689         
690         case 122:
691             charcode = NSF1FunctionKey;
692         break;
693         
694         case 123:
695             charcode = NSLeftArrowFunctionKey;
696         break;
697         
698         case 124:
699             charcode = NSRightArrowFunctionKey;
700         break;
701         
702         case 125:
703             charcode = NSDownArrowFunctionKey;
704         break;
705         
706         case 126:
707             charcode = NSUpArrowFunctionKey;
708         break;
709     }
710     
711     if (charcode == 'a') {
712         unsigned long state;
713         long keyTrans;
714         char charCode;
715         Ptr kchr;
716         state = 0;
717         kchr = (Ptr) GetScriptVariable(smCurrentScript, smKCHRCache);
718         keyTrans = KeyTranslate(kchr, code, &state);
719         charCode = keyTrans;
720         [item setKeyEquivalent:[NSString stringWithCString:&charCode length:1]];
721     } else if (charcode != 'b') {
722         [item setKeyEquivalent:[NSString stringWithCharacters:&charcode length:1]];
723     }
724 }
725
726 @end