Chromium Code Reviews| Index: chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm |
| diff --git a/chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm b/chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm |
| index 440a047b19b0d2c301d9eab131bdcec033379077..f84b2889ae515e2b6f152dc79e21e5a47d0edd55 100644 |
| --- a/chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm |
| +++ b/chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm |
| @@ -11,10 +11,53 @@ |
| #include "base/strings/utf_string_conversions.h" |
| #import "chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h" |
| #include "chrome/common/extensions/extension.h" |
| +#include "grit/chromium_strings.h" |
| #include "grit/generated_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/l10n/l10n_util_mac.h" |
| +namespace { |
| + |
| +// Iterates through top level items in the main menu and returns the first one |
| +// with the given title. |
| +NSMenuItem* FindItemByTitle(const string16& title_utf16) { |
|
tapted
2013/08/22 05:16:15
nit: base::string16
jackhou1
2013/08/29 04:25:21
Done.
|
| + NSString* title = base::SysUTF16ToNSString(title_utf16); |
| + for (NSMenuItem* menu in [[NSApp mainMenu] itemArray]) { |
| + NSMenuItem* item = [[menu submenu] itemWithTitle:title]; |
| + if (item) |
| + return item; |
| + } |
| + return nil; |
| +} |
| + |
| +// Creates a new NSMenuItem with the same title, action, and key equivalent as |
| +// |original|. Also creates a submenu |original| had a submenu. |
| +// The returned object is not released. |
| +NSMenuItem* DuplicateItem(NSMenuItem* original) { |
| + NSMenuItem* item = [[NSMenuItem alloc] |
|
tapted
2013/08/22 05:16:15
should assign to a scoped_nsobject when using allo
jackhou1
2013/08/29 04:25:21
Done.
|
| + initWithTitle:[original title] |
| + action:[original action] |
| + keyEquivalent:[original keyEquivalent]]; |
| + if ([original hasSubmenu]) { |
| + base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] |
| + initWithTitle:[[original submenu] title]]); |
| + [item setSubmenu:menu]; |
| + } |
| + return item; |
| +} |
| + |
| +// Finds an item using |message_id| and adds a duplicate of it to the submenu of |
| +// |top_level_item|. |
| +NSMenuItem* AddDuplicateItem(NSMenuItem* top_level_item, int message_id) { |
| + NSMenu* menu = [top_level_item submenu]; |
| + NSMenuItem* original = FindItemByTitle(l10n_util::GetStringUTF16(message_id)); |
| + base::scoped_nsobject<NSMenuItem> item(DuplicateItem(original)); |
|
tapted
2013/08/22 05:16:15
NSMenuItem implements the NSCopying protocol, so i
jackhou1
2013/08/29 04:25:21
Done.
|
| + [menu addItem:item]; |
| + return item; |
| +} |
| + |
| +} // namespace |
| + |
| @interface AppMenuController () |
| // Construct the NSMenuItems for apps. |
| - (void)buildAppMenuItems; |
| @@ -46,9 +89,11 @@ |
| } |
| - (void)buildAppMenuItems { |
| - quitChromeItem_ = [[[[[NSApp mainMenu] itemAtIndex:0] submenu] itemArray] |
| - lastObject]; |
| + quitChromeItem_ = FindItemByTitle(l10n_util::GetStringFUTF16( |
| + IDS_EXIT_MAC, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME))); |
| + DCHECK(quitChromeItem_); |
| + // The app's menu. |
| appMenuItem_.reset([[NSMenuItem alloc] initWithTitle:@"" |
| action:nil |
| keyEquivalent:@""]); |
| @@ -60,6 +105,31 @@ |
| [appQuitItem setTarget:self]; |
| [appQuitItem setEnabled:YES]; |
| [appMenuItem_ setSubmenu:appMenu]; |
| + |
| + // File menu. |
| + fileMenuItem_.reset(DuplicateItem([[NSApp mainMenu] |
| + itemWithTitle:l10n_util::GetNSString(IDS_FILE_MENU_MAC)])); |
| + AddDuplicateItem(fileMenuItem_, IDS_CLOSE_WINDOW_MAC); |
| + |
| + // Edit menu. |
| + editMenuItem_.reset(DuplicateItem([[NSApp mainMenu] |
|
tapted
2013/08/22 05:16:15
NSMenu supports NSCopying as well.. and I'm thinki
jackhou1
2013/08/29 04:25:21
I'd rather keep the items minimal until we decide
|
| + itemWithTitle:l10n_util::GetNSString(IDS_EDIT_MENU_MAC)])); |
| + AddDuplicateItem(editMenuItem_, IDS_EDIT_UNDO_MAC); |
| + AddDuplicateItem(editMenuItem_, IDS_EDIT_REDO_MAC); |
| + [[editMenuItem_ submenu] addItem:[NSMenuItem separatorItem]]; |
| + AddDuplicateItem(editMenuItem_, IDS_CUT_MAC); |
| + AddDuplicateItem(editMenuItem_, IDS_COPY_MAC); |
| + AddDuplicateItem(editMenuItem_, IDS_PASTE_MAC); |
| + AddDuplicateItem(editMenuItem_, IDS_EDIT_DELETE_MAC); |
| + AddDuplicateItem(editMenuItem_, IDS_EDIT_SELECT_ALL_MAC); |
| + |
| + // Window menu. |
| + windowMenuItem_.reset(DuplicateItem([[NSApp mainMenu] |
| + itemWithTitle:l10n_util::GetNSString(IDS_WINDOW_MENU_MAC)])); |
| + AddDuplicateItem(windowMenuItem_, IDS_MINIMIZE_WINDOW_MAC); |
| + AddDuplicateItem(windowMenuItem_, IDS_ZOOM_WINDOW_MAC); |
| + [[windowMenuItem_ submenu] addItem:[NSMenuItem separatorItem]]; |
| + AddDuplicateItem(windowMenuItem_, IDS_ALL_WINDOWS_FRONT_MAC); |
| } |
| - (void)registerEventHandlers { |
| @@ -134,17 +204,25 @@ |
| [appMenuItem_ setTitle:appId]; |
| [[appMenuItem_ submenu] setTitle:title]; |
| + |
| [mainMenu addItem:appMenuItem_]; |
| + [mainMenu addItem:fileMenuItem_]; |
| + [mainMenu addItem:editMenuItem_]; |
| + [mainMenu addItem:windowMenuItem_]; |
| } |
| - (void)removeMenuItems:(NSString*)appId { |
| if (![appId_ isEqualToString:appId]) |
| return; |
| + // Remove menu items for packaged app. |
| appId_.reset(); |
| NSMenu* mainMenu = [NSApp mainMenu]; |
| [mainMenu removeItem:appMenuItem_]; |
| + [mainMenu removeItem:fileMenuItem_]; |
| + [mainMenu removeItem:editMenuItem_]; |
| + [mainMenu removeItem:windowMenuItem_]; |
| // Restore the Chrome main menu bar. |
| for (NSMenuItem* item in [mainMenu itemArray]) |