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