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

Side by Side Diff: chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.mm

Issue 1419603004: [Extensions Toolbar] Fix action pop out bug and views animation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 2 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h" 5 #import "chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/mac/bundle_locations.h" 8 #include "base/mac/bundle_locations.h"
9 #include "base/scoped_observer.h"
9 #include "base/strings/string16.h" 10 #include "base/strings/string16.h"
10 #include "base/strings/sys_string_conversions.h" 11 #include "base/strings/sys_string_conversions.h"
11 #include "chrome/app/chrome_command_ids.h" 12 #include "chrome/app/chrome_command_ids.h"
12 #import "chrome/browser/app_controller_mac.h" 13 #import "chrome/browser/app_controller_mac.h"
13 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/ui/browser.h" 15 #include "chrome/browser/ui/browser.h"
15 #include "chrome/browser/ui/browser_window.h" 16 #include "chrome/browser/ui/browser_window.h"
16 #import "chrome/browser/ui/cocoa/accelerators_cocoa.h" 17 #import "chrome/browser/ui/cocoa/accelerators_cocoa.h"
17 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.h" 18 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.h"
18 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.h" 19 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.h"
19 #import "chrome/browser/ui/cocoa/browser_window_controller.h" 20 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
20 #import "chrome/browser/ui/cocoa/encoding_menu_controller_delegate_mac.h" 21 #import "chrome/browser/ui/cocoa/encoding_menu_controller_delegate_mac.h"
21 #import "chrome/browser/ui/cocoa/extensions/browser_actions_container_view.h" 22 #import "chrome/browser/ui/cocoa/extensions/browser_actions_container_view.h"
22 #import "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h" 23 #import "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h"
23 #import "chrome/browser/ui/cocoa/l10n_util.h" 24 #import "chrome/browser/ui/cocoa/l10n_util.h"
24 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" 25 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
25 #import "chrome/browser/ui/cocoa/wrench_menu/menu_tracked_root_view.h" 26 #import "chrome/browser/ui/cocoa/wrench_menu/menu_tracked_root_view.h"
26 #import "chrome/browser/ui/cocoa/wrench_menu/recent_tabs_menu_model_delegate.h" 27 #import "chrome/browser/ui/cocoa/wrench_menu/recent_tabs_menu_model_delegate.h"
27 #include "chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h" 28 #include "chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h"
29 #include "chrome/browser/ui/toolbar/toolbar_actions_bar.h"
30 #include "chrome/browser/ui/toolbar/toolbar_actions_bar_observer.h"
28 #include "chrome/browser/ui/toolbar/wrench_menu_model.h" 31 #include "chrome/browser/ui/toolbar/wrench_menu_model.h"
29 #include "chrome/grit/generated_resources.h" 32 #include "chrome/grit/generated_resources.h"
30 #include "components/ui/zoom/zoom_event_manager.h" 33 #include "components/ui/zoom/zoom_event_manager.h"
31 #include "content/public/browser/user_metrics.h" 34 #include "content/public/browser/user_metrics.h"
32 #include "ui/base/l10n/l10n_util.h" 35 #include "ui/base/l10n/l10n_util.h"
33 #include "ui/base/models/menu_model.h" 36 #include "ui/base/models/menu_model.h"
34 #include "ui/gfx/geometry/size.h" 37 #include "ui/gfx/geometry/size.h"
35 38
36 namespace { 39 namespace {
37 // Padding amounts on the left/right of a custom menu item (like the browser 40 // Padding amounts on the left/right of a custom menu item (like the browser
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 [[controller_ zoomDisplay] setTitle:SysUTF16ToNSString(level)]; 107 [[controller_ zoomDisplay] setTitle:SysUTF16ToNSString(level)];
105 } 108 }
106 109
107 scoped_ptr<content::HostZoomMap::Subscription> subscription_; 110 scoped_ptr<content::HostZoomMap::Subscription> subscription_;
108 111
109 WrenchMenuController* controller_; // Weak; owns this. 112 WrenchMenuController* controller_; // Weak; owns this.
110 113
111 DISALLOW_COPY_AND_ASSIGN(ZoomLevelObserver); 114 DISALLOW_COPY_AND_ASSIGN(ZoomLevelObserver);
112 }; 115 };
113 116
117 class ToolbarActionsBarObserverHelper : public ToolbarActionsBarObserver {
118 public:
119 ToolbarActionsBarObserverHelper(WrenchMenuController* controller,
120 ToolbarActionsBar* toolbar_actions_bar)
121 : controller_(controller),
122 scoped_observer_(this) {
123 scoped_observer_.Add(toolbar_actions_bar);
124 }
125 ~ToolbarActionsBarObserverHelper() override {}
126
127 private:
128 // ToolbarActionsBarObserver:
129 void OnToolbarActionsBarDestroyed() override {
130 scoped_observer_.RemoveAll();
131 }
132 void OnToolbarActionsBarDidStartResize() override {
133 [controller_ updateBrowserActionsSubmenu];
134 }
135
136 WrenchMenuController* controller_;
137 ScopedObserver<ToolbarActionsBar, ToolbarActionsBarObserver> scoped_observer_;
138
139 DISALLOW_COPY_AND_ASSIGN(ToolbarActionsBarObserverHelper);
140 };
141
114 } // namespace WrenchMenuControllerInternal 142 } // namespace WrenchMenuControllerInternal
115 143
116 @implementation WrenchMenuController 144 @implementation WrenchMenuController
117 145
118 - (id)initWithBrowser:(Browser*)browser { 146 - (id)initWithBrowser:(Browser*)browser {
119 if ((self = [super init])) { 147 if ((self = [super init])) {
120 browser_ = browser; 148 browser_ = browser;
121 observer_.reset(new WrenchMenuControllerInternal::ZoomLevelObserver(
122 self,
123 ui_zoom::ZoomEventManager::GetForBrowserContext(browser->profile())));
124 acceleratorDelegate_.reset( 149 acceleratorDelegate_.reset(
125 new WrenchMenuControllerInternal::AcceleratorDelegate()); 150 new WrenchMenuControllerInternal::AcceleratorDelegate());
126 [self createModel]; 151 [self createModel];
127 } 152 }
128 return self; 153 return self;
129 } 154 }
130 155
131 - (void)dealloc { 156 - (void)dealloc {
132 [self browserWillBeDestroyed]; 157 [self browserWillBeDestroyed];
133 [super dealloc]; 158 [super dealloc];
134 } 159 }
135 160
136 - (void)browserWillBeDestroyed { 161 - (void)browserWillBeDestroyed {
137 // This method indicates imminent destruction. Destroy owned objects that hold 162 // This method indicates imminent destruction. Destroy owned objects that hold
138 // a weak Browser*, or pass this call onto reference counted objects. 163 // a weak Browser*, or pass this call onto reference counted objects.
139 recentTabsMenuModelDelegate_.reset(); 164 recentTabsMenuModelDelegate_.reset();
140 [self setModel:nullptr]; 165 [self setModel:nullptr];
141 wrenchMenuModel_.reset(); 166 wrenchMenuModel_.reset();
142 buttonViewController_.reset(); 167 buttonViewController_.reset();
143 // ZoomLevelObserver holds a subscription to ZoomEventManager, which is 168
144 // user-data on the BrowserContext. The BrowserContext may be destroyed soon 169 // The observers should most likely already be destroyed (since they're reset
145 // if Chrome is quitting. In any case, |observer_| should not be needed at 170 // in -menuDidClose:), but sometimes shutdown can be funny, so make sure to
146 // this point. 171 // not leave any dangling observers.
147 observer_.reset(); 172 zoom_level_observer_.reset();
173 toolbar_actions_bar_observer_.reset();
148 174
149 [browserActionsController_ browserWillBeDestroyed]; 175 [browserActionsController_ browserWillBeDestroyed];
150 176
151 browser_ = nullptr; 177 browser_ = nullptr;
152 } 178 }
153 179
154 - (void)addItemToMenu:(NSMenu*)menu 180 - (void)addItemToMenu:(NSMenu*)menu
155 atIndex:(NSInteger)index 181 atIndex:(NSInteger)index
156 fromModel:(ui::MenuModel*)model { 182 fromModel:(ui::MenuModel*)model {
157 // Non-button item types should be built as normal items, with the exception 183 // Non-button item types should be built as normal items, with the exception
(...skipping 22 matching lines...) Expand all
180 // a main counterpart, so if the browser window hasn't initialized, abort. 206 // a main counterpart, so if the browser window hasn't initialized, abort.
181 // (This is fine because we re-populate the wrench menu each time before 207 // (This is fine because we re-populate the wrench menu each time before
182 // we show it.) 208 // we show it.)
183 if (!browser_->window()) 209 if (!browser_->window())
184 break; 210 break;
185 211
186 BrowserActionsController* mainController = 212 BrowserActionsController* mainController =
187 [[[BrowserWindowController browserWindowControllerForWindow:browser_-> 213 [[[BrowserWindowController browserWindowControllerForWindow:browser_->
188 window()->GetNativeWindow()] toolbarController] 214 window()->GetNativeWindow()] toolbarController]
189 browserActionsController]; 215 browserActionsController];
216 toolbar_actions_bar_observer_.reset(
217 new WrenchMenuControllerInternal::ToolbarActionsBarObserverHelper(
218 self, [mainController toolbarActionsBar]));
190 browserActionsController_.reset( 219 browserActionsController_.reset(
191 [[BrowserActionsController alloc] 220 [[BrowserActionsController alloc]
192 initWithBrowser:browser_ 221 initWithBrowser:browser_
193 containerView:containerView 222 containerView:containerView
194 mainController:mainController]); 223 mainController:mainController]);
195 break; 224 break;
196 } 225 }
197 case IDC_EDIT_MENU: 226 case IDC_EDIT_MENU:
198 view = [buttonViewController_ editItem]; 227 view = [buttonViewController_ editItem];
199 break; 228 break;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 [browserActionsController_ update]; 326 [browserActionsController_ update];
298 327
299 [view setFrameOrigin:NSZeroPoint]; 328 [view setFrameOrigin:NSZeroPoint];
300 [[containerView superview] setFrameOrigin:NSZeroPoint]; 329 [[containerView superview] setFrameOrigin:NSZeroPoint];
301 [containerView setFrameOrigin:NSMakePoint(kLeftPadding, 0)]; 330 [containerView setFrameOrigin:NSMakePoint(kLeftPadding, 0)];
302 } 331 }
303 332
304 - (void)menuWillOpen:(NSMenu*)menu { 333 - (void)menuWillOpen:(NSMenu*)menu {
305 [super menuWillOpen:menu]; 334 [super menuWillOpen:menu];
306 335
336 zoom_level_observer_.reset(
337 new WrenchMenuControllerInternal::ZoomLevelObserver(
338 self,
339 ui_zoom::ZoomEventManager::GetForBrowserContext(
340 browser_->profile())));
307 NSString* title = base::SysUTF16ToNSString( 341 NSString* title = base::SysUTF16ToNSString(
308 [self wrenchMenuModel]->GetLabelForCommandId(IDC_ZOOM_PERCENT_DISPLAY)); 342 [self wrenchMenuModel]->GetLabelForCommandId(IDC_ZOOM_PERCENT_DISPLAY));
309 [[[buttonViewController_ zoomItem] viewWithTag:IDC_ZOOM_PERCENT_DISPLAY] 343 [[[buttonViewController_ zoomItem] viewWithTag:IDC_ZOOM_PERCENT_DISPLAY]
310 setTitle:title]; 344 setTitle:title];
311 content::RecordAction(UserMetricsAction("ShowAppMenu")); 345 content::RecordAction(UserMetricsAction("ShowAppMenu"));
312 346
313 NSImage* icon = [self wrenchMenuModel]->browser()->window()->IsFullscreen() ? 347 NSImage* icon = [self wrenchMenuModel]->browser()->window()->IsFullscreen() ?
314 [NSImage imageNamed:NSImageNameExitFullScreenTemplate] : 348 [NSImage imageNamed:NSImageNameExitFullScreenTemplate] :
315 [NSImage imageNamed:NSImageNameEnterFullScreenTemplate]; 349 [NSImage imageNamed:NSImageNameEnterFullScreenTemplate];
316 [[buttonViewController_ zoomFullScreen] setImage:icon]; 350 [[buttonViewController_ zoomFullScreen] setImage:icon];
317 } 351 }
318 352
353 - (void)menuDidClose:(NSMenu*)menu {
354 [super menuDidClose:menu];
355 // We don't need to observe changes to zoom or toolbar size when the menu is
356 // closed, since we instantiate it with the proper value and recreate the menu
357 // on each show. (We do this in -menuNeedsUpdate:, which is called when the
358 // menu is about to be displayed at the start of a tracking session.)
359 zoom_level_observer_.reset();
360 toolbar_actions_bar_observer_.reset();
361 }
362
319 - (void)menuNeedsUpdate:(NSMenu*)menu { 363 - (void)menuNeedsUpdate:(NSMenu*)menu {
320 // First empty out the menu and create a new model. 364 // First empty out the menu and create a new model.
321 [self removeAllItems:menu]; 365 [self removeAllItems:menu];
322 [self createModel]; 366 [self createModel];
323 [menu setMinimumWidth:0]; 367 [menu setMinimumWidth:0];
324 368
325 // Create a new menu, which cannot be swapped because the tracking is about to 369 // Create a new menu, which cannot be swapped because the tracking is about to
326 // start, so simply copy the items. 370 // start, so simply copy the items.
327 NSMenu* newMenu = [self menuFromModel:model_]; 371 NSMenu* newMenu = [self menuFromModel:model_];
328 NSArray* itemArray = [newMenu itemArray]; 372 NSArray* itemArray = [newMenu itemArray];
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 // (and thus, after all our ability to adjust it normally). Throw in the 602 // (and thus, after all our ability to adjust it normally). Throw in the
559 // towel, and simply don't let the frame move from where it's supposed to be. 603 // towel, and simply don't let the frame move from where it's supposed to be.
560 // TODO(devlin): Yet another Cocoa hack. It'd be good to find a workaround, 604 // TODO(devlin): Yet another Cocoa hack. It'd be good to find a workaround,
561 // but unlikely unless we replace the Cocoa menu implementation. 605 // but unlikely unless we replace the Cocoa menu implementation.
562 NSView* containerSuperview = [overflowActionsContainerView_ superview]; 606 NSView* containerSuperview = [overflowActionsContainerView_ superview];
563 if (NSMinX([containerSuperview frame]) != 0) 607 if (NSMinX([containerSuperview frame]) != 0)
564 [containerSuperview setFrameOrigin:NSZeroPoint]; 608 [containerSuperview setFrameOrigin:NSZeroPoint];
565 } 609 }
566 610
567 @end // @implementation WrenchMenuButtonViewController 611 @end // @implementation WrenchMenuButtonViewController
OLDNEW
« no previous file with comments | « chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h ('k') | chrome/browser/ui/toolbar/toolbar_actions_bar.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698