1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_VIEWS_TOOLBAR_VIEW_H_
6#define CHROME_BROWSER_UI_VIEWS_TOOLBAR_VIEW_H_
7#pragma once
8
9#include <vector>
10
11#include "base/memory/ref_counted.h"
12#include "base/memory/scoped_ptr.h"
13#include "chrome/browser/command_updater.h"
14#include "chrome/browser/prefs/pref_member.h"
15#include "chrome/browser/ui/toolbar/back_forward_menu_model.h"
16#include "chrome/browser/ui/views/accessible_pane_view.h"
17#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
18#include "chrome/browser/ui/views/reload_button.h"
19#include "ui/base/animation/slide_animation.h"
20#include "ui/base/models/accelerator.h"
21#include "views/controls/button/menu_button.h"
22#include "views/controls/menu/menu.h"
23#include "views/controls/menu/menu_wrapper.h"
24#include "views/controls/menu/view_menu_delegate.h"
25#include "views/view.h"
26
27class BrowserActionsContainer;
28class Browser;
29class Profile;
30#if defined(OS_CHROMEOS)
31namespace views {
32class Menu2;
33}  // namespace views
34#endif
35class WrenchMenu;
36
37// The Browser Window's toolbar.
38class ToolbarView : public AccessiblePaneView,
39                    public views::ViewMenuDelegate,
40                    public ui::AcceleratorProvider,
41                    public LocationBarView::Delegate,
42                    public NotificationObserver,
43                    public CommandUpdater::CommandObserver,
44                    public views::ButtonListener {
45 public:
46  explicit ToolbarView(Browser* browser);
47  virtual ~ToolbarView();
48
49  // Create the contents of the Browser Toolbar
50  void Init(Profile* profile);
51
52  // Sets the profile which is active on the currently-active tab.
53  void SetProfile(Profile* profile);
54  Profile* profile() { return profile_; }
55
56  // Updates the toolbar (and transitively the location bar) with the states of
57  // the specified |tab|.  If |should_restore_state| is true, we're switching
58  // (back?) to this tab and should restore any previous location bar state
59  // (such as user editing) as well.
60  void Update(TabContents* tab, bool should_restore_state);
61
62  // Set focus to the toolbar with complete keyboard access, with the
63  // focus initially set to the location bar. Focus will be restored
64  // to the ViewStorage with id |view_storage_id| if the user escapes.
65  void SetPaneFocusAndFocusLocationBar(int view_storage_id);
66
67  // Set focus to the toolbar with complete keyboard access, with the
68  // focus initially set to the app menu. Focus will be restored
69  // to the ViewStorage with id |view_storage_id| if the user escapes.
70  void SetPaneFocusAndFocusAppMenu(int view_storage_id);
71
72  // Returns true if the app menu is focused.
73  bool IsAppMenuFocused();
74
75  // Add a listener to receive a callback when the menu opens.
76  void AddMenuListener(views::MenuListener* listener);
77
78  // Remove a menu listener.
79  void RemoveMenuListener(views::MenuListener* listener);
80
81  virtual bool GetAcceleratorInfo(int id, ui::Accelerator* accel);
82
83  // Accessors...
84  Browser* browser() const { return browser_; }
85  BrowserActionsContainer* browser_actions() const { return browser_actions_; }
86  ReloadButton* reload_button() const { return reload_; }
87  LocationBarView* location_bar() const { return location_bar_; }
88  views::MenuButton* app_menu() const { return app_menu_; }
89
90  // Overridden from AccessiblePaneView
91  virtual bool SetPaneFocus(int view_storage_id, View* initial_focus) OVERRIDE;
92  virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
93
94  // Overridden from views::MenuDelegate:
95  virtual void RunMenu(views::View* source, const gfx::Point& pt) OVERRIDE;
96
97  // Overridden from LocationBarView::Delegate:
98  virtual TabContentsWrapper* GetTabContentsWrapper() const OVERRIDE;
99  virtual InstantController* GetInstant() OVERRIDE;
100  virtual void OnInputInProgress(bool in_progress) OVERRIDE;
101
102  // Overridden from CommandUpdater::CommandObserver:
103  virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE;
104
105  // Overridden from views::BaseButton::ButtonListener:
106  virtual void ButtonPressed(views::Button* sender, const views::Event& event)
107      OVERRIDE;
108
109  // Overridden from NotificationObserver:
110  virtual void Observe(NotificationType type,
111                       const NotificationSource& source,
112                       const NotificationDetails& details) OVERRIDE;
113
114  // Overridden from ui::AcceleratorProvider:
115  virtual bool GetAcceleratorForCommandId(
116      int command_id, ui::Accelerator* accelerator) OVERRIDE;
117
118  // Overridden from views::View:
119  virtual gfx::Size GetPreferredSize() OVERRIDE;
120  virtual void Layout() OVERRIDE;
121  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
122  virtual bool GetDropFormats(
123      int* formats,
124      std::set<OSExchangeData::CustomFormat>* custom_formats) OVERRIDE;
125  virtual bool CanDrop(const ui::OSExchangeData& data) OVERRIDE;
126  virtual int OnDragUpdated(const views::DropTargetEvent& event) OVERRIDE;
127  virtual int OnPerformDrop(const views::DropTargetEvent& event) OVERRIDE;
128  virtual void OnThemeChanged() OVERRIDE;
129
130  // The apparent horizontal space between most items, and the vertical padding
131  // above and below them.
132  static const int kStandardSpacing;
133  // The top of the toolbar has an edge we have to skip over in addition to the
134  // standard spacing.
135  static const int kVertSpacing;
136
137 protected:
138
139  // Overridden from AccessiblePaneView
140  virtual views::View* GetDefaultFocusableChild() OVERRIDE;
141  virtual void RemovePaneFocus() OVERRIDE;
142
143 private:
144  // Returns true if we should show the upgrade recommended dot.
145  bool IsUpgradeRecommended();
146
147  // Retrieve which badge we should show when recommending an upgrade.
148  int GetUpgradeRecommendedBadge() const;
149
150  // Returns true if we should show the background page badge.
151  bool ShouldShowBackgroundPageBadge();
152
153  // Returns true if we should show the warning for incompatible software.
154  bool ShouldShowIncompatibilityWarning();
155
156  // Returns the number of pixels above the location bar in non-normal display.
157  int PopupTopSpacing() const;
158
159  // Loads the images for all the child views.
160  void LoadImages();
161
162  // Types of display mode this toolbar can have.
163  enum DisplayMode {
164    DISPLAYMODE_NORMAL,       // Normal toolbar with buttons, etc.
165    DISPLAYMODE_LOCATION      // Slimline toolbar showing only compact location
166                              // bar, used for popups.
167  };
168  bool IsDisplayModeNormal() const {
169    return display_mode_ == DISPLAYMODE_NORMAL;
170  }
171
172  // Updates the badge on the app menu (Wrench).
173  void UpdateAppMenuBadge();
174
175  // Gets a bitmap with the icon for the app menu and any overlaid notification
176  // badge.
177  SkBitmap GetAppMenuIcon(views::CustomButton::ButtonState state);
178
179  // Gets a badge for the wrench icon corresponding to the number of
180  // unacknowledged background pages in the system.
181  SkBitmap GetBackgroundPageBadge();
182
183  scoped_ptr<BackForwardMenuModel> back_menu_model_;
184  scoped_ptr<BackForwardMenuModel> forward_menu_model_;
185
186  // The model that contains the security level, text, icon to display...
187  ToolbarModel* model_;
188
189  // Controls
190  views::ImageButton* back_;
191  views::ImageButton* forward_;
192  ReloadButton* reload_;
193  views::ImageButton* home_;
194  LocationBarView* location_bar_;
195  BrowserActionsContainer* browser_actions_;
196  views::MenuButton* app_menu_;
197  Profile* profile_;
198  Browser* browser_;
199
200  // Contents of the profiles menu to populate with profile names.
201  scoped_ptr<ui::SimpleMenuModel> profiles_menu_contents_;
202
203  // Controls whether or not a home button should be shown on the toolbar.
204  BooleanPrefMember show_home_button_;
205
206  // The display mode used when laying out the toolbar.
207  DisplayMode display_mode_;
208
209  // The contents of the wrench menu.
210  scoped_ptr<ui::SimpleMenuModel> wrench_menu_model_;
211
212#if defined(OS_CHROMEOS)
213  // Wrench menu using WebUI menu.
214  // MenuLister is managed by Menu2.
215  scoped_ptr<views::Menu2> wrench_menu_2_;
216#endif
217
218  // Wrench menu.
219  scoped_refptr<WrenchMenu> wrench_menu_;
220
221  // Vector of listeners to receive callbacks when the menu opens.
222  std::vector<views::MenuListener*> menu_listeners_;
223
224  NotificationRegistrar registrar_;
225
226  // If non-null the destructor sets this to true. This is set to a non-null
227  // while the menu is showing and used to detect if the menu was deleted while
228  // running.
229  bool* destroyed_flag_;
230
231  DISALLOW_IMPLICIT_CONSTRUCTORS(ToolbarView);
232};
233
234#endif  // CHROME_BROWSER_UI_VIEWS_TOOLBAR_VIEW_H_
235