1// Copyright (c) 2011 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_TOOLBAR_TOOLBAR_CONTROLLER_H_
6#define CHROME_BROWSER_UI_COCOA_TOOLBAR_TOOLBAR_CONTROLLER_H_
7#pragma once
8
9#import <Cocoa/Cocoa.h>
10
11#include "base/memory/scoped_nsobject.h"
12#include "base/memory/scoped_ptr.h"
13#import "chrome/browser/ui/cocoa/command_observer_bridge.h"
14#import "chrome/browser/ui/cocoa/tracking_area.h"
15#import "chrome/browser/ui/cocoa/url_drop_target.h"
16#import "chrome/browser/ui/cocoa/view_resizer.h"
17#include "chrome/browser/prefs/pref_member.h"
18
19@class AutocompleteTextField;
20@class AutocompleteTextFieldEditor;
21@class BrowserActionsContainerView;
22@class BackForwardMenuController;
23class Browser;
24@class BrowserActionsController;
25class CommandUpdater;
26class LocationBar;
27class LocationBarViewMac;
28@class MenuButton;
29@class ToolbarButton;
30namespace ToolbarControllerInternal {
31class NotificationBridge;
32class WrenchAcceleratorDelegate;
33}  // namespace ToolbarControllerInternal
34class Profile;
35@class ReloadButton;
36class TabContents;
37class ToolbarModel;
38@class WrenchMenuController;
39class WrenchMenuModel;
40
41// A controller for the toolbar in the browser window. Manages
42// updating the state for location bar and back/fwd/reload/go buttons.
43// Manages the bookmark bar and its position in the window relative to
44// the web content view.
45
46@interface ToolbarController : NSViewController<CommandObserverProtocol,
47                                                URLDropTargetController> {
48 @protected
49  // The ordering is important for unit tests. If new items are added or the
50  // ordering is changed, make sure to update |-toolbarViews| and the
51  // corresponding enum in the unit tests.
52  IBOutlet MenuButton* backButton_;
53  IBOutlet MenuButton* forwardButton_;
54  IBOutlet ReloadButton* reloadButton_;
55  IBOutlet ToolbarButton* homeButton_;
56  IBOutlet MenuButton* wrenchButton_;
57  IBOutlet AutocompleteTextField* locationBar_;
58  IBOutlet BrowserActionsContainerView* browserActionsContainerView_;
59  IBOutlet WrenchMenuController* wrenchMenuController_;
60
61 @private
62  ToolbarModel* toolbarModel_;  // weak, one per window
63  CommandUpdater* commands_;  // weak, one per window
64  Profile* profile_;  // weak, one per window
65  Browser* browser_;  // weak, one per window
66  scoped_ptr<CommandObserverBridge> commandObserver_;
67  scoped_ptr<LocationBarViewMac> locationBarView_;
68  scoped_nsobject<AutocompleteTextFieldEditor> autocompleteTextFieldEditor_;
69  id<ViewResizer> resizeDelegate_;  // weak
70  scoped_nsobject<BackForwardMenuController> backMenuController_;
71  scoped_nsobject<BackForwardMenuController> forwardMenuController_;
72  scoped_nsobject<BrowserActionsController> browserActionsController_;
73
74  // Lazily-instantiated model and delegate for the menu on the
75  // wrench button.  Once visible, it will be non-null, but will not
76  // reaped when the menu is hidden once it is initially shown.
77  scoped_ptr<ToolbarControllerInternal::WrenchAcceleratorDelegate>
78      acceleratorDelegate_;
79  scoped_ptr<WrenchMenuModel> wrenchMenuModel_;
80
81  // Used for monitoring the optional toolbar button prefs.
82  scoped_ptr<ToolbarControllerInternal::NotificationBridge> notificationBridge_;
83  BooleanPrefMember showHomeButton_;
84  BOOL hasToolbar_;  // If NO, we may have only the location bar.
85  BOOL hasLocationBar_;  // If |hasToolbar_| is YES, this must also be YES.
86  BOOL locationBarAtMinSize_; // If the location bar is at the minimum size.
87
88  // We have an extra retain in the locationBar_.
89  // See comments in awakeFromNib for more info.
90  scoped_nsobject<AutocompleteTextField> locationBarRetainer_;
91
92  // Tracking area for mouse enter/exit/moved in the toolbar.
93  ScopedCrTrackingArea trackingArea_;
94
95  // We retain/release the hover button since interaction with the
96  // button may make it go away (e.g. delete menu option over a
97  // bookmark button).  Thus this variable is not weak.  The
98  // hoveredButton_ is required to have an NSCell that responds to
99  // setMouseInside:animate:.
100  NSButton* hoveredButton_;
101}
102
103// Initialize the toolbar and register for command updates. The profile is
104// needed for initializing the location bar. The browser is needed for
105// initializing the back/forward menus.
106- (id)initWithModel:(ToolbarModel*)model
107           commands:(CommandUpdater*)commands
108            profile:(Profile*)profile
109            browser:(Browser*)browser
110     resizeDelegate:(id<ViewResizer>)resizeDelegate;
111
112// Get the C++ bridge object representing the location bar for this tab.
113- (LocationBarViewMac*)locationBarBridge;
114
115// Called by the Window delegate so we can provide a custom field editor if
116// needed.
117// Note that this may be called for objects unrelated to the toolbar.
118// returns nil if we don't want to override the custom field editor for |obj|.
119- (id)customFieldEditorForObject:(id)obj;
120
121// Make the location bar the first responder, if possible.
122- (void)focusLocationBar:(BOOL)selectAll;
123
124// Updates the toolbar (and transitively the location bar) with the states of
125// the specified |tab|.  If |shouldRestore| is true, we're switching
126// (back?) to this tab and should restore any previous location bar state
127// (such as user editing) as well.
128- (void)updateToolbarWithContents:(TabContents*)tabForRestoring
129               shouldRestoreState:(BOOL)shouldRestore;
130
131// Sets whether or not the current page in the frontmost tab is bookmarked.
132- (void)setStarredState:(BOOL)isStarred;
133
134// Called to update the loading state. Handles updating the go/stop
135// button state.  |force| is set if the update is due to changing
136// tabs, as opposed to the page-load finishing.  See comment in
137// reload_button.h.
138- (void)setIsLoading:(BOOL)isLoading force:(BOOL)force;
139
140// Allow turning off the toolbar (but we may keep the location bar without a
141// surrounding toolbar). If |toolbar| is YES, the value of |hasLocationBar| is
142// ignored. This changes the behavior of other methods, like |-view|.
143- (void)setHasToolbar:(BOOL)toolbar hasLocationBar:(BOOL)locBar;
144
145// Point on the star icon for the bookmark bubble to be - in the
146// associated window's coordinate system.
147- (NSPoint)bookmarkBubblePoint;
148
149// Returns the desired toolbar height for the given compression factor.
150- (CGFloat)desiredHeightForCompression:(CGFloat)compressByHeight;
151
152// Set the opacity of the divider (the line at the bottom) *if* we have a
153// |ToolbarView| (0 means don't show it); no-op otherwise.
154- (void)setDividerOpacity:(CGFloat)opacity;
155
156// Create and add the Browser Action buttons to the toolbar view.
157- (void)createBrowserActionButtons;
158
159// Return the BrowserActionsController for this toolbar.
160- (BrowserActionsController*)browserActionsController;
161
162@end
163
164// A set of private methods used by subclasses. Do not call these directly
165// unless a subclass of ToolbarController.
166@interface ToolbarController(ProtectedMethods)
167// Designated initializer which takes a nib name in order to allow subclasses
168// to load a different nib file.
169- (id)initWithModel:(ToolbarModel*)model
170           commands:(CommandUpdater*)commands
171            profile:(Profile*)profile
172            browser:(Browser*)browser
173     resizeDelegate:(id<ViewResizer>)resizeDelegate
174       nibFileNamed:(NSString*)nibName;
175@end
176
177// A set of private methods used by tests, in the absence of "friends" in ObjC.
178@interface ToolbarController(PrivateTestMethods)
179// Returns an array of views in the order of the outlets above.
180- (NSArray*)toolbarViews;
181- (void)showOptionalHomeButton;
182- (void)installWrenchMenu;
183- (WrenchMenuController*)wrenchMenuController;
184// Return a hover button for the current event.
185- (NSButton*)hoverButtonForEvent:(NSEvent*)theEvent;
186@end
187
188#endif  // CHROME_BROWSER_UI_COCOA_TOOLBAR_TOOLBAR_CONTROLLER_H_
189