15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/status_icons/status_icon_menu_model.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop/message_loop.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct StatusIconMenuModel::ItemState {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ItemState()
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : checked(false),
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enabled(true),
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        visible(true),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_dynamic(false) {}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool checked;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enabled;
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool visible;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_dynamic;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Accelerator accelerator;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::string16 label;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::string16 sublabel;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image icon;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28////////////////////////////////////////////////////////////////////////////////
29// StatusIconMenuModel::Delegate, public:
30
31void StatusIconMenuModel::Delegate::CommandIdHighlighted(int command_id) {
32}
33
34////////////////////////////////////////////////////////////////////////////////
35// StatusIconMenuModel, public:
36
37StatusIconMenuModel::StatusIconMenuModel(Delegate* delegate)
38    : ui::SimpleMenuModel(this), delegate_(delegate) {
39}
40
41StatusIconMenuModel::~StatusIconMenuModel() {
42}
43
44void StatusIconMenuModel::SetCommandIdChecked(int command_id, bool checked) {
45  item_states_[command_id].checked = checked;
46  NotifyMenuStateChanged();
47}
48
49void StatusIconMenuModel::SetCommandIdEnabled(int command_id, bool enabled) {
50  item_states_[command_id].enabled = enabled;
51  NotifyMenuStateChanged();
52}
53
54void StatusIconMenuModel::SetCommandIdVisible(int command_id, bool visible) {
55  item_states_[command_id].visible = visible;
56  NotifyMenuStateChanged();
57}
58
59void StatusIconMenuModel::SetAcceleratorForCommandId(
60    int command_id, const ui::Accelerator* accelerator) {
61  item_states_[command_id].accelerator = *accelerator;
62  NotifyMenuStateChanged();
63}
64
65void StatusIconMenuModel::ChangeLabelForCommandId(int command_id,
66                                                  const base::string16& label) {
67  item_states_[command_id].is_dynamic = true;
68  item_states_[command_id].label = label;
69  NotifyMenuStateChanged();
70}
71
72void StatusIconMenuModel::ChangeSublabelForCommandId(
73    int command_id, const base::string16& sublabel) {
74  item_states_[command_id].is_dynamic = true;
75  item_states_[command_id].sublabel = sublabel;
76  NotifyMenuStateChanged();
77}
78
79void StatusIconMenuModel::ChangeIconForCommandId(
80    int command_id, const gfx::Image& icon) {
81  item_states_[command_id].is_dynamic = true;
82  item_states_[command_id].icon = icon;
83  NotifyMenuStateChanged();
84}
85
86void StatusIconMenuModel::AddObserver(Observer* observer) {
87  observer_list_.AddObserver(observer);
88}
89
90void StatusIconMenuModel::RemoveObserver(Observer* observer) {
91  observer_list_.RemoveObserver(observer);
92}
93
94bool StatusIconMenuModel::IsCommandIdChecked(int command_id) const {
95  ItemStateMap::const_iterator iter = item_states_.find(command_id);
96  if (iter != item_states_.end())
97    return iter->second.checked;
98  return false;
99}
100
101bool StatusIconMenuModel::IsCommandIdEnabled(int command_id) const {
102  ItemStateMap::const_iterator iter = item_states_.find(command_id);
103  if (iter != item_states_.end())
104    return iter->second.enabled;
105  return true;
106}
107
108bool StatusIconMenuModel::IsCommandIdVisible(int command_id) const {
109  ItemStateMap::const_iterator iter = item_states_.find(command_id);
110  if (iter != item_states_.end())
111    return iter->second.visible;
112  return true;
113}
114
115bool StatusIconMenuModel::GetAcceleratorForCommandId(
116    int command_id, ui::Accelerator* accelerator) {
117  ItemStateMap::const_iterator iter = item_states_.find(command_id);
118  if (iter != item_states_.end() &&
119      iter->second.accelerator.key_code() != ui::VKEY_UNKNOWN) {
120    *accelerator = iter->second.accelerator;
121    return true;
122  }
123  return false;
124}
125
126bool StatusIconMenuModel::IsItemForCommandIdDynamic(int command_id) const {
127  ItemStateMap::const_iterator iter = item_states_.find(command_id);
128  if (iter != item_states_.end())
129    return iter->second.is_dynamic;
130  return false;
131}
132
133base::string16 StatusIconMenuModel::GetLabelForCommandId(int command_id) const {
134  ItemStateMap::const_iterator iter = item_states_.find(command_id);
135  if (iter != item_states_.end())
136    return iter->second.label;
137  return base::string16();
138}
139
140base::string16 StatusIconMenuModel::GetSublabelForCommandId(
141    int command_id) const {
142  ItemStateMap::const_iterator iter = item_states_.find(command_id);
143  if (iter != item_states_.end())
144    return iter->second.sublabel;
145  return base::string16();
146}
147
148bool StatusIconMenuModel::GetIconForCommandId(int command_id,
149                                              gfx::Image* image_skia) const {
150  ItemStateMap::const_iterator iter = item_states_.find(command_id);
151  if (iter != item_states_.end() && !iter->second.icon.IsEmpty()) {
152    *image_skia = iter->second.icon;
153    return true;
154  }
155  return false;
156}
157
158////////////////////////////////////////////////////////////////////////////////
159// StatusIconMenuModel, protected:
160
161void StatusIconMenuModel::MenuItemsChanged() {
162  NotifyMenuStateChanged();
163}
164
165void StatusIconMenuModel::NotifyMenuStateChanged() {
166  FOR_EACH_OBSERVER(Observer, observer_list_, OnMenuStateChanged());
167}
168
169////////////////////////////////////////////////////////////////////////////////
170// StatusIconMenuModel, private:
171
172void StatusIconMenuModel::CommandIdHighlighted(int command_id) {
173  if (delegate_)
174    delegate_->CommandIdHighlighted(command_id);
175}
176
177void StatusIconMenuModel::ExecuteCommand(int command_id, int event_flags) {
178  if (delegate_)
179    delegate_->ExecuteCommand(command_id, event_flags);
180}
181