• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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_TOOLBAR_WRENCH_MENU_MODEL_H_
6 #define CHROME_BROWSER_UI_TOOLBAR_WRENCH_MENU_MODEL_H_
7 
8 #include "base/files/file_path.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
11 #include "content/public/browser/host_zoom_map.h"
12 #include "content/public/browser/notification_observer.h"
13 #include "content/public/browser/notification_registrar.h"
14 #include "ui/base/accelerators/accelerator.h"
15 #include "ui/base/models/button_menu_item_model.h"
16 #include "ui/base/models/simple_menu_model.h"
17 
18 class BookmarkSubMenuModel;
19 class Browser;
20 class RecentTabsSubMenuModel;
21 class TabStripModel;
22 
23 namespace {
24 class MockWrenchMenuModel;
25 }  // namespace
26 
27 // A menu model that builds the contents of an encoding menu.
28 class EncodingMenuModel : public ui::SimpleMenuModel,
29                           public ui::SimpleMenuModel::Delegate {
30  public:
31   explicit EncodingMenuModel(Browser* browser);
32   virtual ~EncodingMenuModel();
33 
34   // Overridden from ui::SimpleMenuModel::Delegate:
35   virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
36   virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
37   virtual bool GetAcceleratorForCommandId(
38       int command_id,
39       ui::Accelerator* accelerator) OVERRIDE;
40   virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
41 
42  private:
43   void Build();
44 
45   Browser* browser_;  // weak
46 
47   DISALLOW_COPY_AND_ASSIGN(EncodingMenuModel);
48 };
49 
50 // A menu model that builds the contents of the zoom menu.
51 class ZoomMenuModel : public ui::SimpleMenuModel {
52  public:
53   explicit ZoomMenuModel(ui::SimpleMenuModel::Delegate* delegate);
54   virtual ~ZoomMenuModel();
55 
56  private:
57   void Build();
58 
59   DISALLOW_COPY_AND_ASSIGN(ZoomMenuModel);
60 };
61 
62 class ToolsMenuModel : public ui::SimpleMenuModel {
63  public:
64   ToolsMenuModel(ui::SimpleMenuModel::Delegate* delegate, Browser* browser);
65   virtual ~ToolsMenuModel();
66 
67  private:
68   void Build(Browser* browser);
69 
70   scoped_ptr<EncodingMenuModel> encoding_menu_model_;
71 
72   DISALLOW_COPY_AND_ASSIGN(ToolsMenuModel);
73 };
74 
75 // A menu model that builds the contents of the wrench menu.
76 class WrenchMenuModel : public ui::SimpleMenuModel,
77                         public ui::SimpleMenuModel::Delegate,
78                         public ui::ButtonMenuItemModel::Delegate,
79                         public TabStripModelObserver,
80                         public content::NotificationObserver {
81  public:
82   // Range of command ID's to use for the items representing bookmarks in the
83   // bookmark menu, must not overlap with that for recent tabs submenu.
84   static const int kMinBookmarkCommandId = 1;
85   static const int kMaxBookmarkCommandId = 1000;
86 
87   // Range of command ID's to use for the items in the recent tabs submenu, must
88   // not overlap with that for bookmarks.
89   static const int kMinRecentTabsCommandId = 1001;
90   static const int kMaxRecentTabsCommandId = 1200;
91 
92   // TODO: remove |is_new_menu|.
93   WrenchMenuModel(ui::AcceleratorProvider* provider,
94                   Browser* browser,
95                   bool is_new_menu);
96   virtual ~WrenchMenuModel();
97 
98   // Overridden for ButtonMenuItemModel::Delegate:
99   virtual bool DoesCommandIdDismissMenu(int command_id) const OVERRIDE;
100 
101   // Overridden for both ButtonMenuItemModel::Delegate and SimpleMenuModel:
102   virtual bool IsItemForCommandIdDynamic(int command_id) const OVERRIDE;
103   virtual base::string16 GetLabelForCommandId(int command_id) const OVERRIDE;
104   virtual bool GetIconForCommandId(int command_id,
105                                    gfx::Image* icon) const OVERRIDE;
106   virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
107   virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
108   virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
109   virtual bool IsCommandIdVisible(int command_id) const OVERRIDE;
110   virtual bool GetAcceleratorForCommandId(
111       int command_id,
112       ui::Accelerator* accelerator) OVERRIDE;
113 
114   // Overridden from TabStripModelObserver:
115   virtual void ActiveTabChanged(content::WebContents* old_contents,
116                                 content::WebContents* new_contents,
117                                 int index,
118                                 int reason) OVERRIDE;
119   virtual void TabReplacedAt(TabStripModel* tab_strip_model,
120                              content::WebContents* old_contents,
121                              content::WebContents* new_contents,
122                              int index) OVERRIDE;
123   virtual void TabStripModelDeleted() OVERRIDE;
124 
125   // Overridden from content::NotificationObserver:
126   virtual void Observe(int type,
127                        const content::NotificationSource& source,
128                        const content::NotificationDetails& details) OVERRIDE;
129 
130   // Getters.
browser()131   Browser* browser() const { return browser_; }
132 
bookmark_sub_menu_model()133   BookmarkSubMenuModel* bookmark_sub_menu_model() const {
134     return bookmark_sub_menu_model_.get();
135   }
136 
137   // Calculates |zoom_label_| in response to a zoom change.
138   void UpdateZoomControls();
139 
140  private:
141   class HelpMenuModel;
142   // Testing constructor used for mocking.
143   friend class ::MockWrenchMenuModel;
144 
145   WrenchMenuModel();
146 
147   void Build(bool is_new_menu);
148 
149   void AddGlobalErrorMenuItems();
150 
151   // Appends everything needed for the clipboard menu: a menu break, the
152   // clipboard menu content and the finalizing menu break. If the last break
153   // is not needed it can be suppressed by setting |new_menu|
154   // to false.
155   void CreateCutCopyPasteMenu(bool new_menu);
156 
157   // Appends everything needed for the zoom menu: a menu break, then the zoom
158   // menu content and then another menu break. If the new menu type is used,
159   // |new_menu| should be set to true.
160   void CreateZoomMenu(bool new_menu);
161 
162   void OnZoomLevelChanged(const content::HostZoomMap::ZoomLevelChange& change);
163 
164   bool ShouldShowNewIncognitoWindowMenuItem();
165 
166   // Models for the special menu items with buttons.
167   scoped_ptr<ui::ButtonMenuItemModel> edit_menu_item_model_;
168   scoped_ptr<ui::ButtonMenuItemModel> zoom_menu_item_model_;
169 
170   // Label of the zoom label in the zoom menu item.
171   base::string16 zoom_label_;
172 
173 #if defined(GOOGLE_CHROME_BUILD)
174   // Help menu.
175   scoped_ptr<HelpMenuModel> help_menu_model_;
176 #endif
177 
178   // Tools menu.
179   scoped_ptr<ToolsMenuModel> tools_menu_model_;
180 
181   // Bookmark submenu.
182   scoped_ptr<BookmarkSubMenuModel> bookmark_sub_menu_model_;
183 
184   // Recent Tabs submenu.
185   scoped_ptr<RecentTabsSubMenuModel> recent_tabs_sub_menu_model_;
186 
187   ui::AcceleratorProvider* provider_;  // weak
188 
189   Browser* browser_;  // weak
190   TabStripModel* tab_strip_model_; // weak
191 
192   scoped_ptr<content::HostZoomMap::Subscription> zoom_subscription_;
193   content::NotificationRegistrar registrar_;
194 
195   DISALLOW_COPY_AND_ASSIGN(WrenchMenuModel);
196 };
197 
198 #endif  // CHROME_BROWSER_UI_TOOLBAR_WRENCH_MENU_MODEL_H_
199