• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_TOOLBAR_WRENCH_MENU_MODEL_H_
6 #define CHROME_BROWSER_UI_TOOLBAR_WRENCH_MENU_MODEL_H_
7 #pragma once
8 
9 #include "base/memory/scoped_ptr.h"
10 #include "chrome/browser/tabs/tab_strip_model_observer.h"
11 #include "content/common/notification_observer.h"
12 #include "content/common/notification_registrar.h"
13 #include "ui/base/models/accelerator.h"
14 #include "ui/base/models/button_menu_item_model.h"
15 #include "ui/base/models/simple_menu_model.h"
16 
17 class Browser;
18 class TabStripModel;
19 
20 namespace {
21 class MockWrenchMenuModel;
22 }  // namespace
23 
24 // A menu model that builds the contents of an encoding menu.
25 class EncodingMenuModel : public ui::SimpleMenuModel,
26                           public ui::SimpleMenuModel::Delegate {
27  public:
28   explicit EncodingMenuModel(Browser* browser);
29   virtual ~EncodingMenuModel();
30 
31   // Overridden from ui::SimpleMenuModel::Delegate:
32   virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
33   virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
34   virtual bool GetAcceleratorForCommandId(
35       int command_id,
36       ui::Accelerator* accelerator) OVERRIDE;
37   virtual void ExecuteCommand(int command_id) OVERRIDE;
38 
39  private:
40   void Build();
41 
42   Browser* browser_;  // weak
43 
44   DISALLOW_COPY_AND_ASSIGN(EncodingMenuModel);
45 };
46 
47 // A menu model that builds the contents of the zoom menu.
48 class ZoomMenuModel : public ui::SimpleMenuModel {
49  public:
50   explicit ZoomMenuModel(ui::SimpleMenuModel::Delegate* delegate);
51   virtual ~ZoomMenuModel();
52 
53  private:
54   void Build();
55 
56   DISALLOW_COPY_AND_ASSIGN(ZoomMenuModel);
57 };
58 
59 class ToolsMenuModel : public ui::SimpleMenuModel {
60  public:
61   ToolsMenuModel(ui::SimpleMenuModel::Delegate* delegate, Browser* browser);
62   virtual ~ToolsMenuModel();
63 
64  private:
65   void Build(Browser* browser);
66 
67   scoped_ptr<EncodingMenuModel> encoding_menu_model_;
68 
69   DISALLOW_COPY_AND_ASSIGN(ToolsMenuModel);
70 };
71 
72 // A menu model that builds the contents of the wrench menu.
73 class WrenchMenuModel : public ui::SimpleMenuModel,
74                         public ui::SimpleMenuModel::Delegate,
75                         public ui::ButtonMenuItemModel::Delegate,
76                         public TabStripModelObserver,
77                         public NotificationObserver {
78  public:
79   WrenchMenuModel(ui::AcceleratorProvider* provider, Browser* browser);
80   virtual ~WrenchMenuModel();
81 
82   // Overridden for ButtonMenuItemModel::Delegate:
83   virtual bool DoesCommandIdDismissMenu(int command_id) const OVERRIDE;
84 
85   // Overridden for both ButtonMenuItemModel::Delegate and SimpleMenuModel:
86   virtual bool IsItemForCommandIdDynamic(int command_id) const OVERRIDE;
87   virtual string16 GetLabelForCommandId(int command_id) const OVERRIDE;
88   virtual bool GetIconForCommandId(int command_id,
89                                    SkBitmap* icon) const OVERRIDE;
90   virtual void ExecuteCommand(int command_id) OVERRIDE;
91   virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
92   virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
93   virtual bool IsCommandIdVisible(int command_id) const OVERRIDE;
94   virtual bool GetAcceleratorForCommandId(
95       int command_id,
96       ui::Accelerator* accelerator) OVERRIDE;
97 
98   // Overridden from TabStripModelObserver:
99   virtual void TabSelectedAt(TabContentsWrapper* old_contents,
100                              TabContentsWrapper* new_contents,
101                              int index,
102                              bool user_gesture) OVERRIDE;
103   virtual void TabReplacedAt(TabStripModel* tab_strip_model,
104                              TabContentsWrapper* old_contents,
105                              TabContentsWrapper* new_contents,
106                              int index) OVERRIDE;
107   virtual void TabStripModelDeleted() OVERRIDE;
108 
109   // Overridden from NotificationObserver:
110   virtual void Observe(NotificationType type,
111                        const NotificationSource& source,
112                        const NotificationDetails& details) OVERRIDE;
113 
114   // Getters.
browser()115   Browser* browser() const { return browser_; }
116 
117   // Calculates |zoom_label_| in response to a zoom change.
118   void UpdateZoomControls();
119 
120  private:
121   // Testing constructor used for mocking.
122   friend class ::MockWrenchMenuModel;
123   WrenchMenuModel();
124 
125   void Build();
126 
127   // Adds custom items to the menu. Deprecated in favor of a cross platform
128   // model for button items.
129   void CreateCutCopyPaste();
130   void CreateZoomFullscreen();
131 
132   string16 GetSyncMenuLabel() const;
133 
134   // Models for the special menu items with buttons.
135   scoped_ptr<ui::ButtonMenuItemModel> edit_menu_item_model_;
136   scoped_ptr<ui::ButtonMenuItemModel> zoom_menu_item_model_;
137 
138   // Label of the zoom label in the zoom menu item.
139   string16 zoom_label_;
140 
141   // Tools menu.
142   scoped_ptr<ToolsMenuModel> tools_menu_model_;
143 
144   ui::AcceleratorProvider* provider_;  // weak
145 
146   Browser* browser_;  // weak
147   TabStripModel* tabstrip_model_; // weak
148 
149   NotificationRegistrar registrar_;
150 
151   DISALLOW_COPY_AND_ASSIGN(WrenchMenuModel);
152 };
153 
154 #endif  // CHROME_BROWSER_UI_TOOLBAR_WRENCH_MENU_MODEL_H_
155