wrench_menu_controller.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_ 6#define CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_ 7 8#import <Cocoa/Cocoa.h> 9 10#include "base/memory/scoped_ptr.h" 11#import "ui/base/cocoa/menu_controller.h" 12 13class BookmarkMenuBridge; 14class Browser; 15@class MenuTrackedRootView; 16class RecentTabsMenuModelDelegate; 17@class ToolbarController; 18@class WrenchMenuButtonViewController; 19class WrenchMenuModel; 20 21namespace WrenchMenuControllerInternal { 22class AcceleratorDelegate; 23class ZoomLevelObserver; 24} // namespace WrenchMenuControllerInternal 25 26// The Wrench menu has a creative layout, with buttons in menu items. There is 27// a cross-platform model for this special menu, but on the Mac it's easier to 28// get spacing and alignment precisely right using a NIB. To do that, we 29// subclass the generic MenuController implementation and special-case the two 30// items that require specific layout and load them from the NIB. 31// 32// This object is owned by the ToolbarController and receives its NIB-based 33// views using the shim view controller below. 34@interface WrenchMenuController : MenuController<NSMenuDelegate> { 35 @private 36 // Used to provide accelerators for the menu. 37 scoped_ptr<WrenchMenuControllerInternal::AcceleratorDelegate> 38 acceleratorDelegate_; 39 40 // The model, rebuilt each time the |-menuNeedsUpdate:|. 41 scoped_ptr<WrenchMenuModel> wrenchMenuModel_; 42 43 // Used to update icons in the recent tabs menu. This must be declared after 44 // |wrenchMenuModel_| so that it gets deleted first. 45 scoped_ptr<RecentTabsMenuModelDelegate> recentTabsMenuModelDelegate_; 46 47 // A shim NSViewController that loads the buttons from the NIB because ObjC 48 // doesn't have multiple inheritance as this class is a MenuController. 49 base::scoped_nsobject<WrenchMenuButtonViewController> buttonViewController_; 50 51 // The browser for which this controller exists. 52 Browser* browser_; // weak 53 54 // Used to build the bookmark submenu. 55 scoped_ptr<BookmarkMenuBridge> bookmarkMenuBridge_; 56 57 // Observer for page zoom level change notifications. 58 scoped_ptr<WrenchMenuControllerInternal::ZoomLevelObserver> observer_; 59} 60 61// Designated initializer. 62- (id)initWithBrowser:(Browser*)browser; 63 64// Used to dispatch commands from the Wrench menu. The custom items within the 65// menu cannot be hooked up directly to First Responder because the window in 66// which the controls reside is not the BrowserWindowController, but a 67// NSCarbonMenuWindow; this screws up the typical |-commandDispatch:| system. 68- (IBAction)dispatchWrenchMenuCommand:(id)sender; 69 70// Returns the weak reference to the WrenchMenuModel. 71- (WrenchMenuModel*)wrenchMenuModel; 72 73// Creates a RecentTabsMenuModelDelegate instance which will take care of 74// updating the recent tabs submenu. 75- (void)updateRecentTabsSubmenu; 76 77@end 78 79//////////////////////////////////////////////////////////////////////////////// 80 81// Shim view controller that merely unpacks objects from a NIB. 82@interface WrenchMenuButtonViewController : NSViewController { 83 @private 84 WrenchMenuController* controller_; 85 86 MenuTrackedRootView* editItem_; 87 NSButton* editCut_; 88 NSButton* editCopy_; 89 NSButton* editPaste_; 90 91 MenuTrackedRootView* zoomItem_; 92 NSButton* zoomPlus_; 93 NSButton* zoomDisplay_; 94 NSButton* zoomMinus_; 95 NSButton* zoomFullScreen_; 96} 97 98@property(assign, nonatomic) IBOutlet MenuTrackedRootView* editItem; 99@property(assign, nonatomic) IBOutlet NSButton* editCut; 100@property(assign, nonatomic) IBOutlet NSButton* editCopy; 101@property(assign, nonatomic) IBOutlet NSButton* editPaste; 102@property(assign, nonatomic) IBOutlet MenuTrackedRootView* zoomItem; 103@property(assign, nonatomic) IBOutlet NSButton* zoomPlus; 104@property(assign, nonatomic) IBOutlet NSButton* zoomDisplay; 105@property(assign, nonatomic) IBOutlet NSButton* zoomMinus; 106@property(assign, nonatomic) IBOutlet NSButton* zoomFullScreen; 107 108- (id)initWithController:(WrenchMenuController*)controller; 109- (IBAction)dispatchWrenchMenuCommand:(id)sender; 110 111@end 112 113#endif // CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_ 114