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