| // Copyright (c) 2011 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_VIEW_H_ |
| #define CHROME_BROWSER_UI_VIEWS_TOOLBAR_VIEW_H_ |
| #pragma once |
| |
| #include <vector> |
| |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "chrome/browser/command_updater.h" |
| #include "chrome/browser/prefs/pref_member.h" |
| #include "chrome/browser/ui/toolbar/back_forward_menu_model.h" |
| #include "chrome/browser/ui/views/accessible_pane_view.h" |
| #include "chrome/browser/ui/views/location_bar/location_bar_view.h" |
| #include "chrome/browser/ui/views/reload_button.h" |
| #include "ui/base/animation/slide_animation.h" |
| #include "ui/base/models/accelerator.h" |
| #include "views/controls/button/menu_button.h" |
| #include "views/controls/menu/menu.h" |
| #include "views/controls/menu/menu_wrapper.h" |
| #include "views/controls/menu/view_menu_delegate.h" |
| #include "views/view.h" |
| |
| class BrowserActionsContainer; |
| class Browser; |
| class Profile; |
| #if defined(OS_CHROMEOS) |
| namespace views { |
| class Menu2; |
| } // namespace views |
| #endif |
| class WrenchMenu; |
| |
| // The Browser Window's toolbar. |
| class ToolbarView : public AccessiblePaneView, |
| public views::ViewMenuDelegate, |
| public ui::AcceleratorProvider, |
| public LocationBarView::Delegate, |
| public NotificationObserver, |
| public CommandUpdater::CommandObserver, |
| public views::ButtonListener { |
| public: |
| explicit ToolbarView(Browser* browser); |
| virtual ~ToolbarView(); |
| |
| // Create the contents of the Browser Toolbar |
| void Init(Profile* profile); |
| |
| // Sets the profile which is active on the currently-active tab. |
| void SetProfile(Profile* profile); |
| Profile* profile() { return profile_; } |
| |
| // Updates the toolbar (and transitively the location bar) with the states of |
| // the specified |tab|. If |should_restore_state| is true, we're switching |
| // (back?) to this tab and should restore any previous location bar state |
| // (such as user editing) as well. |
| void Update(TabContents* tab, bool should_restore_state); |
| |
| // Set focus to the toolbar with complete keyboard access, with the |
| // focus initially set to the location bar. Focus will be restored |
| // to the ViewStorage with id |view_storage_id| if the user escapes. |
| void SetPaneFocusAndFocusLocationBar(int view_storage_id); |
| |
| // Set focus to the toolbar with complete keyboard access, with the |
| // focus initially set to the app menu. Focus will be restored |
| // to the ViewStorage with id |view_storage_id| if the user escapes. |
| void SetPaneFocusAndFocusAppMenu(int view_storage_id); |
| |
| // Returns true if the app menu is focused. |
| bool IsAppMenuFocused(); |
| |
| // Add a listener to receive a callback when the menu opens. |
| void AddMenuListener(views::MenuListener* listener); |
| |
| // Remove a menu listener. |
| void RemoveMenuListener(views::MenuListener* listener); |
| |
| virtual bool GetAcceleratorInfo(int id, ui::Accelerator* accel); |
| |
| // 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_; } |
| views::MenuButton* app_menu() const { return app_menu_; } |
| |
| // Overridden from AccessiblePaneView |
| virtual bool SetPaneFocus(int view_storage_id, View* initial_focus) OVERRIDE; |
| virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; |
| |
| // Overridden from views::MenuDelegate: |
| virtual void RunMenu(views::View* source, const gfx::Point& pt) OVERRIDE; |
| |
| // Overridden from LocationBarView::Delegate: |
| virtual TabContentsWrapper* GetTabContentsWrapper() const OVERRIDE; |
| virtual InstantController* GetInstant() OVERRIDE; |
| virtual void OnInputInProgress(bool in_progress) OVERRIDE; |
| |
| // Overridden from CommandUpdater::CommandObserver: |
| virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE; |
| |
| // Overridden from views::BaseButton::ButtonListener: |
| virtual void ButtonPressed(views::Button* sender, const views::Event& event) |
| OVERRIDE; |
| |
| // Overridden from NotificationObserver: |
| virtual void Observe(NotificationType type, |
| const NotificationSource& source, |
| const NotificationDetails& details) OVERRIDE; |
| |
| // Overridden from ui::AcceleratorProvider: |
| virtual bool GetAcceleratorForCommandId( |
| int command_id, ui::Accelerator* accelerator) OVERRIDE; |
| |
| // Overridden from views::View: |
| virtual gfx::Size GetPreferredSize() OVERRIDE; |
| virtual void Layout() OVERRIDE; |
| virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; |
| virtual bool GetDropFormats( |
| int* formats, |
| std::set<OSExchangeData::CustomFormat>* custom_formats) OVERRIDE; |
| virtual bool CanDrop(const ui::OSExchangeData& data) OVERRIDE; |
| virtual int OnDragUpdated(const views::DropTargetEvent& event) OVERRIDE; |
| virtual int OnPerformDrop(const views::DropTargetEvent& event) OVERRIDE; |
| virtual void OnThemeChanged() OVERRIDE; |
| |
| // The apparent horizontal space between most items, and the vertical padding |
| // above and below them. |
| static const int kStandardSpacing; |
| // The top of the toolbar has an edge we have to skip over in addition to the |
| // standard spacing. |
| static const int kVertSpacing; |
| |
| protected: |
| |
| // Overridden from AccessiblePaneView |
| virtual views::View* GetDefaultFocusableChild() OVERRIDE; |
| virtual void RemovePaneFocus() OVERRIDE; |
| |
| private: |
| // Returns true if we should show the upgrade recommended dot. |
| bool IsUpgradeRecommended(); |
| |
| // Retrieve which badge we should show when recommending an upgrade. |
| int GetUpgradeRecommendedBadge() const; |
| |
| // Returns true if we should show the background page badge. |
| bool ShouldShowBackgroundPageBadge(); |
| |
| // Returns true if we should show the warning for incompatible software. |
| bool ShouldShowIncompatibilityWarning(); |
| |
| // Returns the number of pixels above the location bar in non-normal display. |
| int PopupTopSpacing() const; |
| |
| // Loads the images for all the child views. |
| void LoadImages(); |
| |
| // 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. |
| }; |
| bool IsDisplayModeNormal() const { |
| return display_mode_ == DISPLAYMODE_NORMAL; |
| } |
| |
| // Updates the badge on the app menu (Wrench). |
| void UpdateAppMenuBadge(); |
| |
| // Gets a bitmap with the icon for the app menu and any overlaid notification |
| // badge. |
| SkBitmap GetAppMenuIcon(views::CustomButton::ButtonState state); |
| |
| // Gets a badge for the wrench icon corresponding to the number of |
| // unacknowledged background pages in the system. |
| SkBitmap GetBackgroundPageBadge(); |
| |
| scoped_ptr<BackForwardMenuModel> back_menu_model_; |
| scoped_ptr<BackForwardMenuModel> forward_menu_model_; |
| |
| // The model that contains the security level, text, icon to display... |
| ToolbarModel* model_; |
| |
| // Controls |
| views::ImageButton* back_; |
| views::ImageButton* forward_; |
| ReloadButton* reload_; |
| views::ImageButton* home_; |
| LocationBarView* location_bar_; |
| BrowserActionsContainer* browser_actions_; |
| views::MenuButton* app_menu_; |
| Profile* profile_; |
| Browser* browser_; |
| |
| // Contents of the profiles menu to populate with profile names. |
| scoped_ptr<ui::SimpleMenuModel> profiles_menu_contents_; |
| |
| // 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. |
| DisplayMode display_mode_; |
| |
| // The contents of the wrench menu. |
| scoped_ptr<ui::SimpleMenuModel> wrench_menu_model_; |
| |
| #if defined(OS_CHROMEOS) |
| // Wrench menu using WebUI menu. |
| // MenuLister is managed by Menu2. |
| scoped_ptr<views::Menu2> wrench_menu_2_; |
| #endif |
| |
| // Wrench menu. |
| scoped_refptr<WrenchMenu> wrench_menu_; |
| |
| // Vector of listeners to receive callbacks when the menu opens. |
| std::vector<views::MenuListener*> menu_listeners_; |
| |
| NotificationRegistrar registrar_; |
| |
| // If non-null the destructor sets this to true. This is set to a non-null |
| // while the menu is showing and used to detect if the menu was deleted while |
| // running. |
| bool* destroyed_flag_; |
| |
| DISALLOW_IMPLICIT_CONSTRUCTORS(ToolbarView); |
| }; |
| |
| #endif // CHROME_BROWSER_UI_VIEWS_TOOLBAR_VIEW_H_ |