| Index: chrome/browser/ui/cocoa/wrench_menu_controller.mm
|
| ===================================================================
|
| --- chrome/browser/ui/cocoa/wrench_menu_controller.mm (revision 71447)
|
| +++ chrome/browser/ui/cocoa/wrench_menu_controller.mm (working copy)
|
| @@ -1,222 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#import "chrome/browser/ui/cocoa/wrench_menu_controller.h"
|
| -
|
| -#include "app/l10n_util.h"
|
| -#include "base/sys_string_conversions.h"
|
| -#include "chrome/app/chrome_command_ids.h"
|
| -#include "chrome/browser/background_page_tracker.h"
|
| -#include "chrome/browser/metrics/user_metrics.h"
|
| -#import "chrome/browser/ui/cocoa/menu_tracked_root_view.h"
|
| -#import "chrome/browser/ui/cocoa/toolbar_controller.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_window.h"
|
| -#include "chrome/browser/ui/toolbar/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"
|
| -#include "ui/base/models/menu_model.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 {
|
| - if ((self = [super init])) {
|
| - observer_.reset(new WrenchMenuControllerInternal::ZoomLevelObserver(self));
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -- (void)addItemToMenu:(NSMenu*)menu
|
| - atIndex:(NSInteger)index
|
| - fromModel:(ui::MenuModel*)model
|
| - modelIndex:(int)modelIndex {
|
| - // Non-button item types should be built as normal items.
|
| - ui::MenuModel::ItemType type = model->GetTypeAt(modelIndex);
|
| - if (type != ui::MenuModel::TYPE_BUTTON_ITEM) {
|
| - [super addItemToMenu:menu
|
| - atIndex:index
|
| - fromModel:model
|
| - modelIndex:modelIndex];
|
| - return;
|
| - }
|
| -
|
| - // Handle the special-cased menu items.
|
| - int command_id = model->GetCommandIdAt(modelIndex);
|
| - scoped_nsobject<NSMenuItem> customItem(
|
| - [[NSMenuItem alloc] initWithTitle:@""
|
| - action:nil
|
| - keyEquivalent:@""]);
|
| - switch (command_id) {
|
| - case IDC_EDIT_MENU:
|
| - DCHECK(editItem_);
|
| - [customItem setView:editItem_];
|
| - [editItem_ setMenuItem:customItem];
|
| - break;
|
| - case IDC_ZOOM_MENU:
|
| - DCHECK(zoomItem_);
|
| - [customItem setView:zoomItem_];
|
| - [zoomItem_ setMenuItem:customItem];
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - [self adjustPositioning];
|
| - [menu insertItem:customItem.get() atIndex:index];
|
| -}
|
| -
|
| -- (NSMenu*)menu {
|
| - NSMenu* menu = [super menu];
|
| - if (![menu delegate]) {
|
| - [menu setDelegate:self];
|
| - }
|
| - return menu;
|
| -}
|
| -
|
| -- (void)menuWillOpen:(NSMenu*)menu {
|
| - NSString* title = base::SysUTF16ToNSString(
|
| - [self wrenchMenuModel]->GetLabelForCommandId(IDC_ZOOM_PERCENT_DISPLAY));
|
| - [[zoomItem_ viewWithTag:IDC_ZOOM_PERCENT_DISPLAY] setTitle:title];
|
| - UserMetrics::RecordAction(UserMetricsAction("ShowAppMenu"));
|
| -
|
| - NSImage* icon = [self wrenchMenuModel]->browser()->window()->IsFullscreen() ?
|
| - [NSImage imageNamed:NSImageNameExitFullScreenTemplate] :
|
| - [NSImage imageNamed:NSImageNameEnterFullScreenTemplate];
|
| - [zoomFullScreen_ setImage:icon];
|
| -}
|
| -
|
| -- (void)menuDidClose:(NSMenu*)menu {
|
| - // When the menu is closed, acknowledge the background pages so the badges go
|
| - // away.
|
| - BackgroundPageTracker::GetInstance()->AcknowledgeBackgroundPages();
|
| -}
|
| -
|
| -// Used to dispatch commands from the Wrench menu. The custom items within the
|
| -// menu cannot be hooked up directly to First Responder because the window in
|
| -// which the controls reside is not the BrowserWindowController, but a
|
| -// NSCarbonMenuWindow; this screws up the typical |-commandDispatch:| system.
|
| -- (IBAction)dispatchWrenchMenuCommand:(id)sender {
|
| - NSInteger tag = [sender 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 {
|
| - // Executing certain commands from the nested run loop of the menu can lead
|
| - // to wonky behavior (e.g. http://crbug.com/49716). To avoid this, schedule
|
| - // the dispatch on the outermost run loop.
|
| - [self performSelector:@selector(performCommandDispatch:)
|
| - withObject:[NSNumber numberWithInt:tag]
|
| - afterDelay:0.0];
|
| -}
|
| -
|
| -// Used to perform the actual dispatch on the outermost runloop.
|
| -- (void)performCommandDispatch:(NSNumber*)tag {
|
| - [self wrenchMenuModel]->ExecuteCommand([tag intValue]);
|
| -}
|
| -
|
| -- (WrenchMenuModel*)wrenchMenuModel {
|
| - return static_cast<WrenchMenuModel*>(model_);
|
| -}
|
| -
|
| -// Fit the localized strings into the Cut/Copy/Paste control, then resize the
|
| -// whole menu item accordingly.
|
| -- (void)adjustPositioning {
|
| - const CGFloat kButtonPadding = 12;
|
| - CGFloat delta = 0;
|
| -
|
| - // Go through the three buttons from right-to-left, adjusting the size to fit
|
| - // the localized strings while keeping them all aligned on their horizontal
|
| - // edges.
|
| - const size_t kAdjustViewCount = 3;
|
| - NSButton* views[kAdjustViewCount] = { editPaste_, editCopy_, editCut_ };
|
| - for (size_t i = 0; i < kAdjustViewCount; ++i) {
|
| - NSButton* button = views[i];
|
| - CGFloat originalWidth = NSWidth([button frame]);
|
| -
|
| - // Do not let |-sizeToFit| change the height of the button.
|
| - NSSize size = [button frame].size;
|
| - [button sizeToFit];
|
| - size.width = [button frame].size.width + kButtonPadding;
|
| - [button setFrameSize:size];
|
| -
|
| - CGFloat newWidth = size.width;
|
| - delta += newWidth - originalWidth;
|
| -
|
| - NSRect frame = [button frame];
|
| - frame.origin.x -= delta;
|
| - [button setFrame:frame];
|
| - }
|
| -
|
| - // Resize the menu item by the total amound the buttons changed so that the
|
| - // spacing between the buttons and the title remains the same.
|
| - NSRect itemFrame = [editItem_ frame];
|
| - itemFrame.size.width += delta;
|
| - [editItem_ setFrame:itemFrame];
|
| -
|
| - // Also resize the superview of the buttons, which is an NSView used to slide
|
| - // when the item title is too big and GTM resizes it.
|
| - NSRect parentFrame = [[editCut_ superview] frame];
|
| - parentFrame.size.width += delta;
|
| - parentFrame.origin.x -= delta;
|
| - [[editCut_ superview] setFrame:parentFrame];
|
| -}
|
| -
|
| -- (NSButton*)zoomDisplay {
|
| - return zoomDisplay_;
|
| -}
|
| -
|
| -@end // @implementation WrenchMenuController
|
|
|