From 6b9ab466464daf5ae2427e67d20c368583bb0568 Mon Sep 17 00:00:00 2001 From: Kent Sutherland Date: Thu, 1 May 2003 11:36:47 +0000 Subject: [PATCH] Stripped out lots of menu building code from MainController, on the order of the Joe. --- MainController.m | 579 +---------------------------------------------- MenuController.m | 181 +++++++++++++++ 2 files changed, 182 insertions(+), 578 deletions(-) diff --git a/MainController.m b/MainController.m index dae6f41..f0ee9ad 100755 --- a/MainController.m +++ b/MainController.m @@ -7,8 +7,6 @@ - (ITMTRemote *)loadRemote; - (void)setupHotKeys; - (void)timerUpdate; -- (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers - onItem:(NSMenuItem *)item; @end @implementation MainController @@ -112,159 +110,6 @@ [pool release]; } - -/*************************************************************************/ -#pragma mark - -#pragma mark MENU BUILDING METHODS -/*************************************************************************/ - -- (NSMenu *)menu -{ - NSMenu *theMenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - [theMenu addItem:[self playlistMenuItem]]; - [theMenu addItem:[self upcomingSongsMenuItem]]; - [theMenu addItem:[self ratingMenuItem]]; - - return theMenu; -} - -- (NSMenu *)menuForNoPlayer -{ - return nil; -} - -- (NSMenuItem *)playlistMenuItem -{ - NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:@"Playlists" - action:nil - keyEquivalent:@""] autorelease]; - NSMenu *submenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - int currentPlaylist = [currentRemote currentPlaylistIndex]; - NSArray *playlists = [currentRemote playlists]; - NSEnumerator *playlistEnum = [playlists objectEnumerator]; - int playlistTag = 1; - id aPlaylist; - - [item setSubmenu:submenu]; - [submenu setAutoenablesItems:NO]; - - while ( (aPlaylist = [playlistEnum nextObject]) ) { - NSMenuItem *playlistItem = [[[NSMenuItem alloc] initWithTitle:aPlaylist - action:@selector(selectPlaylist:) - keyEquivalent:@""] autorelease]; - [playlistItem setTag:playlistTag]; - [playlistItem setTarget:self]; - playlistTag++; - [submenu addItem:playlistItem]; - } - - if ( (! [self radioIsPlaying]) && currentPlaylist) { - [[submenu itemAtIndex:(currentPlaylist - 1)] setState:NSOnState]; - } - - return item; -} - -- (NSMenuItem *)upcomingSongsMenuItem -{ - NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:@"Upcoming Songs" - action:nil - keyEquivalent:@""] autorelease]; - NSMenu *submenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - int curIndex = [currentRemote currentPlaylistIndex]; - int numSongs = [currentRemote numberOfSongsInPlaylistAtIndex:curIndex]; - int numSongsInAdvance = [df integerForKey:@"SongsInAdvance"]; - - [item setSubmenu:submenu]; - - if ( [self radioIsPlaying] ) { - [submenu addItemWithTitle:@"No Upcoming Songs..." action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:@"Playing Radio Stream" action:nil keyEquivalent:@""]; - } else { - if ( ! (numSongs > 0) ) { - [submenu addItemWithTitle:@"No Songs in Playlist" action:nil keyEquivalent:@""]; - } else { - int curTrack = [currentRemote currentSongIndex]; - int i; - - for (i = curTrack + 1; ( (i <= curTrack + numSongsInAdvance) && (i <= numSongs) ); i++) { - - NSString *curSong = [currentRemote songTitleAtIndex:i]; - NSMenuItem *songItem = [[[NSMenuItem alloc] initWithTitle:curSong - action:@selector(selectSong:) - keyEquivalent:@""] autorelease]; - [songItem setRepresentedObject:[NSNumber numberWithInt:i]]; - [submenu addItem:songItem]; - } - } - } - - return item; -} - -- (NSMenuItem *)ratingMenuItem -{ - NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:@"Rating" - action:nil - keyEquivalent:@""] autorelease]; - NSMenu *submenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - [item setSubmenu:submenu]; - - [submenu addItemWithTitle:[NSString stringWithUTF8String:"☆☆☆☆☆"] action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:[NSString stringWithUTF8String:"★☆☆☆☆"] action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:[NSString stringWithUTF8String:"★★☆☆☆"] action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:[NSString stringWithUTF8String:"★★★☆☆"] action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★☆"] action:nil keyEquivalent:@""]; - [submenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★★"] action:nil keyEquivalent:@""]; - - if ( ! ( [self radioIsPlaying] || [self songIsPlaying] ) ) { - - NSEnumerator *itemEnum; - id anItem; - int itemTag = 0; - SEL itemSelector = @selector(selectSongRating:); - - itemEnum = [[submenu itemArray] objectEnumerator]; - while ( (anItem = [itemEnum nextObject]) ) { - [anItem setAction:itemSelector]; - [anItem setTag:itemTag]; - itemTag += 20; - } - } - - return item; -} - -- (NSMenuItem *)eqMenuItem -{ - NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:@"Equalizer" - action:nil - keyEquivalent:@""] autorelease]; - NSMenu *submenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - NSArray *eqPresets = [currentRemote eqPresets]; - NSEnumerator *eqEnum = [eqPresets objectEnumerator]; - int eqTag = 0; - id anEq; - - [item setSubmenu:submenu]; - - while ( ( anEq = [eqEnum nextObject]) ) { - NSMenuItem *eqItem = [[[NSMenuItem alloc] initWithTitle:anEq - action:@selector(selectEQPreset:) - keyEquivalent:@""] autorelease]; - [eqItem setTag:eqTag]; - eqTag++; - [submenu addItem:eqItem]; - } - - [[submenu itemAtIndex:([currentRemote currentEQPresetIndex] - 1)] setState:NSOnState]; -} - - (BOOL)songIsPlaying { return ( ! ([[currentRemote currentSongUniqueIdentifier] isEqualToString:@"0-0"]) ); @@ -291,253 +136,12 @@ _latestSongIdentifier = [newIdentifier copy]; } -/* -//Recreate the status item menu -- (void)rebuildMenu -{ - NSArray *myMenu = [df arrayForKey:@"menu"]; - int playlist = [currentRemote currentPlaylistIndex]; - int i; - - if ([currentRemote playerRunningState] == ITMTRemotePlayerNotRunning) { - return; - } - - trackInfoIndex = -1; - lastPlaylistIndex = -1; - - [menu release]; - menu = [[NSMenu alloc] initWithTitle:@""]; - - playPauseItem = nil; - - upcomingSongsItem = nil; - [upcomingSongsMenu release]; - upcomingSongsMenu = nil; - - if (ratingItem) { - [ratingItem setSubmenu:nil]; - } - - playlistItem = nil; - [playlistMenu release]; - playlistMenu = nil; - - eqItem = nil; - [eqMenu release]; - eqMenu = nil; - - //Build the custom menu - for (i = 0; i < [myMenu count]; i++) { - NSString *item = [myMenu objectAtIndex:i]; - if ([item isEqualToString:@"Play/Pause"]) { - KeyCombo *tempCombo = [df keyComboForKey:@"PlayPause"]; - playPauseItem = [menu addItemWithTitle:@"Play" - action:@selector(playPause:) - keyEquivalent:@""]; - - if (tempCombo) { - [self setKeyEquivalentForCode:[tempCombo keyCode] - andModifiers:[tempCombo modifiers] onItem:playPauseItem]; - [tempCombo release]; - } - } else if ([item isEqualToString:@"Next Track"]) { - KeyCombo *tempCombo = [df keyComboForKey:@"NextTrack"]; - NSMenuItem *nextTrack = [menu addItemWithTitle:@"Next Track" - action:@selector(nextSong:) - keyEquivalent:@""]; - - if (tempCombo) { - [self setKeyEquivalentForCode:[tempCombo keyCode] - andModifiers:[tempCombo modifiers] onItem:nextTrack]; - [tempCombo release]; - } - } else if ([item isEqualToString:@"Previous Track"]) { - KeyCombo *tempCombo = [df keyComboForKey:@"PrevTrack"]; - NSMenuItem *prevTrack = [menu addItemWithTitle:@"Previous Track" - action:@selector(prevSong:) - keyEquivalent:@""]; - - if (tempCombo) { - [self setKeyEquivalentForCode:[tempCombo keyCode] - andModifiers:[tempCombo modifiers] onItem:prevTrack]; - [tempCombo release]; - } - } else if ([item isEqualToString:@"Fast Forward"]) { - [menu addItemWithTitle:@"Fast Forward" - action:@selector(fastForward:) - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Rewind"]) { - [menu addItemWithTitle:@"Rewind" - action:@selector(rewind:) - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Show Player"]) { - [menu addItemWithTitle:[NSString stringWithFormat:@"Show %@", [currentRemote playerSimpleName]] - action:@selector(showPlayer:) - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Upcoming Songs"]) { - upcomingSongsItem = [menu addItemWithTitle:@"Upcoming Songs" - action:nil - keyEquivalent:@""]; - upcomingSongsMenu = [[NSMenu alloc] initWithTitle:@""]; - [upcomingSongsItem setSubmenu:upcomingSongsMenu]; - [upcomingSongsItem setEnabled:NO]; - } else if ([item isEqualToString:@"Playlists"]) { - playlistItem = [menu addItemWithTitle:@"Playlists" - action:nil - keyEquivalent:@""]; - } else if ([item isEqualToString:@"EQ Presets"]) { - eqItem = [menu addItemWithTitle:@"EQ Presets" - action:nil - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Preferences…"]) { - [menu addItemWithTitle:@"Preferences…" - action:@selector(showPreferences:) - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Quit"]) { - [menu addItemWithTitle:@"Quit" - action:@selector(quitMenuTunes:) - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Current Track Info"]) { - trackInfoIndex = [menu numberOfItems]; - [menu addItemWithTitle:@"No Song" - action:nil - keyEquivalent:@""]; - } else if ([item isEqualToString:@"Song Rating"]) { - ratingItem = [menu addItemWithTitle:@"Song Rating" - action:nil - keyEquivalent:@""]; - [ratingItem setSubmenu:ratingMenu]; - } else if ([item isEqualToString:@""]) { - [menu addItem:[NSMenuItem separatorItem]]; - } - } - - if (playlistItem) { - [self rebuildPlaylistMenu]; - } - - if (eqItem) { - [self rebuildEQPresetsMenu]; - } - - isPlayingRadio = ([currentRemote classOfPlaylistAtIndex:playlist] == ITMTRemotePlayerRadioPlaylist); - - if (upcomingSongsItem) { - [self rebuildUpcomingSongsMenu]; - } - - if (ratingItem) { - if (isPlayingRadio || !playlist) { - [ratingItem setEnabled:NO]; - } else { - int currentSongRating = ([currentRemote currentSongRating] * 5); - [[ratingMenu itemAtIndex:lastSongRating] setState:NSOffState]; - lastSongRating = currentSongRating; - [[ratingMenu itemAtIndex:lastSongRating] setState:NSOnState]; - [ratingItem setEnabled:YES]; - } - } - - //Set the new unique song identifier - lastSongIdentifier = [[currentRemote currentSongUniqueIdentifier] retain]; - - //If we're in a playlist or radio mode - if ( ![lastSongIdentifier isEqualToString:@"0-0"] && (trackInfoIndex > -1) ) { - NSString *title; - - if ( (i = [menu indexOfItemWithTitle:@"No Song"]) ) { - if ( (i > -1) ) { - [menu removeItemAtIndex:i]; - [menu insertItemWithTitle:@"Now Playing" action:NULL keyEquivalent:@"" atIndex:i]; - } - } - - title = [currentRemote currentSongTitle]; - - if (!isPlayingRadio) { - if ([df boolForKey:@"showTime"]) { - NSString *length = [currentRemote currentSongLength]; - char character = [length characterAtIndex:0]; - if ( (character > '0') && (character < '9') ) { - [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", [currentRemote currentSongLength]] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - - if ([df boolForKey:@"showRating"]) { - if (title) { //Check to see if there's a song playing - [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", [[ratingMenu itemAtIndex:[currentRemote currentSongRating] * 5] title]] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - - if ([df boolForKey:@"showArtist"]) { - NSString *artist = [currentRemote currentSongArtist]; - if ([artist length] > 0) { - [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", artist] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - - if ([df boolForKey:@"showNumber"]) { - int track = [currentRemote currentSongTrack]; - int total = [currentRemote currentAlbumTrackCount]; - if (total > 0) { - [menu insertItemWithTitle:[NSString stringWithFormat:@" Track %i of %i", track, total] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - - if ([df boolForKey:@"showAlbum"]) { - NSString *album = [currentRemote currentSongAlbum]; - if ([album length] > 0) { - [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", album] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - } - - if ([title length] > 0) { - [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", title] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; - } - } - - [statusItem setMenu:menu]; - - [self clearHotKeys]; - [self setupHotKeys]; -} - - -//Build a menu with the list of all available EQ presets -- (void)rebuildEQPresetsMenu -{ - NSArray *eqPresets = [currentRemote eqPresets]; - int i; - - [eqMenu autorelease]; - eqMenu = [[NSMenu alloc] initWithTitle:@""]; - - for (i = 0; i < [eqPresets count]; i++) { - NSString *name; - NSMenuItem *tempItem; - if ( ( name = [eqPresets objectAtIndex:i] ) ) { - tempItem = [[NSMenuItem alloc] initWithTitle:name action:@selector(selectEQPreset:) keyEquivalent:@""]; - [tempItem setTag:i]; - [eqMenu addItem:tempItem]; - [tempItem autorelease]; - } - } - - [eqItem setSubmenu:eqMenu]; - [eqItem setEnabled:YES]; - [[eqMenu itemAtIndex:([currentRemote currentEQPresetIndex] - 1)] setState:NSOnState]; -} - -*/ - - (void)timerUpdate { if ( ( [self songChanged] ) || ( ([self radioIsPlaying]) && (latestPlaylistClass != ITMTRemotePlayerRadioPlaylist) ) || ( (! [self radioIsPlaying]) && (latestPlaylistClass == ITMTRemotePlayerRadioPlaylist) ) ) { - [statusItem setMenu:[self menu]]; + //[statusItem setMenu:[self menu]]; [self setLatestSongIdentifier:[currentRemote currentSongUniqueIdentifier]]; latestPlaylistClass = [currentRemote currentPlaylistClass]; @@ -837,187 +441,6 @@ } } -- (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers - onItem:(NSMenuItem *)item -{ - unichar charcode = 'a'; - int i; - long cocoaModifiers = 0; - static long carbonToCocoa[6][2] = - { - { cmdKey, NSCommandKeyMask }, - { optionKey, NSAlternateKeyMask }, - { controlKey, NSControlKeyMask }, - { shiftKey, NSShiftKeyMask }, - }; - - for (i = 0; i < 6; i++) { - if (modifiers & carbonToCocoa[i][0]) { - cocoaModifiers += carbonToCocoa[i][1]; - } - } - [item setKeyEquivalentModifierMask:cocoaModifiers]; - - //Missing key combos for some keys. Must find them later. - switch (code) - { - case 36: - charcode = '\r'; - break; - - case 48: - charcode = '\t'; - break; - - //Space -- ARGH! - case 49: - { - // Haven't tested this, though it should work. - unichar buffer; - [[NSString stringWithString:@"Space"] getCharacters:&buffer]; - charcode = buffer; - /*MenuRef menuRef = _NSGetCarbonMenu([item menu]); - NSLog(@"%@", menuRef); - SetMenuItemCommandKey(menuRef, 0, NO, 49); - SetMenuItemModifiers(menuRef, 0, kMenuNoCommandModifier); - SetMenuItemKeyGlyph(menuRef, 0, kMenuBlankGlyph); - charcode = 'b';*/ - - } - break; - - case 51: - charcode = NSDeleteFunctionKey; - break; - - case 53: - charcode = '\e'; - break; - - case 71: - charcode = '\e'; - break; - - case 76: - charcode = '\r'; - break; - - case 96: - charcode = NSF5FunctionKey; - break; - - case 97: - charcode = NSF6FunctionKey; - break; - - case 98: - charcode = NSF7FunctionKey; - break; - - case 99: - charcode = NSF3FunctionKey; - break; - - case 100: - charcode = NSF8FunctionKey; - break; - - case 101: - charcode = NSF9FunctionKey; - break; - - case 103: - charcode = NSF11FunctionKey; - break; - - case 105: - charcode = NSF3FunctionKey; - break; - - case 107: - charcode = NSF14FunctionKey; - break; - - case 109: - charcode = NSF10FunctionKey; - break; - - case 111: - charcode = NSF12FunctionKey; - break; - - case 113: - charcode = NSF13FunctionKey; - break; - - case 114: - charcode = NSInsertFunctionKey; - break; - - case 115: - charcode = NSHomeFunctionKey; - break; - - case 116: - charcode = NSPageUpFunctionKey; - break; - - case 117: - charcode = NSDeleteFunctionKey; - break; - - case 118: - charcode = NSF4FunctionKey; - break; - - case 119: - charcode = NSEndFunctionKey; - break; - - case 120: - charcode = NSF2FunctionKey; - break; - - case 121: - charcode = NSPageDownFunctionKey; - break; - - case 122: - charcode = NSF1FunctionKey; - break; - - case 123: - charcode = NSLeftArrowFunctionKey; - break; - - case 124: - charcode = NSRightArrowFunctionKey; - break; - - case 125: - charcode = NSDownArrowFunctionKey; - break; - - case 126: - charcode = NSUpArrowFunctionKey; - break; - } - - if (charcode == 'a') { - unsigned long state; - long keyTrans; - char charCode; - Ptr kchr; - state = 0; - kchr = (Ptr) GetScriptVariable(smCurrentScript, smKCHRCache); - keyTrans = KeyTranslate(kchr, code, &state); - charCode = keyTrans; - [item setKeyEquivalent:[NSString stringWithCString:&charCode length:1]]; - } else if (charcode != 'b') { - [item setKeyEquivalent:[NSString stringWithCharacters:&charcode length:1]]; - } -} - /*************************************************************************/ #pragma mark - #pragma mark WORKSPACE NOTIFICATION HANDLERS diff --git a/MenuController.m b/MenuController.m index 0ac43d1..2212b16 100755 --- a/MenuController.m +++ b/MenuController.m @@ -102,4 +102,185 @@ } } +- (void)setKeyEquivalentForCode:(short)code andModifiers:(long)modifiers + onItem:(NSMenuItem *)item +{ + unichar charcode = 'a'; + int i; + long cocoaModifiers = 0; + static long carbonToCocoa[6][2] = + { + { cmdKey, NSCommandKeyMask }, + { optionKey, NSAlternateKeyMask }, + { controlKey, NSControlKeyMask }, + { shiftKey, NSShiftKeyMask }, + }; + + for (i = 0; i < 6; i++) { + if (modifiers & carbonToCocoa[i][0]) { + cocoaModifiers += carbonToCocoa[i][1]; + } + } + [item setKeyEquivalentModifierMask:cocoaModifiers]; + + //Missing key combos for some keys. Must find them later. + switch (code) + { + case 36: + charcode = '\r'; + break; + + case 48: + charcode = '\t'; + break; + + //Space -- ARGH! + case 49: + { + // Haven't tested this, though it should work. + unichar buffer; + [[NSString stringWithString:@"Space"] getCharacters:&buffer]; + charcode = buffer; + /*MenuRef menuRef = _NSGetCarbonMenu([item menu]); + NSLog(@"%@", menuRef); + SetMenuItemCommandKey(menuRef, 0, NO, 49); + SetMenuItemModifiers(menuRef, 0, kMenuNoCommandModifier); + SetMenuItemKeyGlyph(menuRef, 0, kMenuBlankGlyph); + charcode = 'b';*/ + + } + break; + + case 51: + charcode = NSDeleteFunctionKey; + break; + + case 53: + charcode = '\e'; + break; + + case 71: + charcode = '\e'; + break; + + case 76: + charcode = '\r'; + break; + + case 96: + charcode = NSF5FunctionKey; + break; + + case 97: + charcode = NSF6FunctionKey; + break; + + case 98: + charcode = NSF7FunctionKey; + break; + + case 99: + charcode = NSF3FunctionKey; + break; + + case 100: + charcode = NSF8FunctionKey; + break; + + case 101: + charcode = NSF9FunctionKey; + break; + + case 103: + charcode = NSF11FunctionKey; + break; + + case 105: + charcode = NSF3FunctionKey; + break; + + case 107: + charcode = NSF14FunctionKey; + break; + + case 109: + charcode = NSF10FunctionKey; + break; + + case 111: + charcode = NSF12FunctionKey; + break; + + case 113: + charcode = NSF13FunctionKey; + break; + + case 114: + charcode = NSInsertFunctionKey; + break; + + case 115: + charcode = NSHomeFunctionKey; + break; + + case 116: + charcode = NSPageUpFunctionKey; + break; + + case 117: + charcode = NSDeleteFunctionKey; + break; + + case 118: + charcode = NSF4FunctionKey; + break; + + case 119: + charcode = NSEndFunctionKey; + break; + + case 120: + charcode = NSF2FunctionKey; + break; + + case 121: + charcode = NSPageDownFunctionKey; + break; + + case 122: + charcode = NSF1FunctionKey; + break; + + case 123: + charcode = NSLeftArrowFunctionKey; + break; + + case 124: + charcode = NSRightArrowFunctionKey; + break; + + case 125: + charcode = NSDownArrowFunctionKey; + break; + + case 126: + charcode = NSUpArrowFunctionKey; + break; + } + + if (charcode == 'a') { + unsigned long state; + long keyTrans; + char charCode; + Ptr kchr; + state = 0; + kchr = (Ptr) GetScriptVariable(smCurrentScript, smKCHRCache); + keyTrans = KeyTranslate(kchr, code, &state); + charCode = keyTrans; + [item setKeyEquivalent:[NSString stringWithCString:&charCode length:1]]; + } else if (charcode != 'b') { + [item setKeyEquivalent:[NSString stringWithCharacters:&charcode length:1]]; + } +} + @end -- 2.20.1