Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8224)

Unified Diff: chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm

Issue 23005021: Replicate standard menus for apps. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/cocoa/apps/app_menu_controller_mac.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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])
« no previous file with comments | « chrome/browser/ui/cocoa/apps/app_menu_controller_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698