15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Cocoa/Cocoa.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#import "ui/base/cocoa/menu_controller.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkMenuBridge;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class MenuTrackedRootView;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RecentTabsMenuModelDelegate;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class ToolbarController;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class WrenchMenuButtonViewController;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WrenchMenuModel;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace wrench_menu_controller {
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The vertical offset of the wrench bubbles from the wrench menu button.
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const CGFloat kWrenchBubblePointOffsetY;
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace WrenchMenuControllerInternal {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AcceleratorDelegate;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ZoomLevelObserver;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace WrenchMenuControllerInternal
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Wrench menu has a creative layout, with buttons in menu items. There is
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a cross-platform model for this special menu, but on the Mac it's easier to
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// get spacing and alignment precisely right using a NIB. To do that, we
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subclass the generic MenuController implementation and special-case the two
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// items that require specific layout and load them from the NIB.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This object is owned by the ToolbarController and receives its NIB-based
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// views using the shim view controller below.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface WrenchMenuController : MenuController<NSMenuDelegate> {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @private
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to provide accelerators for the menu.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WrenchMenuControllerInternal::AcceleratorDelegate>
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      acceleratorDelegate_;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The model, rebuilt each time the |-menuNeedsUpdate:|.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WrenchMenuModel> wrenchMenuModel_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used to update icons in the recent tabs menu. This must be declared after
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |wrenchMenuModel_| so that it gets deleted first.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RecentTabsMenuModelDelegate> recentTabsMenuModelDelegate_;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A shim NSViewController that loads the buttons from the NIB because ObjC
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doesn't have multiple inheritance as this class is a MenuController.
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::scoped_nsobject<WrenchMenuButtonViewController> buttonViewController_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser for which this controller exists.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser_;  // weak
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to build the bookmark submenu.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BookmarkMenuBridge> bookmarkMenuBridge_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observer for page zoom level change notifications.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WrenchMenuControllerInternal::ZoomLevelObserver> observer_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Designated initializer.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)initWithBrowser:(Browser*)browser;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to dispatch commands from the Wrench menu. The custom items within the
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// menu cannot be hooked up directly to First Responder because the window in
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which the controls reside is not the BrowserWindowController, but a
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NSCarbonMenuWindow; this screws up the typical |-commandDispatch:| system.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)dispatchWrenchMenuCommand:(id)sender;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the weak reference to the WrenchMenuModel.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (WrenchMenuModel*)wrenchMenuModel;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates a RecentTabsMenuModelDelegate instance which will take care of
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// updating the recent tabs submenu.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (void)updateRecentTabsSubmenu;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shim view controller that merely unpacks objects from a NIB.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface WrenchMenuButtonViewController : NSViewController {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @private
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WrenchMenuController* controller_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuTrackedRootView* editItem_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSButton* editCut_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSButton* editCopy_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSButton* editPaste_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MenuTrackedRootView* zoomItem_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSButton* zoomPlus_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSButton* zoomDisplay_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSButton* zoomMinus_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSButton* zoomFullScreen_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(assign, nonatomic) IBOutlet MenuTrackedRootView* editItem;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(assign, nonatomic) IBOutlet NSButton* editCut;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(assign, nonatomic) IBOutlet NSButton* editCopy;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(assign, nonatomic) IBOutlet NSButton* editPaste;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(assign, nonatomic) IBOutlet MenuTrackedRootView* zoomItem;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(assign, nonatomic) IBOutlet NSButton* zoomPlus;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(assign, nonatomic) IBOutlet NSButton* zoomDisplay;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(assign, nonatomic) IBOutlet NSButton* zoomMinus;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(assign, nonatomic) IBOutlet NSButton* zoomFullScreen;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)initWithController:(WrenchMenuController*)controller;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (IBAction)dispatchWrenchMenuCommand:(id)sender;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_
119