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