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