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