1 // Copyright 2013 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 #include "chrome/browser/status_icons/status_icon_menu_model.h"
6
7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h"
9 #include "ui/base/accelerators/accelerator.h"
10 #include "ui/base/l10n/l10n_util.h"
11 #include "ui/gfx/image/image.h"
12
13 struct StatusIconMenuModel::ItemState {
ItemStateStatusIconMenuModel::ItemState14 ItemState()
15 : checked(false),
16 enabled(true),
17 visible(true),
18 is_dynamic(false) {}
19 bool checked;
20 bool enabled;
21 bool visible;
22 bool is_dynamic;
23 ui::Accelerator accelerator;
24 base::string16 label;
25 base::string16 sublabel;
26 gfx::Image icon;
27 };
28
29 ////////////////////////////////////////////////////////////////////////////////
30 // StatusIconMenuModel::Delegate, public:
31
CommandIdHighlighted(int command_id)32 void StatusIconMenuModel::Delegate::CommandIdHighlighted(int command_id) {
33 }
34
35 ////////////////////////////////////////////////////////////////////////////////
36 // StatusIconMenuModel, public:
37
StatusIconMenuModel(Delegate * delegate)38 StatusIconMenuModel::StatusIconMenuModel(Delegate* delegate)
39 : ui::SimpleMenuModel(this), delegate_(delegate) {
40 }
41
~StatusIconMenuModel()42 StatusIconMenuModel::~StatusIconMenuModel() {
43 }
44
SetCommandIdChecked(int command_id,bool checked)45 void StatusIconMenuModel::SetCommandIdChecked(int command_id, bool checked) {
46 item_states_[command_id].checked = checked;
47 NotifyMenuStateChanged();
48 }
49
SetCommandIdEnabled(int command_id,bool enabled)50 void StatusIconMenuModel::SetCommandIdEnabled(int command_id, bool enabled) {
51 item_states_[command_id].enabled = enabled;
52 NotifyMenuStateChanged();
53 }
54
SetCommandIdVisible(int command_id,bool visible)55 void StatusIconMenuModel::SetCommandIdVisible(int command_id, bool visible) {
56 item_states_[command_id].visible = visible;
57 NotifyMenuStateChanged();
58 }
59
SetAcceleratorForCommandId(int command_id,const ui::Accelerator * accelerator)60 void StatusIconMenuModel::SetAcceleratorForCommandId(
61 int command_id, const ui::Accelerator* accelerator) {
62 item_states_[command_id].accelerator = *accelerator;
63 NotifyMenuStateChanged();
64 }
65
ChangeLabelForCommandId(int command_id,const base::string16 & label)66 void StatusIconMenuModel::ChangeLabelForCommandId(int command_id,
67 const base::string16& label) {
68 item_states_[command_id].is_dynamic = true;
69 item_states_[command_id].label = label;
70 NotifyMenuStateChanged();
71 }
72
ChangeSublabelForCommandId(int command_id,const base::string16 & sublabel)73 void StatusIconMenuModel::ChangeSublabelForCommandId(
74 int command_id, const base::string16& sublabel) {
75 item_states_[command_id].is_dynamic = true;
76 item_states_[command_id].sublabel = sublabel;
77 NotifyMenuStateChanged();
78 }
79
ChangeIconForCommandId(int command_id,const gfx::Image & icon)80 void StatusIconMenuModel::ChangeIconForCommandId(
81 int command_id, const gfx::Image& icon) {
82 item_states_[command_id].is_dynamic = true;
83 item_states_[command_id].icon = icon;
84 NotifyMenuStateChanged();
85 }
86
AddObserver(Observer * observer)87 void StatusIconMenuModel::AddObserver(Observer* observer) {
88 observer_list_.AddObserver(observer);
89 }
90
RemoveObserver(Observer * observer)91 void StatusIconMenuModel::RemoveObserver(Observer* observer) {
92 observer_list_.RemoveObserver(observer);
93 }
94
IsCommandIdChecked(int command_id) const95 bool StatusIconMenuModel::IsCommandIdChecked(int command_id) const {
96 ItemStateMap::const_iterator iter = item_states_.find(command_id);
97 if (iter != item_states_.end())
98 return iter->second.checked;
99 return false;
100 }
101
IsCommandIdEnabled(int command_id) const102 bool StatusIconMenuModel::IsCommandIdEnabled(int command_id) const {
103 ItemStateMap::const_iterator iter = item_states_.find(command_id);
104 if (iter != item_states_.end())
105 return iter->second.enabled;
106 return true;
107 }
108
IsCommandIdVisible(int command_id) const109 bool StatusIconMenuModel::IsCommandIdVisible(int command_id) const {
110 ItemStateMap::const_iterator iter = item_states_.find(command_id);
111 if (iter != item_states_.end())
112 return iter->second.visible;
113 return true;
114 }
115
GetAcceleratorForCommandId(int command_id,ui::Accelerator * accelerator)116 bool StatusIconMenuModel::GetAcceleratorForCommandId(
117 int command_id, ui::Accelerator* accelerator) {
118 ItemStateMap::const_iterator iter = item_states_.find(command_id);
119 if (iter != item_states_.end() &&
120 iter->second.accelerator.key_code() != ui::VKEY_UNKNOWN) {
121 *accelerator = iter->second.accelerator;
122 return true;
123 }
124 return false;
125 }
126
IsItemForCommandIdDynamic(int command_id) const127 bool StatusIconMenuModel::IsItemForCommandIdDynamic(int command_id) const {
128 ItemStateMap::const_iterator iter = item_states_.find(command_id);
129 if (iter != item_states_.end())
130 return iter->second.is_dynamic;
131 return false;
132 }
133
GetLabelForCommandId(int command_id) const134 base::string16 StatusIconMenuModel::GetLabelForCommandId(int command_id) const {
135 ItemStateMap::const_iterator iter = item_states_.find(command_id);
136 if (iter != item_states_.end())
137 return iter->second.label;
138 return base::string16();
139 }
140
GetSublabelForCommandId(int command_id) const141 base::string16 StatusIconMenuModel::GetSublabelForCommandId(
142 int command_id) const {
143 ItemStateMap::const_iterator iter = item_states_.find(command_id);
144 if (iter != item_states_.end())
145 return iter->second.sublabel;
146 return base::string16();
147 }
148
GetIconForCommandId(int command_id,gfx::Image * image_skia) const149 bool StatusIconMenuModel::GetIconForCommandId(int command_id,
150 gfx::Image* image_skia) const {
151 ItemStateMap::const_iterator iter = item_states_.find(command_id);
152 if (iter != item_states_.end() && !iter->second.icon.IsEmpty()) {
153 *image_skia = iter->second.icon;
154 return true;
155 }
156 return false;
157 }
158
159 ////////////////////////////////////////////////////////////////////////////////
160 // StatusIconMenuModel, protected:
161
MenuItemsChanged()162 void StatusIconMenuModel::MenuItemsChanged() {
163 NotifyMenuStateChanged();
164 }
165
NotifyMenuStateChanged()166 void StatusIconMenuModel::NotifyMenuStateChanged() {
167 FOR_EACH_OBSERVER(Observer, observer_list_, OnMenuStateChanged());
168 }
169
170 ////////////////////////////////////////////////////////////////////////////////
171 // StatusIconMenuModel, private:
172
CommandIdHighlighted(int command_id)173 void StatusIconMenuModel::CommandIdHighlighted(int command_id) {
174 if (delegate_)
175 delegate_->CommandIdHighlighted(command_id);
176 }
177
ExecuteCommand(int command_id,int event_flags)178 void StatusIconMenuModel::ExecuteCommand(int command_id, int event_flags) {
179 if (delegate_)
180 delegate_->ExecuteCommand(command_id, event_flags);
181 }
182