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