15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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_EXTENSIONS_BROWSER_ACTIONS_CONTROLLER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_COCOA_EXTENSIONS_BROWSER_ACTIONS_CONTROLLER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Cocoa/Cocoa.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#import "base/mac/scoped_nsobject.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class BrowserActionButton; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class BrowserActionsContainerView; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class ExtensionPopupController; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionServiceObserverBridge; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class MenuButton; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension; 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ExtensionToolbarModel; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sent when the visibility of the Browser Actions changes. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern NSString* const kBrowserActionVisibilityChangedNotification; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handles state and provides an interface for controlling the Browser Actions 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// container within the Toolbar. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface BrowserActionsController : NSObject<NSMenuDelegate> { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @private 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reference to the current browser. Weak. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser_; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view from Toolbar.xib we'll be rendering our browser actions in. Weak. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionsContainerView* containerView_; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current profile. Weak. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The model that tracks the order of the toolbar icons. Weak. 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch extensions::ExtensionToolbarModel* toolbarModel_; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The observer for the ExtensionService we're getting events from. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ExtensionServiceObserverBridge> observer_; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A dictionary of Extension ID -> BrowserActionButton pairs representing the 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // buttons present in the container view. The ID is a string unique to each 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension. 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSMutableDictionary> buttons_; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Array of hidden buttons in the correct order in which the user specified. 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSMutableArray> hiddenButtons_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The currently running chevron animation (fade in/out). 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSViewAnimation> chevronAnimation_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The chevron button used when Browser Actions are hidden. 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<MenuButton> chevronMenuButton_; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Browser Actions overflow menu. 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::scoped_nsobject<NSMenu> overflowMenu_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(readonly, nonatomic) BrowserActionsContainerView* containerView; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initializes the controller given the current browser and container view that 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will hold the browser action buttons. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)initWithBrowser:(Browser*)browser 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containerView:(BrowserActionsContainerView*)container; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Update the display of all buttons. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)update; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the current number of browser action buttons within the container, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whether or not they are displayed. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSUInteger)buttonCount; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the current number of browser action buttons displayed in the 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// container. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSUInteger)visibleButtonCount; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Resizes the container given the number of visible buttons, taking into 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// account the size of the grippy. Also updates the persistent width preference. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)resizeContainerAndAnimate:(BOOL)animate; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the NSView for the action button associated with an extension. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSView*)browserActionViewForExtension:( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension*)extension; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the saved width determined by the number of shown Browser Actions 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// preference property. If no preference is found, then the width for the 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// container is returned as if all buttons are shown. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (CGFloat)savedWidth; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns where the popup arrow should point to for a given Browser Action. If 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it is passed an extension that is not a Browser Action, then it will return 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NSZeroPoint. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSPoint)popupPointForBrowserAction:(const extensions::Extension*)extension; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns whether the chevron button is currently hidden or in the process of 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// being hidden (fading out). Will return NO if it is not hidden or is in the 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// process of fading in. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (BOOL)chevronIsHidden; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Activates the browser action for the extension that has the given id. 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)- (void)activateBrowserAction:(const std::string&)extension_id; 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end // @interface BrowserActionsController 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface BrowserActionsController(TestingAPI) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSButton*)buttonWithIndex:(NSUInteger)index; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_COCOA_EXTENSIONS_BROWSER_ACTIONS_CONTROLLER_H_ 117