toolbar_controller.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_COCOA_TOOLBAR_TOOLBAR_CONTROLLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_COCOA_TOOLBAR_TOOLBAR_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Cocoa/Cocoa.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_nsobject.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/api/prefs/pref_member.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import "chrome/browser/ui/cocoa/command_observer_bridge.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import "chrome/browser/ui/cocoa/tracking_area.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import "chrome/browser/ui/cocoa/url_drop_target.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import "chrome/browser/ui/cocoa/view_resizer.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class AutocompleteTextField;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class AutocompleteTextFieldEditor;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class BackForwardMenuController;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class BrowserActionsContainerView;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class BrowserActionsController;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandUpdater;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocationBarViewMac;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class MenuButton;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class ReloadButton;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class ToolbarButton;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ToolbarModel;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class WrenchMenuController;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ToolbarControllerInternal {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationBridge;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A controller for the toolbar in the browser window. Manages
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// updating the state for location bar and back/fwd/reload/go buttons.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages the bookmark bar and its position in the window relative to
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the web content view.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface ToolbarController : NSViewController<CommandObserverProtocol,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                URLDropTargetController> {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @protected
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ordering is important for unit tests. If new items are added or the
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ordering is changed, make sure to update |-toolbarViews| and the
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // corresponding enum in the unit tests.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet MenuButton* backButton_;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet MenuButton* forwardButton_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet ReloadButton* reloadButton_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet ToolbarButton* homeButton_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet MenuButton* wrenchButton_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet AutocompleteTextField* locationBar_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IBOutlet BrowserActionsContainerView* browserActionsContainerView_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @private
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ToolbarModel* toolbarModel_;  // weak, one per window
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* commands_;  // weak, one per window
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;  // weak, one per window
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser_;  // weak, one per window
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CommandObserverBridge> commandObserver_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LocationBarViewMac> locationBarView_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_nsobject<AutocompleteTextFieldEditor> autocompleteTextFieldEditor_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id<ViewResizer> resizeDelegate_;  // weak
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_nsobject<BackForwardMenuController> backMenuController_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_nsobject<BackForwardMenuController> forwardMenuController_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_nsobject<BrowserActionsController> browserActionsController_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lazily-instantiated menu controller.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_nsobject<WrenchMenuController> wrenchMenuController_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for monitoring the optional toolbar button prefs.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ToolbarControllerInternal::NotificationBridge> notificationBridge_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BooleanPrefMember showHomeButton_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOL hasToolbar_;  // If NO, we may have only the location bar.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOL hasLocationBar_;  // If |hasToolbar_| is YES, this must also be YES.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOL locationBarAtMinSize_; // If the location bar is at the minimum size.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We have an extra retain in the locationBar_.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See comments in awakeFromNib for more info.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_nsobject<AutocompleteTextField> locationBarRetainer_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tracking area for mouse enter/exit/moved in the toolbar.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCrTrackingArea trackingArea_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We retain/release the hover button since interaction with the
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // button may make it go away (e.g. delete menu option over a
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bookmark button).  Thus this variable is not weak.  The
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hoveredButton_ is required to have an NSCell that responds to
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // setMouseInside:animate:.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSButton* hoveredButton_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialize the toolbar and register for command updates. The profile is
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// needed for initializing the location bar. The browser is needed for
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// initializing the back/forward menus.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)initWithModel:(ToolbarModel*)model
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           commands:(CommandUpdater*)commands
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            profile:(Profile*)profile
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            browser:(Browser*)browser
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     resizeDelegate:(id<ViewResizer>)resizeDelegate;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the C++ bridge object representing the location bar for this tab.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (LocationBarViewMac*)locationBarBridge;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called by the Window delegate so we can provide a custom field editor if
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// needed.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this may be called for objects unrelated to the toolbar.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returns nil if we don't want to override the custom field editor for |obj|.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)customFieldEditorForObject:(id)obj;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make the location bar the first responder, if possible.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)focusLocationBar:(BOOL)selectAll;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updates the toolbar (and transitively the location bar) with the states of
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the specified |tab|.  If |shouldRestore| is true, we're switching
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (back?) to this tab and should restore any previous location bar state
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (such as user editing) as well.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)updateToolbarWithContents:(content::WebContents*)tabForRestoring
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               shouldRestoreState:(BOOL)shouldRestore;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets whether or not the current page in the frontmost tab is bookmarked.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)setStarredState:(BOOL)isStarred;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Happens when the zoom for the active tab changes, the active tab switches, or
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a new tab or browser window is created. |canShowBubble| indicates if it is
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// appropriate to show a zoom bubble for the change.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)zoomChangedForActiveTab:(BOOL)canShowBubble;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called to update the loading state. Handles updating the go/stop
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// button state.  |force| is set if the update is due to changing
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tabs, as opposed to the page-load finishing.  See comment in
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reload_button.h.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)setIsLoading:(BOOL)isLoading force:(BOOL)force;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allow turning off the toolbar (but we may keep the location bar without a
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// surrounding toolbar). If |toolbar| is YES, the value of |hasLocationBar| is
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ignored. This changes the behavior of other methods, like |-view|.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)setHasToolbar:(BOOL)toolbar hasLocationBar:(BOOL)locBar;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Point on the star icon for the bookmark bubble to be - in the
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// associated window's coordinate system.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSPoint)bookmarkBubblePoint;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the desired toolbar height for the given compression factor.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (CGFloat)desiredHeightForCompression:(CGFloat)compressByHeight;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set the opacity of the divider (the line at the bottom) *if* we have a
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |ToolbarView| (0 means don't show it); no-op otherwise.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)setDividerOpacity:(CGFloat)opacity;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create and add the Browser Action buttons to the toolbar view.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)createBrowserActionButtons;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the BrowserActionsController for this toolbar.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (BrowserActionsController*)browserActionsController;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the wrench button.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSView*)wrenchButton;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A set of private methods used by subclasses. Do not call these directly
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unless a subclass of ToolbarController.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface ToolbarController(ProtectedMethods)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Designated initializer which takes a nib name in order to allow subclasses
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to load a different nib file.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)initWithModel:(ToolbarModel*)model
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           commands:(CommandUpdater*)commands
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            profile:(Profile*)profile
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            browser:(Browser*)browser
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     resizeDelegate:(id<ViewResizer>)resizeDelegate
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       nibFileNamed:(NSString*)nibName;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A set of private methods used by tests, in the absence of "friends" in ObjC.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface ToolbarController(PrivateTestMethods)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns an array of views in the order of the outlets above.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSArray*)toolbarViews;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)showOptionalHomeButton;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)installWrenchMenu;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (WrenchMenuController*)wrenchMenuController;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return a hover button for the current event.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSButton*)hoverButtonForEvent:(NSEvent*)theEvent;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_COCOA_TOOLBAR_TOOLBAR_CONTROLLER_H_
192