summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller.h
blob: 9bcb61af0dd065a0438eec69a26e455348004b9b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_
#define CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_

#import <Cocoa/Cocoa.h>

#include "base/memory/scoped_ptr.h"
#import "chrome/browser/ui/cocoa/menu_controller.h"

class BookmarkMenuBridge;
class Browser;
@class MenuTrackedRootView;
@class ToolbarController;
@class WrenchMenuButtonViewController;
class WrenchMenuModel;

namespace WrenchMenuControllerInternal {
class AcceleratorDelegate;
class ZoomLevelObserver;
}  // namespace WrenchMenuControllerInternal

// The Wrench menu has a creative layout, with buttons in menu items. There is
// a cross-platform model for this special menu, but on the Mac it's easier to
// get spacing and alignment precisely right using a NIB. To do that, we
// subclass the generic MenuController implementation and special-case the two
// items that require specific layout and load them from the NIB.
//
// This object is owned by the ToolbarController and receives its NIB-based
// views using the shim view controller below.
@interface WrenchMenuController : MenuController<NSMenuDelegate> {
 @private
  // Used to provide accelerators for the menu.
  scoped_ptr<WrenchMenuControllerInternal::AcceleratorDelegate>
      acceleratorDelegate_;

  // The model, rebuilt each time the |-menuNeedsUpdate:|.
  scoped_ptr<WrenchMenuModel> wrenchMenuModel_;

  // A shim NSViewController that loads the buttons from the NIB because ObjC
  // doesn't have multiple inheritance as this class is a MenuController.
  scoped_nsobject<WrenchMenuButtonViewController> buttonViewController_;

  // The browser for which this controller exists.
  Browser* browser_;  // weak

  // Used to build the bookmark submenu.
  scoped_ptr<BookmarkMenuBridge> bookmarkMenuBridge_;

  // Observer for page zoom level change notifications.
  scoped_ptr<WrenchMenuControllerInternal::ZoomLevelObserver> observer_;
}

// Designated initializer.
- (id)initWithBrowser:(Browser*)browser;

// Used to dispatch commands from the Wrench menu. The custom items within the
// menu cannot be hooked up directly to First Responder because the window in
// which the controls reside is not the BrowserWindowController, but a
// NSCarbonMenuWindow; this screws up the typical |-commandDispatch:| system.
- (IBAction)dispatchWrenchMenuCommand:(id)sender;

// Returns the weak reference to the WrenchMenuModel.
- (WrenchMenuModel*)wrenchMenuModel;

@end

////////////////////////////////////////////////////////////////////////////////

// Shim view controller that merely unpacks objects from a NIB.
@interface WrenchMenuButtonViewController : NSViewController {
 @private
  WrenchMenuController* controller_;

  MenuTrackedRootView* editItem_;
  NSButton* editCut_;
  NSButton* editCopy_;
  NSButton* editPaste_;

  MenuTrackedRootView* zoomItem_;
  NSButton* zoomPlus_;
  NSButton* zoomDisplay_;
  NSButton* zoomMinus_;
  NSButton* zoomFullScreen_;
}

@property(assign, nonatomic) IBOutlet MenuTrackedRootView* editItem;
@property(assign, nonatomic) IBOutlet NSButton* editCut;
@property(assign, nonatomic) IBOutlet NSButton* editCopy;
@property(assign, nonatomic) IBOutlet NSButton* editPaste;
@property(assign, nonatomic) IBOutlet MenuTrackedRootView* zoomItem;
@property(assign, nonatomic) IBOutlet NSButton* zoomPlus;
@property(assign, nonatomic) IBOutlet NSButton* zoomDisplay;
@property(assign, nonatomic) IBOutlet NSButton* zoomMinus;
@property(assign, nonatomic) IBOutlet NSButton* zoomFullScreen;

- (id)initWithController:(WrenchMenuController*)controller;
- (IBAction)dispatchWrenchMenuCommand:(id)sender;

@end

#endif  // CHROME_BROWSER_UI_COCOA_WRENCH_MENU_WRENCH_MENU_CONTROLLER_H_