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