• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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;
23 class Browser;
24 @class BrowserActionsController;
25 class CommandUpdater;
26 class LocationBar;
27 class LocationBarViewMac;
28 @class MenuButton;
29 @class ToolbarButton;
30 namespace ToolbarControllerInternal {
31 class NotificationBridge;
32 class WrenchAcceleratorDelegate;
33 }  // namespace ToolbarControllerInternal
34 class Profile;
35 @class ReloadButton;
36 class TabContents;
37 class ToolbarModel;
38 @class WrenchMenuController;
39 class 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