| Index: chrome/browser/cocoa/wrench_menu_controller.mm
|
| diff --git a/chrome/browser/cocoa/wrench_menu_controller.mm b/chrome/browser/cocoa/wrench_menu_controller.mm
|
| index cb0059ae69012ecb867c4c8dac10ac5126154616..49661570aa3749a517e05328756cc34702a45ba3 100644
|
| --- a/chrome/browser/cocoa/wrench_menu_controller.mm
|
| +++ b/chrome/browser/cocoa/wrench_menu_controller.mm
|
| @@ -13,18 +13,53 @@
|
| #import "chrome/browser/cocoa/menu_tracked_root_view.h"
|
| #import "chrome/browser/cocoa/toolbar_controller.h"
|
| #include "chrome/browser/wrench_menu_model.h"
|
| +#include "chrome/common/notification_observer.h"
|
| +#include "chrome/common/notification_service.h"
|
| +#include "chrome/common/notification_source.h"
|
| +#include "chrome/common/notification_type.h"
|
| #include "grit/chromium_strings.h"
|
| #include "grit/generated_resources.h"
|
|
|
| @interface WrenchMenuController (Private)
|
| - (void)adjustPositioning;
|
| - (void)performCommandDispatch:(NSNumber*)tag;
|
| +- (NSButton*)zoomDisplay;
|
| @end
|
|
|
| +namespace WrenchMenuControllerInternal {
|
| +
|
| +class ZoomLevelObserver : public NotificationObserver {
|
| + public:
|
| + explicit ZoomLevelObserver(WrenchMenuController* controller)
|
| + : controller_(controller) {
|
| + registrar_.Add(this, NotificationType::ZOOM_LEVEL_CHANGED,
|
| + NotificationService::AllSources());
|
| + }
|
| +
|
| + void Observe(NotificationType type,
|
| + const NotificationSource& source,
|
| + const NotificationDetails& details) {
|
| + DCHECK_EQ(type.value, NotificationType::ZOOM_LEVEL_CHANGED);
|
| + WrenchMenuModel* wrenchMenuModel = [controller_ wrenchMenuModel];
|
| + wrenchMenuModel->UpdateZoomControls();
|
| + const string16 level =
|
| + wrenchMenuModel->GetLabelForCommandId(IDC_ZOOM_PERCENT_DISPLAY);
|
| + [[controller_ zoomDisplay] setTitle:SysUTF16ToNSString(level)];
|
| + }
|
| +
|
| + private:
|
| + NotificationRegistrar registrar_;
|
| + WrenchMenuController* controller_; // Weak; owns this.
|
| +};
|
| +
|
| +} // namespace WrenchMenuControllerInternal
|
| +
|
| @implementation WrenchMenuController
|
|
|
| - (id)init {
|
| - self = [super init];
|
| + if ((self = [super init])) {
|
| + observer_.reset(new WrenchMenuControllerInternal::ZoomLevelObserver(self));
|
| + }
|
| return self;
|
| }
|
|
|
| @@ -98,12 +133,22 @@
|
| // NSCarbonMenuWindow; this screws up the typical |-commandDispatch:| system.
|
| - (IBAction)dispatchWrenchMenuCommand:(id)sender {
|
| NSInteger tag = [sender tag];
|
| - // The custom views within the Wrench menu are abnormal and keep the menu open
|
| - // after a target-action. Close the menu manually.
|
| - // TODO(rsesek): It'd be great if the zoom buttons didn't have to close the
|
| - // menu. See http://crbug.com/48679 for more info.
|
| - [menu_ cancelTracking];
|
| - [self dispatchCommandInternal:tag];
|
| + if (sender == zoomPlus_ || sender == zoomMinus_) {
|
| + // Do a direct dispatch rather than scheduling on the outermost run loop,
|
| + // which would not get hit until after the menu had closed.
|
| + [self performCommandDispatch:[NSNumber numberWithInt:tag]];
|
| +
|
| + // The zoom buttons should not close the menu if opened sticky.
|
| + if ([sender respondsToSelector:@selector(isTracking)] &&
|
| + [sender performSelector:@selector(isTracking)]) {
|
| + [menu_ cancelTracking];
|
| + }
|
| + } else {
|
| + // The custom views within the Wrench menu are abnormal and keep the menu
|
| + // open after a target-action. Close the menu manually.
|
| + [menu_ cancelTracking];
|
| + [self dispatchCommandInternal:tag];
|
| + }
|
| }
|
|
|
| - (void)dispatchCommandInternal:(NSInteger)tag {
|
| @@ -197,4 +242,8 @@
|
| [[editCut_ superview] setFrame:parentFrame];
|
| }
|
|
|
| +- (NSButton*)zoomDisplay {
|
| + return zoomDisplay_;
|
| +}
|
| +
|
| @end // @implementation WrenchMenuController
|
|
|