Added localizability. Gotta delete you prefs for it to work. Some
[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                     [menu addItemWithTitle:[NSString stringWithFormat:@"         %@", [currentRemote currentSongAlbum]]
180                             action:nil
181                             keyEquivalent:@""];
182                 }
183                 
184                 if ([defaults boolForKey:@"showArtist"]) {
185                     [menu addItemWithTitle:[NSString stringWithFormat:@"         %@", [currentRemote currentSongArtist]]
186                             action:nil
187                             keyEquivalent:@""];
188                 }
189                 
190                 if ([defaults boolForKey:@"showTrackNumber"]) {
191                     int track = [currentRemote currentSongTrack];
192                     if (track) {
193                         [menu addItemWithTitle:[NSString stringWithFormat:@"     %@ %i", NSLocalizedString(@"track", @"Track"), track]
194                             action:nil
195                             keyEquivalent:@""];
196                     }
197                 }
198                 
199                 if ([defaults boolForKey:@"showTime"]) {
200                     int left = [[currentRemote currentSongRemaining] intValue];
201                     NSString *remaining = [NSString stringWithFormat:@"%i:%02i", left / 60, left % 60];
202                     [menu addItemWithTitle:[NSString stringWithFormat:@"         %@/%@", remaining, [currentRemote currentSongLength]]
203                             action:nil
204                             keyEquivalent:@""];
205                 }
206             } else {
207                 [menu addItemWithTitle:NSLocalizedString(@"noSong", @"No Song") action:NULL keyEquivalent:@""];
208             }
209         } else if ([nextObject isEqualToString:@"separator"]) {
210             [menu addItem:[NSMenuItem separatorItem]];
211         //Submenu items
212         } else if ([nextObject isEqualToString:@"songRating"]) {
213             tempItem = [menu addItemWithTitle:NSLocalizedString(@"songRating", @"Song Rating")
214                     action:nil
215                     keyEquivalent:@""];
216             [tempItem setSubmenu:_ratingMenu];
217             [tempItem setTag:1];
218             if (_playingRadio || !_currentPlaylist) {
219                 [tempItem setEnabled:NO];
220             }
221             
222             itemEnum = [[_ratingMenu itemArray] objectEnumerator];
223             while ( (tempItem = [itemEnum nextObject]) ) {
224                 [tempItem setState:NSOffState];
225             }
226             
227             [[_ratingMenu itemAtIndex:([currentRemote currentSongRating] * 5)] setState:NSOnState];
228         } else if ([nextObject isEqualToString:@"upcomingSongs"]) {
229             tempItem = [menu addItemWithTitle:NSLocalizedString(@"upcomingSongs", @"Upcoming Songs")
230                     action:nil
231                     keyEquivalent:@""];
232             [tempItem setSubmenu:_upcomingSongsMenu];
233             [tempItem setTag:2];
234             if (_playingRadio || !_currentPlaylist) {
235                 [tempItem setEnabled:NO];
236             }
237         } else if ([nextObject isEqualToString:@"playlists"]) {
238             tempItem = [menu addItemWithTitle:NSLocalizedString(@"playlists", @"Playlists")
239                     action:nil
240                     keyEquivalent:@""];
241             [tempItem setSubmenu:_playlistsMenu];
242             [tempItem setTag:3];
243         } else if ([nextObject isEqualToString:@"eqPresets"]) {
244             tempItem = [menu addItemWithTitle:NSLocalizedString(@"eqPresets", @"EQ Presets")
245                     action:nil
246                     keyEquivalent:@""];
247             [tempItem setSubmenu:_eqMenu];
248             [tempItem setTag:4];
249             
250             itemEnum = [[_eqMenu itemArray] objectEnumerator];
251             while ( (tempItem = [itemEnum nextObject]) ) {
252                 [tempItem setState:NSOffState];
253             }
254             [[_eqMenu itemAtIndex:([currentRemote currentEQPresetIndex] - 1)] setState:NSOnState];
255         }
256     }
257     [_currentMenu release];
258     _currentMenu = menu;
259     return _currentMenu;
260 }
261
262 - (NSMenu *)menuForNoPlayer
263 {
264     NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
265     NSMenuItem *tempItem;
266     tempItem = [menu addItemWithTitle:[NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"open", @"Open"), [[[MainController sharedController] currentRemote] playerSimpleName]] action:@selector(performMainMenuAction:) keyEquivalent:@""];
267     [tempItem setTag:MTMenuShowPlayerItem];
268     [tempItem setTarget:self];
269     [menu addItem:[NSMenuItem separatorItem]];
270     tempItem = [menu addItemWithTitle:NSLocalizedString(@"preferences", @"Preferences...") action:@selector(performMainMenuAction:) keyEquivalent:@""];
271     [tempItem setTag:MTMenuPreferencesItem];
272     [tempItem setTarget:self];
273     tempItem = [menu addItemWithTitle:NSLocalizedString(@"quit", @"Quit") action:@selector(performMainMenuAction:) keyEquivalent:@""];
274     [tempItem setTag:MTMenuQuitItem];
275     [tempItem setTarget:self];
276     return [menu autorelease];
277 }
278
279 - (void)rebuildSubmenus
280 {
281     currentRemote = [[MainController sharedController] currentRemote];
282     _currentPlaylist = [currentRemote currentPlaylistIndex];
283     _currentTrack = [currentRemote currentSongIndex];
284     _playingRadio = ([currentRemote currentPlaylistClass] == ITMTRemotePlayerRadioPlaylist);
285     
286     [_ratingMenu release];
287     [_upcomingSongsMenu release];
288     [_playlistsMenu release];
289     [_eqMenu release];
290     _ratingMenu = [self ratingMenu];
291     _upcomingSongsMenu = [self upcomingSongsMenu];
292     _playlistsMenu = [self playlistsMenu];
293     _eqMenu = [self eqMenu];
294 }
295
296 - (NSMenu *)ratingMenu
297 {
298     NSMenu *ratingMenu = [[NSMenu alloc] initWithTitle:@""];
299     NSEnumerator *itemEnum;
300     id  anItem;
301     int itemTag = 0;
302     SEL itemSelector = @selector(performRatingMenuAction:);
303     
304     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"☆☆☆☆☆"] action:nil keyEquivalent:@""];
305     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★☆☆☆☆"] action:nil keyEquivalent:@""];
306     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★☆☆☆"] action:nil keyEquivalent:@""];
307     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★☆☆"] action:nil keyEquivalent:@""];
308     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★☆"] action:nil keyEquivalent:@""];
309     [ratingMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★★"] action:nil keyEquivalent:@""];
310     
311     itemEnum = [[ratingMenu itemArray] objectEnumerator];
312     while ( (anItem = [itemEnum nextObject]) ) {
313         [anItem setAction:itemSelector];
314         [anItem setTarget:self];
315         [anItem setTag:itemTag];
316         itemTag += 20;
317     }
318     return ratingMenu;
319 }
320
321 - (NSMenu *)upcomingSongsMenu
322 {
323     NSMenu *upcomingSongsMenu = [[NSMenu alloc] initWithTitle:@""];
324     int numSongs = [currentRemote numberOfSongsInPlaylistAtIndex:_currentPlaylist];
325     int numSongsInAdvance = [[NSUserDefaults standardUserDefaults] integerForKey:@"SongsInAdvance"];
326     
327     if (_currentPlaylist && !_playingRadio) {
328         if (numSongs > 0) {
329             int i;
330             
331             for (i = _currentTrack + 1; i <= _currentTrack + numSongsInAdvance; i++) {
332                 if (i <= numSongs) {
333                     NSString *curSong = [currentRemote songTitleAtIndex:i];
334                     NSMenuItem *songItem;
335                     songItem = [upcomingSongsMenu addItemWithTitle:curSong action:@selector(performUpcomingSongsMenuAction:) keyEquivalent:@""];
336                     [songItem setTag:i];
337                     [songItem setTarget:self];
338                 } else {
339                     break;
340                 }
341             }
342         }
343     }
344     return upcomingSongsMenu;
345 }
346
347 - (NSMenu *)playlistsMenu
348 {
349     NSMenu *playlistsMenu = [[NSMenu alloc] initWithTitle:@""];
350     NSArray *playlists = [currentRemote playlists];
351     NSMenuItem *tempItem;
352     int i;
353     
354     for (i = 0; i < [playlists count]; i++) {
355         tempItem = [playlistsMenu addItemWithTitle:[playlists objectAtIndex:i] action:@selector(performPlaylistMenuAction:) keyEquivalent:@""];
356         [tempItem setTag:i + 1];
357         [tempItem setTarget:self];
358     }
359     
360     if (!_playingRadio && _currentPlaylist) {
361         [[playlistsMenu itemAtIndex:_currentPlaylist - 1] setState:NSOnState];
362     }
363     return playlistsMenu;
364 }
365
366 - (NSMenu *)eqMenu
367 {
368     NSMenu *eqMenu = [[NSMenu alloc] initWithTitle:@""];
369     NSArray *eqPresets = [currentRemote eqPresets];
370     NSMenuItem *tempItem;
371     int i;
372     
373     for (i = 0; i < [eqPresets count]; i++) {
374         NSString *name;
375         if ( ( name = [eqPresets objectAtIndex:i] ) ) {
376             tempItem = [eqMenu addItemWithTitle:name action:@selector(performEqualizerMenuAction:) keyEquivalent:@""];
377             [tempItem setTag:i];
378             [tempItem setTarget:self];
379         }
380     }
381     return eqMenu;
382 }
383
384 - (void)performMainMenuAction:(id)sender
385 {
386     switch ( [sender tag] )
387     {
388         case MTMenuPlayPauseItem:
389             NSLog(@"MenuController: Play/Pause");
390             [[MainController sharedController] playPause];
391             break;
392         case MTMenuFastForwardItem:
393             NSLog(@"MenuController: Fast Forward");
394             [[MainController sharedController] fastForward];
395             break;
396         case MTMenuRewindItem:
397             NSLog(@"MenuController: Rewind");
398             [[MainController sharedController] rewind];
399             break;
400         case MTMenuPreviousTrackItem:
401             NSLog(@"MenuController: Previous Track");
402             [[MainController sharedController] prevSong];
403             break;
404         case MTMenuNextTrackItem:
405             NSLog(@"MenuController: Next Track");
406             [[MainController sharedController] nextSong];
407             break;
408         case MTMenuShowPlayerItem:
409             NSLog(@"MainController: Show Main Interface");
410             [[MainController sharedController] showPlayer];
411             break;
412         case MTMenuPreferencesItem:
413             NSLog(@"MenuController: Preferences...");
414             [[MainController sharedController] showPreferences];
415             break;
416         case MTMenuQuitItem:
417             NSLog(@"MenuController: Quit");
418             [[MainController sharedController] quitMenuTunes];
419             break;
420         default:
421             NSLog(@"MenuController: Unimplemented Menu Item OR Child-bearing Menu Item");
422             break;
423     }
424 }
425
426 - (void)performRatingMenuAction:(id)sender
427 {
428     [[MainController sharedController] selectSongRating:[sender tag]];
429 }
430
431 - (void)performPlaylistMenuAction:(id)sender
432 {
433     [[MainController sharedController] selectPlaylistAtIndex:[sender tag]];
434 }
435
436 - (void)performEqualizerMenuAction:(id)sender
437 {
438     [[MainController sharedController] selectEQPresetAtIndex:[sender tag]];
439 }
440
441 - (void)performUpcomingSongsMenuAction:(id)sender
442 {
443     [[MainController sharedController] selectSongAtIndex:[sender tag]];
444 }
445
446 - (void)updateMenu
447 {
448     
449     [_currentMenu update];
450 }
451
452 - (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem
453 {
454     return YES;
455 }
456
457 - (NSString *)systemUIColor
458 {
459     NSDictionary *tmpDict;
460     NSNumber *tmpNumber;
461     if ( (tmpDict = [NSDictionary dictionaryWithContentsOfFile:[@"~/Library/Preferences/.GlobalPreferences.plist" stringByExpandingTildeInPath]]) ) {
462         if ( (tmpNumber = [tmpDict objectForKey:@"AppleAquaColorVariant"]) ) {
463             if ( ([tmpNumber intValue] == 1) ) {
464                 return @"Aqua";
465             } else {
466                 return @"Graphite";
467             }
468         } else {
469             return @"Aqua";
470         }
471     } else {
472         return @"Aqua";
473     }
474 }
475
476 - (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers
477         onItem:(NSMenuItem *)item
478 {
479     unichar charcode = 'a';
480     int i;
481     long cocoaModifiers = 0;
482     static long carbonToCocoa[6][2] = 
483     {
484         { cmdKey, NSCommandKeyMask },
485         { optionKey, NSAlternateKeyMask },
486         { controlKey, NSControlKeyMask },
487         { shiftKey, NSShiftKeyMask },
488     };
489     
490     for (i = 0; i < 6; i++) {
491         if (modifiers & carbonToCocoa[i][0]) {
492             cocoaModifiers += carbonToCocoa[i][1];
493         }
494     }
495     [item setKeyEquivalentModifierMask:cocoaModifiers];
496     
497     //Missing key combos for some keys. Must find them later.
498     switch (code)
499     {
500         case 36:
501             charcode = '\r';
502         break;
503         
504         case 48:
505             charcode = '\t';
506         break;
507         
508         //Space -- ARGH!
509         case 49:
510         {
511             // Haven't tested this, though it should work.
512             // This doesn't work. :'(
513             unichar buffer;
514             [[NSString stringWithString:@"Space"] getCharacters:&buffer];
515             charcode = buffer;
516             /*MenuRef menuRef = _NSGetCarbonMenu([item menu]);
517             NSLog(@"%@", menuRef);
518             SetMenuItemCommandKey(menuRef, 0, NO, 49);
519             SetMenuItemModifiers(menuRef, 0, kMenuNoCommandModifier);
520             SetMenuItemKeyGlyph(menuRef, 0, kMenuBlankGlyph);
521             charcode = 'b';*/
522             
523         }
524         break;
525         
526         case 51:
527             charcode = NSDeleteFunctionKey;
528         break;
529         
530         case 53:
531             charcode = '\e';
532         break;
533         
534         case 71:
535             charcode = '\e';
536         break;
537         
538         case 76:
539             charcode = '\r';
540         break;
541         
542         case 96:
543             charcode = NSF5FunctionKey;
544         break;
545         
546         case 97:
547             charcode = NSF6FunctionKey;
548         break;
549         
550         case 98:
551             charcode = NSF7FunctionKey;
552         break;
553         
554         case 99:
555             charcode = NSF3FunctionKey;
556         break;
557         
558         case 100:
559             charcode = NSF8FunctionKey;
560         break;
561         
562         case 101:
563             charcode = NSF9FunctionKey;
564         break;
565         
566         case 103:
567             charcode = NSF11FunctionKey;
568         break;
569         
570         case 105:
571             charcode = NSF3FunctionKey;
572         break;
573         
574         case 107:
575             charcode = NSF14FunctionKey;
576         break;
577         
578         case 109:
579             charcode = NSF10FunctionKey;
580         break;
581         
582         case 111:
583             charcode = NSF12FunctionKey;
584         break;
585         
586         case 113:
587             charcode = NSF13FunctionKey;
588         break;
589         
590         case 114:
591             charcode = NSInsertFunctionKey;
592         break;
593         
594         case 115:
595             charcode = NSHomeFunctionKey;
596         break;
597         
598         case 116:
599             charcode = NSPageUpFunctionKey;
600         break;
601         
602         case 117:
603             charcode = NSDeleteFunctionKey;
604         break;
605         
606         case 118:
607             charcode = NSF4FunctionKey;
608         break;
609         
610         case 119:
611             charcode = NSEndFunctionKey;
612         break;
613         
614         case 120:
615             charcode = NSF2FunctionKey;
616         break;
617         
618         case 121:
619             charcode = NSPageDownFunctionKey;
620         break;
621         
622         case 122:
623             charcode = NSF1FunctionKey;
624         break;
625         
626         case 123:
627             charcode = NSLeftArrowFunctionKey;
628         break;
629         
630         case 124:
631             charcode = NSRightArrowFunctionKey;
632         break;
633         
634         case 125:
635             charcode = NSDownArrowFunctionKey;
636         break;
637         
638         case 126:
639             charcode = NSUpArrowFunctionKey;
640         break;
641     }
642     
643     if (charcode == 'a') {
644         unsigned long state;
645         long keyTrans;
646         char charCode;
647         Ptr kchr;
648         state = 0;
649         kchr = (Ptr) GetScriptVariable(smCurrentScript, smKCHRCache);
650         keyTrans = KeyTranslate(kchr, code, &state);
651         charCode = keyTrans;
652         [item setKeyEquivalent:[NSString stringWithCString:&charCode length:1]];
653     } else if (charcode != 'b') {
654         [item setKeyEquivalent:[NSString stringWithCharacters:&charcode length:1]];
655     }
656 }
657
658 @end