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

Side by Side Diff: chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm

Issue 22867009: Swap main menu with app-specific menu when app window focused. (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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
tapted 2013/08/15 04:39:23 nit: no (c)
jackhou1 2013/08/16 02:50:41 Done.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #import "chrome/browser/ui/cocoa/apps/app_menu_controller_mac.h"
6
7 #include "apps/app_shim/extension_app_shim_handler_mac.h"
8 #include "apps/shell_window.h"
9 #include "apps/shell_window_registry.h"
10 #include "base/strings/sys_string_conversions.h"
11 #include "chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h"
tapted 2013/08/15 04:39:23 nit: import
jackhou1 2013/08/16 02:50:41 Done.
12 #include "chrome/common/extensions/extension.h"
13 #include "ui/base/l10n/l10n_util.h"
14 #include "ui/base/l10n/l10n_util_mac.h"
15
16 @interface AppMenuController (Private)
tapted 2013/08/15 04:39:23 I think the new trend is just to use an unnamed ca
jackhou1 2013/08/16 02:50:41 Done.
17 - (void)windowMainStatusChanged:(NSNotification*)notification;
18 - (void)addMenuItems:(const extensions::Extension*)app;
19 - (void)removeMenuItems:(NSString*)appId;
20 @end
21
22 @implementation AppMenuController
23
24 - (id)init {
25 self = [super init];
26 if (self == nil)
tapted 2013/08/15 04:39:23 Obj-C initializers all follow the pattern - (id)i
jackhou1 2013/08/16 02:50:41 Done.
27 return nil;
28
29 appMenuItems_.reset([[NSMutableArray alloc] initWithCapacity:0]);
30
31 [[NSNotificationCenter defaultCenter]
32 addObserver:self
33 selector:@selector(windowMainStatusChanged:)
34 name:NSWindowDidBecomeMainNotification
35 object:nil];
36
37 [[NSNotificationCenter defaultCenter]
38 addObserver:self
39 selector:@selector(windowMainStatusChanged:)
40 name:NSWindowDidResignMainNotification
41 object:nil];
42
43 return self;
44 }
45
46 // If the window is an app window, add or remove menu items.
tapted 2013/08/15 04:39:23 nit: I think these function comments should be at
jackhou1 2013/08/16 02:50:41 Done.
47 - (void)windowMainStatusChanged:(NSNotification*)notification {
48 id window = [notification object];
49 id windowController = [window windowController];
50 if (![windowController isKindOfClass:[NativeAppWindowController class]])
51 return;
52
53 apps::ShellWindow* shellWindow =
54 apps::ShellWindowRegistry::GetShellWindowForNativeWindowAnyProfile(
tapted 2013/08/15 04:39:23 is there any danger this can return NULL for a win
jackhou1 2013/08/16 02:50:41 I don't think so. ShellWindow::Close closes the na
jackhou1 2013/08/19 03:47:57 Changed to use isEqualToString
55 window);
56 if (!shellWindow)
57 return;
58
59 if ([notification name] == NSWindowDidBecomeMainNotification) {
tapted 2013/08/15 04:39:23 need to use isEqualToString: here - same below.
jackhou1 2013/08/16 02:50:41 I copied this from app_controller_mac.mm, e.g. lin
60 [self addMenuItems:shellWindow->extension()];
61 } else if ([notification name] == NSWindowDidResignMainNotification) {
62 [self removeMenuItems:base::SysUTF8ToNSString(shellWindow->extension_id())];
63 }
tapted 2013/08/15 04:39:23 else { NOTREACHED() } ? And... don't need curlies
jackhou1 2013/08/16 02:50:41 Done.
64 }
65
66 // Add menu items for an app and hide Chrome menu items.
67 - (void)addMenuItems:(const extensions::Extension*)app {
68 NSString* appId = base::SysUTF8ToNSString(app->id());
69 NSString* title = base::SysUTF8ToNSString(app->name());
tapted 2013/08/15 04:39:23 I don't think you need this temporary - you can mo
jackhou1 2013/08/16 02:50:41 There will be other menu items added later that us
70
71 NSMenu* mainMenu = [NSApp mainMenu];
tapted 2013/08/15 04:39:23 nit: move closer to first use
jackhou1 2013/08/16 02:50:41 Done.
72
73 if (appId_) {
tapted 2013/08/15 04:39:23 You can lean on Obj-C's "yes you really can call a
jackhou1 2013/08/16 02:50:41 Done.
74 if ([appId_ isEqualToString:appId])
75 return;
76 else
77 [self removeMenuItems:appId_];
78 }
79 [appId retain];
80 appId_.reset(appId);
81
82 for (NSMenuItem* item in [mainMenu itemArray])
83 [item setHidden:YES];
84
85 NSMenuItem* item = [mainMenu addItemWithTitle:appId
86 action:nil
87 keyEquivalent:@""];
88 base::scoped_nsobject<NSMenu> appMenu([[NSMenu alloc] initWithTitle:title]);
89 [item setSubmenu:appMenu];
90 [appMenuItems_ addObject:item];
91 }
92
93 // If the window belongs to the currently focused app, remove the menu items and
94 // unhide Chrome menu items.
95 - (void)removeMenuItems:(NSString*)appId {
96 if (![appId_ isEqualToString:appId])
97 return;
98
99 NSMenu* mainMenu = [NSApp mainMenu];
100
101 appId_.reset();
tapted 2013/08/15 04:39:23 nit: move this up? (i.e. swap with line 99). It's
jackhou1 2013/08/16 02:50:41 Done.
102 for (NSMenuItem* item in appMenuItems_.get())
103 [mainMenu removeItem:item];
104 [appMenuItems_ removeAllObjects];
105
106 // Restore the Chrome main menu bar.
107 for (NSMenuItem* item in [mainMenu itemArray])
108 [item setHidden:NO];
109 }
110
111 @end // @implementation AppMenuController
tapted 2013/08/15 04:39:23 nit: I think current trend is to not have comments
jackhou1 2013/08/16 02:50:41 Done.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698