- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / wrench_menu / wrench_menu_controller.h
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
13 class BookmarkMenuBridge;
14 class Browser;
15 @class MenuTrackedRootView;
16 class RecentTabsMenuModelDelegate;
17 @class ToolbarController;
18 @class WrenchMenuButtonViewController;
19 class WrenchMenuModel;
20
21 namespace WrenchMenuControllerInternal {
22 class AcceleratorDelegate;
23 class 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_