172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file. 44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#ifndef CHROME_BROWSER_UI_VIEWS_BROWSER_ACTIONS_CONTAINER_H_ 64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define CHROME_BROWSER_UI_VIEWS_BROWSER_ACTIONS_CONTAINER_H_ 74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once 84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <set> 104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <string> 114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <vector> 124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/compiler_specific.h" 144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/task.h" 154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/extensions/extension_context_menu_model.h" 164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/extensions/extension_toolbar_model.h" 174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/extensions/image_loading_tracker.h" 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/browser_bubble.h" 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/extensions/browser_action_overflow_menu_controller.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/extensions/extension_popup.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h" 233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/animation_delegate.h" 243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/tween.h" 254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/button/menu_button.h" 264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/menu/view_menu_delegate.h" 274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/resize_area.h" 284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/view.h" 294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Browser; 314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass BrowserActionOverflowMenuController; 324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass BrowserActionsContainer; 334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Extension; 344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ExtensionAction; 354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ExtensionPopup; 364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass PrefService; 374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Profile; 384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochnamespace gfx { 404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass CanvasSkia; 414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace ui { 443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass SlideAnimation; 453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen} 463f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochnamespace views { 484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Menu2; 494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// BrowserActionButton 534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// The BrowserActionButton is a specialization of the MenuButton class. 554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// It acts on a ExtensionAction, in this case a BrowserAction and handles 564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// loading the image for the button asynchronously on the file thread. 574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass BrowserActionButton : public views::MenuButton, 584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public views::ButtonListener, 594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public ImageLoadingTracker::Observer, 604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public NotificationObserver { 614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public: 624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionButton(const Extension* extension, 634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionsContainer* panel); 644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Call this instead of delete. 664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void Destroy(); 674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionAction* browser_action() const { return browser_action_; } 694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const Extension* extension() { return extension_; } 704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Called to update the display to match the browser action's state. 724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void UpdateState(); 734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns the default icon, if any. 754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const SkBitmap& default_icon() const { return default_icon_; } 764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Does this button's action have a popup? 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool IsPopup(); 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual GURL GetPopupUrl(); 804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from views::ButtonListener: 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void ButtonPressed(views::Button* sender, 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const views::Event& event) OVERRIDE; 844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from ImageLoadingTracker. 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnImageLoaded(SkBitmap* image, 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ExtensionResource& resource, 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int index) OVERRIDE; 894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from NotificationObserver: 914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void Observe(NotificationType type, 924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const NotificationSource& source, 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const NotificationDetails& details) OVERRIDE; 944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // MenuButton behavior overrides. These methods all default to TextButton 964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // behavior unless this button is a popup. In that case, it uses MenuButton 974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // behavior. MenuButton has the notion of a child popup being shown where the 984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // button will stay in the pushed state until the "menu" (a popup in this 994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // case) is dismissed. 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool Activate() OVERRIDE; 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE; 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnMouseExited(const views::MouseEvent& event) OVERRIDE; 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool OnKeyReleased(const views::KeyEvent& event) OVERRIDE; 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void ShowContextMenu(const gfx::Point& p, 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_mouse_gesture) OVERRIDE; 1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Notifications when to set button state to pushed/not pushed (for when the 1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // popup/context menu is hidden or shown by the container). 1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void SetButtonPushed(); 1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void SetButtonNotPushed(); 1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected: 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Overridden from views::View: 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void ViewHierarchyChanged(bool is_add, 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen View* parent, 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen View* child) OVERRIDE; 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private: 1204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual ~BrowserActionButton(); 1214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The browser action this view represents. The ExtensionAction is not owned 1234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // by this class. 1244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionAction* browser_action_; 1254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The extension associated with the browser action we're displaying. 1274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const Extension* extension_; 1284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The object that is waiting for the image loading to complete 1304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // asynchronously. 1314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ImageLoadingTracker tracker_; 1324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Whether we are currently showing/just finished showing a context menu. 1344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool showing_context_menu_; 1354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The default icon for our browser action. This might be non-empty if the 1374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // browser action had a value for default_icon in the manifest. 1384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SkBitmap default_icon_; 1394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The browser action shelf. 1414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionsContainer* panel_; 1424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<ExtensionContextMenuModel> context_menu_contents_; 1444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_ptr<views::Menu2> context_menu_menu_; 1454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NotificationRegistrar registrar_; 1474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch friend class DeleteTask<BrowserActionButton>; 1494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DISALLOW_COPY_AND_ASSIGN(BrowserActionButton); 1514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}; 1524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 1554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// BrowserActionView 1564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// A single section in the browser action container. This contains the actual 1574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// BrowserActionButton, as well as the logic to paint the badge. 1584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass BrowserActionView : public views::View { 1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public: 1614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionView(const Extension* extension, BrowserActionsContainer* panel); 1624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual ~BrowserActionView(); 1634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionButton* button() { return button_; } 1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Allocates a canvas object on the heap and draws into it the icon for the 1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // view as well as the badge (if any). Caller is responsible for deleting the 1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // returned object. 1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch gfx::Canvas* GetIconWithBadge(); 1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Overridden from views::View: 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void Layout() OVERRIDE; 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; 1744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected: 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Overridden from views::View to paint the badge on top of children. 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void PaintChildren(gfx::Canvas* canvas) OVERRIDE; 1784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 1804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The container for this view. 1814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionsContainer* panel_; 1824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The button this view contains. 1844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionButton* button_; 1854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DISALLOW_COPY_AND_ASSIGN(BrowserActionView); 1874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}; 1884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 1904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// The BrowserActionsContainer is a container view, responsible for drawing the 1924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// browser action icons (extensions that add icons to the toolbar). 1934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 1944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// The container is placed flush against the omnibox and wrench menu, and its 1954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// layout looks like: 1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// rI_I_IcCs 1974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Where the letters are as follows: 1984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// r: An invisible resize area. This is ToolbarView::kStandardSpacing pixels 1994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// wide and directly adjacent to the omnibox. 2004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// I: An icon. This is as wide as the IDR_BROWSER_ACTION image. 2014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// _: kItemSpacing pixels of empty space. 2024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// c: kChevronSpacing pixels of empty space. Only present if C is present. 2034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// C: An optional chevron, visible for overflow. As wide as the 2044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// IDR_BROWSER_ACTIONS_OVERFLOW image. 2054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// s: ToolbarView::kStandardSpacing pixels of empty space (before the wrench 2064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// menu). 2074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// The reason the container contains the trailing space "s", rather than having 2084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// it be handled by the parent view, is so that when the chevron is invisible 2094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// and the user starts dragging an icon around, we have the space to draw the 2104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// ultimate drop indicator. (Otherwise, we'd be trying to draw it into the 2114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// padding beyond our right edge, and it wouldn't appear.) 2124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 2134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// The BrowserActionsContainer follows a few rules, in terms of user experience: 2144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 2154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 1) The container can never grow beyond the space needed to show all icons 2164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// (hereby referred to as the max width). 2174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 2) The container can never shrink below the space needed to show just the 2184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// initial padding and the chevron (ignoring the case where there are no icons 2194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// to show, in which case the container won't be visible anyway). 2204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 3) The container snaps into place (to the pixel count that fits the visible 2214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// icons) to make sure there is no wasted space at the edges of the container. 2224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 4) If the user adds or removes icons (read: installs/uninstalls browser 2234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// actions) we grow and shrink the container as needed - but ONLY if the 2244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// container was at max width to begin with. 2254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 5) If the container is NOT at max width (has an overflow menu), we respect 2264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// that size when adding and removing icons and DON'T grow/shrink the container. 2274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// This means that new icons (which always appear at the far right) will show up 2284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// in the overflow menu. The install bubble for extensions points to the chevron 2294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// menu in this case. 2304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 2314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Resizing the BrowserActionsContainer: 2324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 2334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// The ResizeArea view sends OnResize messages to the BrowserActionsContainer 2344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// class as the user drags it. This modifies the value for |resize_amount_|. 2354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// That indicates to the container that a resize is in progress and is used to 2364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// calculate the size in GetPreferredSize(), though that function never exceeds 2374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// the defined minimum and maximum size of the container. 2384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 2394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// When the user releases the mouse (ends the resize), we calculate a target 2404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// size for the container (animation_target_size_), clamp that value to the 2414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// containers min and max and then animate from the *current* position (that the 2424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// user has dragged the view to) to the target size. 2434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 2444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Animating the BrowserActionsContainer: 2454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 2464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Animations are used when snapping the container to a value that fits all 2474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// visible icons. This can be triggered when the user finishes resizing the 2484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// container or when Browser Actions are added/removed. 2494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 2504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// We always animate from the current width (container_width_) to the target 2514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// size (animation_target_size_), using |resize_amount| to keep track of the 2524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// animation progress. 2534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 2544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// NOTE: When adding Browser Actions to a maximum width container (no overflow) 2554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// we make sure to suppress the chevron menu if it wasn't visible. This is 2564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// because we won't have enough space to show the new Browser Action until the 2574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// animation ends and we don't want the chevron to flash into view while we are 2584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// growing the container. 2594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// 2604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 2614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass BrowserActionsContainer 2624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch : public views::View, 2634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public views::ViewMenuDelegate, 2644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public views::DragController, 2654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public views::ResizeArea::ResizeAreaDelegate, 2663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen public ui::AnimationDelegate, 2674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public ExtensionToolbarModel::Observer, 2684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public BrowserActionOverflowMenuController::Observer, 2694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public ExtensionContextMenuModel::PopupDelegate, 2704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public ExtensionPopup::Observer { 2714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public: 2724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionsContainer(Browser* browser, views::View* owner_view); 2734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual ~BrowserActionsContainer(); 2744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch static void RegisterUserPrefs(PrefService* prefs); 2764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void Init(); 2784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Get the number of browser actions being displayed. 2804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int num_browser_actions() const { return browser_action_views_.size(); } 2814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Whether we are performing resize animation on the container. 2834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool animating() const { return animation_target_size_ > 0; } 2844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns the chevron, if any. 2864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const views::View* chevron() const { return chevron_; } 2874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns the profile this container is associated with. 2894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Profile* profile() const { return profile_; } 2904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns the browser this container is associated with. 2924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Browser* browser() const { return browser_; } 2934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns the current tab's ID, or -1 if there is no current tab. 2954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int GetCurrentTabId() const; 2964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Get a particular browser action view. 2984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionView* GetBrowserActionViewAt(int index) { 2994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return browser_action_views_[index]; 3004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 3014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Retrieve the BrowserActionView for |extension|. 3034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionView* GetBrowserActionView(ExtensionAction* action); 3044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Update the views to reflect the state of the browser action icons. 3064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void RefreshBrowserActionViews(); 3074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Sets up the browser action view vector. 3094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void CreateBrowserActionViews(); 3104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Delete all browser action views. 3124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void DeleteBrowserActionViews(); 3134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Called when a browser action becomes visible/hidden. 3154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void OnBrowserActionVisibilityChanged(); 3164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns how many browser actions are visible. 3184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch size_t VisibleBrowserActions() const; 3194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Called when the user clicks on the browser action icon. 3214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void OnBrowserActionExecuted(BrowserActionButton* button, 3224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool inspect_with_devtools); 3234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from views::View: 325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual gfx::Size GetPreferredSize() OVERRIDE; 326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void Layout() OVERRIDE; 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool GetDropFormats(int* formats, 328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::set<ui::OSExchangeData::CustomFormat>* custom_formats) OVERRIDE; 329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool AreDropTypesRequired() OVERRIDE; 330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool CanDrop(const ui::OSExchangeData& data) OVERRIDE; 331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnDragEntered(const views::DropTargetEvent& event) OVERRIDE; 332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual int OnDragUpdated(const views::DropTargetEvent& event) OVERRIDE; 333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnDragExited() OVERRIDE; 334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual int OnPerformDrop(const views::DropTargetEvent& event) OVERRIDE; 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; 3364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from views::ViewMenuDelegate: 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void RunMenu(View* source, const gfx::Point& pt) OVERRIDE; 3394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from views::DragController: 341dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void WriteDragDataForView(View* sender, 342dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const gfx::Point& press_pt, 343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ui::OSExchangeData* data) OVERRIDE; 344dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual int GetDragOperationsForView(View* sender, 345dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const gfx::Point& p) OVERRIDE; 346dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool CanStartDragForView(View* sender, 347dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const gfx::Point& press_pt, 348dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const gfx::Point& p) OVERRIDE; 3494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from ResizeArea::ResizeAreaDelegate: 351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnResize(int resize_amount, bool done_resizing) OVERRIDE; 3524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Overridden from ui::AnimationDelegate: 354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE; 355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE; 3564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from BrowserActionOverflowMenuController::Observer: 3584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void NotifyMenuDeleted( 359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserActionOverflowMenuController* controller) OVERRIDE; 3604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from ExtensionContextMenuModel::PopupDelegate 362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void InspectPopup(ExtensionAction* action) OVERRIDE; 3634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overriden from ExtensionPopup::Delegate 365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void ExtensionPopupIsClosing(ExtensionPopup* popup) OVERRIDE; 3664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Moves a browser action with |id| to |new_index|. 3684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void MoveBrowserAction(const std::string& extension_id, size_t new_index); 3694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Hide the current popup. 3714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void HidePopup(); 3724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Simulate a click on a browser action button. This should only be 3744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // used by unit tests. 3754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void TestExecuteBrowserAction(int index); 3764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Retrieve the current popup. This should only be used by unit tests. 3784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionPopup* TestGetPopup() { return popup_; } 3794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Set how many icons the container should show. This should only be used by 3814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // unit tests. 3824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void TestSetIconVisibilityCount(size_t icons); 3834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 3844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // During testing we can disable animations by setting this flag to true, 3854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // so that the bar resizes instantly, instead of having to poll it while it 3864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // animates to open/closed status. 3874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch static bool disable_animations_during_testing_; 3884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected: 390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Overridden from views::View: 391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void ViewHierarchyChanged(bool is_add, 392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen views::View* parent, 393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen views::View* child) OVERRIDE; 394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnThemeChanged() OVERRIDE; 396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 3974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private: 3984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch friend class BrowserActionView; // So it can access IconHeight(). 3994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch friend class ShowFolderMenuTask; 4004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch typedef std::vector<BrowserActionView*> BrowserActionViews; 4024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns the width of an icon, optionally with its padding. 4044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch static int IconWidth(bool include_padding); 4054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns the height of an icon. 4074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch static int IconHeight(); 4084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // ExtensionToolbarModel::Observer implementation. 4104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void BrowserActionAdded(const Extension* extension, int index); 4114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void BrowserActionRemoved(const Extension* extension); 4124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void BrowserActionMoved(const Extension* extension, int index); 4134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void ModelLoaded(); 4144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void LoadImages(); 4164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Sets the initial container width. 4184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void SetContainerWidth(); 4194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Closes the overflow menu if open. 4214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void CloseOverflowMenu(); 4224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Cancels the timer for showing the drop down menu. 4244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void StopShowFolderDropMenuTimer(); 4254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Show the drop down folder after a slight delay. 4274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void StartShowFolderDropMenuTimer(); 4284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Show the overflow menu. 4304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void ShowDropFolder(); 4314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Sets the drop indicator position (and schedules paint if the position has 4334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // changed). 4344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void SetDropIndicator(int x_pos); 4354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Given a number of |icons| and whether to |display_chevron|, returns the 4374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // amount of pixels needed to draw the entire container. For convenience, 4384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // callers can set |icons| to -1 to mean "all icons". 4394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int IconCountToWidth(int icons, bool display_chevron) const; 4404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Given a pixel width, returns the number of icons that fit. (This 4424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // automatically determines whether a chevron will be needed and includes it 4434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // in the calculation.) 4444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch size_t WidthToIconCount(int pixels) const; 4454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns the absolute minimum size you can shrink the container down to and 4474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // still show it. This assumes a visible chevron because the only way we 4484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // would not have a chevron when shrinking down this far is if there were no 4494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // icons, in which case the container wouldn't be shown at all. 4504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int ContainerMinSize() const; 4514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Animate to the target size (unless testing, in which case we go straight to 4534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // the target size). This also saves the target number of visible icons in 454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // the pref if we're not incognito. 4553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen void SaveDesiredSizeAndAnimate(ui::Tween::Type type, 4563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen size_t num_visible_icons); 4574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns true if this extension should be shown in this toolbar. This can 4594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // return false if we are in an incognito window and the extension is disabled 4604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // for incognito. 4614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool ShouldDisplayBrowserAction(const Extension* extension); 4624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The vector of browser actions (icons/image buttons for each action). Note 4644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // that not every BrowserAction in the ToolbarModel will necessarily be in 4654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // this collection. Some extensions may be disabled in incognito windows. 4664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionViews browser_action_views_; 4674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Profile* profile_; 4694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The Browser object the container is associated with. 4714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Browser* browser_; 4724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The view that owns us. 4744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::View* owner_view_; 4754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The current popup and the button it came from. NULL if no popup. 4774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionPopup* popup_; 4784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The button that triggered the current popup (just a reference to a button 4804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // from browser_action_views_). 4814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionButton* popup_button_; 4824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The model that tracks the order of the toolbar icons. 4844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionToolbarModel* model_; 4854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The current width of the container. 4874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int container_width_; 4884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The resize area for the container. 4904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::ResizeArea* resize_area_; 4914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The chevron for accessing the overflow items. 4934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::MenuButton* chevron_; 4944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The menu to show for the overflow button (chevron). This class manages its 4964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // own lifetime so that it can stay alive during drag and drop operations. 4974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserActionOverflowMenuController* overflow_menu_; 4984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 4994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The animation that happens when the container snaps to place. 5003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen scoped_ptr<ui::SlideAnimation> resize_animation_; 5014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Don't show the chevron while animating. 5034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool suppress_chevron_; 5044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // This is used while the user is resizing (and when the animations are in 5064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // progress) to know how wide the delta is between the current state and what 5074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // we should draw. 5084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int resize_amount_; 5094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Keeps track of the absolute pixel width the container should have when we 5114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // are done animating. 5124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int animation_target_size_; 5134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The x position for where to draw the drop indicator. -1 if no indicator. 5154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int drop_indicator_position_; 5164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ScopedRunnableMethodFactory<BrowserActionsContainer> task_factory_; 5184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Handles delayed showing of the overflow menu when hovering. 5204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ScopedRunnableMethodFactory<BrowserActionsContainer> show_menu_task_factory_; 5214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DISALLOW_COPY_AND_ASSIGN(BrowserActionsContainer); 5234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}; 5244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif // CHROME_BROWSER_UI_VIEWS_BROWSER_ACTIONS_CONTAINER_H_ 526