// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_UI_VIEWS_TOOLBAR_TOOLBAR_VIEW_H_ #define CHROME_BROWSER_UI_VIEWS_TOOLBAR_TOOLBAR_VIEW_H_ #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/observer_list.h" #include "chrome/browser/command_observer.h" #include "chrome/browser/ui/toolbar/app_menu_badge_controller.h" #include "chrome/browser/ui/toolbar/back_forward_menu_model.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" #include "components/prefs/pref_member.h" #include "ui/base/accelerators/accelerator.h" #include "ui/views/accessible_pane_view.h" #include "ui/views/controls/button/menu_button.h" #include "ui/views/controls/button/menu_button_listener.h" #include "ui/views/view.h" class AppMenuButton; class BackButton; class Browser; class BrowserActionsContainer; class HomeButton; class ReloadButton; class ToolbarButton; namespace extensions { class Command; class Extension; } // The Browser Window's toolbar. class ToolbarView : public views::AccessiblePaneView, public views::MenuButtonListener, public ui::AcceleratorProvider, public LocationBarView::Delegate, public content::NotificationObserver, public CommandObserver, public views::ButtonListener, public views::ViewTargeterDelegate, public AppMenuBadgeController::Delegate { public: // The view class name. static const char kViewClassName[]; explicit ToolbarView(Browser* browser); ~ToolbarView() override; // Create the contents of the Browser Toolbar. void Init(); // Forces the toolbar (and transitively the location bar) to update its // current state. If |tab| is non-NULL, we're switching (back?) to this tab // and should restore any previous location bar state (such as user editing) // as well. void Update(content::WebContents* tab); // Clears the current state for |tab|. void ResetTabState(content::WebContents* tab); // Set focus to the toolbar with complete keyboard access, with the // focus initially set to the app menu. Focus will be restored // to the last focused view if the user escapes. void SetPaneFocusAndFocusAppMenu(); // Returns true if the app menu is focused. bool IsAppMenuFocused(); virtual bool GetAcceleratorInfo(int id, ui::Accelerator* accel); // Returns the view to which the bookmark bubble should be anchored. views::View* GetBookmarkBubbleAnchor(); // Returns the view to which the "Save credit card" bubble should be anchored. views::View* GetSaveCreditCardBubbleAnchor(); // Returns the view to which the Translate bubble should be anchored. views::View* GetTranslateBubbleAnchor(); // Adds |anchor_view| as an observer of |bubble_widget| to track its // visibility. void OnBubbleCreatedForAnchor(views::View* anchor_view, views::Widget* bubble_widget); // Returns the maximum width the browser actions container can have. int GetMaxBrowserActionsWidth() const; // Accessors. Browser* browser() const { return browser_; } BrowserActionsContainer* browser_actions() const { return browser_actions_; } ReloadButton* reload_button() const { return reload_; } LocationBarView* location_bar() const { return location_bar_; } AppMenuButton* app_menu_button() const { return app_menu_button_; } HomeButton* home_button() const { return home_; } AppMenuBadgeController* app_menu_badge_controller() { return &badge_controller_; } // AccessiblePaneView: bool SetPaneFocus(View* initial_focus) override; void GetAccessibleState(ui::AXViewState* state) override; // views::MenuButtonListener: void OnMenuButtonClicked(views::MenuButton* source, const gfx::Point& point, const ui::Event* event) override; // LocationBarView::Delegate: content::WebContents* GetWebContents() override; ToolbarModel* GetToolbarModel() override; const ToolbarModel* GetToolbarModel() const override; views::Widget* CreateViewsBubble( views::BubbleDelegateView* bubble_delegate) override; PageActionImageView* CreatePageActionImageView( LocationBarView* owner, ExtensionAction* action) override; ContentSettingBubbleModelDelegate* GetContentSettingBubbleModelDelegate() override; void ShowWebsiteSettings( content::WebContents* web_contents, const GURL& url, const security_state::SecurityStateModel::SecurityInfo& security_info) override; // CommandObserver: void EnabledStateChangedForCommand(int id, bool enabled) override; // views::ButtonListener: void ButtonPressed(views::Button* sender, const ui::Event& event) override; // content::NotificationObserver: void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) override; // ui::AcceleratorProvider: bool GetAcceleratorForCommandId(int command_id, ui::Accelerator* accelerator) override; // views::View: gfx::Size GetPreferredSize() const override; gfx::Size GetMinimumSize() const override; void Layout() override; void OnThemeChanged() override; const char* GetClassName() const override; bool AcceleratorPressed(const ui::Accelerator& acc) override; protected: // AccessiblePaneView: bool SetPaneFocusAndFocusDefault() override; void RemovePaneFocus() override; private: // Types of display mode this toolbar can have. enum DisplayMode { DISPLAYMODE_NORMAL, // Normal toolbar with buttons, etc. DISPLAYMODE_LOCATION // Slimline toolbar showing only compact location // bar, used for popups. }; // views::ViewTargeterDelegate: bool DoesIntersectRect(const views::View* target, const gfx::Rect& rect) const override; // AppMenuBadgeController::Delegate: void UpdateBadgeSeverity(AppMenuBadgeController::BadgeType type, AppMenuIconPainter::Severity severity, bool animate) override; // Used to avoid duplicating the near-identical logic of // ToolbarView::GetPreferredSize() and ToolbarView::GetMinimumSize(). These // two functions call through to GetSizeInternal(), passing themselves as the // function pointer |View::*get_size|. gfx::Size GetSizeInternal(gfx::Size (View::*get_size)() const) const; // Given toolbar contents of size |size|, returns the total toolbar size. gfx::Size SizeForContentSize(gfx::Size size) const; // Loads the images for all the child views. void LoadImages(); bool is_display_mode_normal() const { return display_mode_ == DISPLAYMODE_NORMAL; } // Shows the critical notification bubble against the app menu. void ShowCriticalNotification(); // Shows the outdated install notification bubble against the app menu. // |auto_update_enabled| is set to true when auto-upate is on. void ShowOutdatedInstallNotification(bool auto_update_enabled); void OnShowHomeButtonChanged(); int content_shadow_height() const; // Controls. Most of these can be null, e.g. in popup windows. Only // |location_bar_| is guaranteed to exist. BackButton* back_; ToolbarButton* forward_; ReloadButton* reload_; HomeButton* home_; LocationBarView* location_bar_; BrowserActionsContainer* browser_actions_; AppMenuButton* app_menu_button_; Browser* browser_; AppMenuBadgeController badge_controller_; // Controls whether or not a home button should be shown on the toolbar. BooleanPrefMember show_home_button_; // The display mode used when laying out the toolbar. const DisplayMode display_mode_; content::NotificationRegistrar registrar_; DISALLOW_IMPLICIT_CONSTRUCTORS(ToolbarView); }; #endif // CHROME_BROWSER_UI_VIEWS_TOOLBAR_TOOLBAR_VIEW_H_