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]) |