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

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

Issue 23005021: Replicate standard menus for apps. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync and rebase 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
Index: chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
diff --git a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
index 6cd9a1dbcceec8a81e6bedc6d3930e0be9eba355..bcc272e0029b835baffa84ae0a3c02a9dd97575e 100644
--- a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
+++ b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
@@ -9,12 +9,50 @@
#include "apps/shell_window_registry.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
+#include "chrome/app/chrome_command_ids.h"
#import "chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h"
#include "chrome/common/extensions/extension.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/l10n/l10n_util_mac.h"
+namespace {
+
+// Gets an item from the main menu given the tag of the top level item
+// |menu_tag| and the tag of the item |item_tag|.
+NSMenuItem* GetItemByTag(NSInteger menu_tag, NSInteger item_tag) {
+ return [[[[NSApp mainMenu] itemWithTag:menu_tag] submenu]
+ itemWithTag:item_tag];
+}
+
+// Finds a top level menu item using |menu_tag| and creates a new NSMenuItem
+// with the same title.
+NSMenuItem* NewTopLevelItemFrom(NSInteger menu_tag) {
+ NSMenuItem* original = [[NSApp mainMenu] itemWithTag:menu_tag];
+ base::scoped_nsobject<NSMenuItem> item([[NSMenuItem alloc]
+ initWithTitle:[original title]
+ action:nil
+ keyEquivalent:@""]);
+ DCHECK([original hasSubmenu]);
+ base::scoped_nsobject<NSMenu> sub_menu([[NSMenu alloc]
+ initWithTitle:[[original submenu] title]]);
+ [item setSubmenu:sub_menu];
+ return item.autorelease();
+}
+
+// Finds an item using |menu_tag| and |item_tag| and adds a duplicate of it to
+// the submenu of |top_level_item|.
+void AddDuplicateItem(NSMenuItem* top_level_item,
+ NSInteger menu_tag,
+ NSInteger item_tag) {
+ base::scoped_nsobject<NSMenuItem> item(
+ [GetItemByTag(menu_tag, item_tag) copy]);
+ DCHECK(item);
+ [[top_level_item submenu] addItem:item];
+}
+
+} // namespace
+
@interface AppShimMenuController ()
// Construct the NSMenuItems for apps.
- (void)buildAppMenuItems;
@@ -48,15 +86,10 @@
- (void)buildAppMenuItems {
// Find the "Quit Chrome" menu item.
- NSMenu* chromeMenu = [[[NSApp mainMenu] itemAtIndex:0] submenu];
- for (NSMenuItem* item in [chromeMenu itemArray]) {
- if ([item action] == @selector(terminate:)) {
- chromeMenuQuitItem_.reset([item retain]);
- break;
- }
- }
+ chromeMenuQuitItem_.reset([GetItemByTag(IDC_CHROME_MENU, IDC_EXIT) retain]);
DCHECK(chromeMenuQuitItem_);
+ // The app's menu.
appMenuItem_.reset([[NSMenuItem alloc] initWithTitle:@""
action:nil
keyEquivalent:@""]);
@@ -70,6 +103,28 @@
[chromeMenuQuitItem_ keyEquivalentModifierMask]];
[appMenuQuitItem setTarget:self];
[appMenuItem_ setSubmenu:appMenu];
+
+ // File menu.
+ fileMenuItem_.reset([NewTopLevelItemFrom(IDC_FILE_MENU) retain]);
+ AddDuplicateItem(fileMenuItem_, IDC_FILE_MENU, IDC_CLOSE_WINDOW);
+
+ // Edit menu.
+ editMenuItem_.reset([NewTopLevelItemFrom(IDC_EDIT_MENU) retain]);
+ AddDuplicateItem(editMenuItem_, IDC_EDIT_MENU, IDC_CONTENT_CONTEXT_UNDO);
+ AddDuplicateItem(editMenuItem_, IDC_EDIT_MENU, IDC_CONTENT_CONTEXT_REDO);
+ [[editMenuItem_ submenu] addItem:[NSMenuItem separatorItem]];
+ AddDuplicateItem(editMenuItem_, IDC_EDIT_MENU, IDC_CONTENT_CONTEXT_CUT);
+ AddDuplicateItem(editMenuItem_, IDC_EDIT_MENU, IDC_CONTENT_CONTEXT_COPY);
+ AddDuplicateItem(editMenuItem_, IDC_EDIT_MENU, IDC_CONTENT_CONTEXT_PASTE);
+ AddDuplicateItem(editMenuItem_, IDC_EDIT_MENU, IDC_CONTENT_CONTEXT_DELETE);
+ AddDuplicateItem(editMenuItem_, IDC_EDIT_MENU, IDC_CONTENT_CONTEXT_SELECTALL);
+
+ // Window menu.
+ windowMenuItem_.reset([NewTopLevelItemFrom(IDC_WINDOW_MENU) retain]);
+ AddDuplicateItem(windowMenuItem_, IDC_WINDOW_MENU, IDC_MINIMIZE_WINDOW);
+ AddDuplicateItem(windowMenuItem_, IDC_WINDOW_MENU, IDC_MAXIMIZE_WINDOW);
+ [[windowMenuItem_ submenu] addItem:[NSMenuItem separatorItem]];
+ AddDuplicateItem(windowMenuItem_, IDC_WINDOW_MENU, IDC_ALL_WINDOWS_FRONT);
}
- (void)registerEventHandlers {
@@ -144,7 +199,11 @@
[appMenuItem_ setTitle:appId];
[[appMenuItem_ submenu] setTitle:title];
+
[mainMenu addItem:appMenuItem_];
+ [mainMenu addItem:fileMenuItem_];
+ [mainMenu addItem:editMenuItem_];
+ [mainMenu addItem:windowMenuItem_];
}
- (void)removeMenuItems:(NSString*)appId {
@@ -155,6 +214,9 @@
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])

Powered by Google App Engine
This is Rietveld 408576698