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 "ui/base/accelerators/accelerator.h"
9 #include "ui/gfx/image/image.h"
10
11 struct StatusIconMenuModel::ItemState {
ItemStateStatusIconMenuModel::ItemState12 ItemState()
13 : checked(false),
14 enabled(true),
15 visible(true),
16 is_dynamic(false) {}
17 bool checked;
18 bool enabled;
19 bool visible;
20 bool is_dynamic;
21 ui::Accelerator accelerator;
22 base::string16 label;
23 gfx::Image icon;
24 };
25
26 ////////////////////////////////////////////////////////////////////////////////
27 // StatusIconMenuModel, public:
28
StatusIconMenuModel(Delegate * delegate)29 StatusIconMenuModel::StatusIconMenuModel(Delegate* delegate)
30 : ui::SimpleMenuModel(this), delegate_(delegate) {
31 }
32
~StatusIconMenuModel()33 StatusIconMenuModel::~StatusIconMenuModel() {
34 }
35
SetCommandIdChecked(int command_id,bool checked)36 void StatusIconMenuModel::SetCommandIdChecked(int command_id, bool checked) {
37 item_states_[command_id].checked = checked;
38 NotifyMenuStateChanged();
39 }
40
SetCommandIdEnabled(int command_id,bool enabled)41 void StatusIconMenuModel::SetCommandIdEnabled(int command_id, bool enabled) {
42 item_states_[command_id].enabled = enabled;
43 NotifyMenuStateChanged();
44 }
45
SetCommandIdVisible(int command_id,bool visible)46 void StatusIconMenuModel::SetCommandIdVisible(int command_id, bool visible) {
47 item_states_[command_id].visible = visible;
48 NotifyMenuStateChanged();
49 }
50
SetAcceleratorForCommandId(int command_id,const ui::Accelerator * accelerator)51 void StatusIconMenuModel::SetAcceleratorForCommandId(
52 int command_id, const ui::Accelerator* accelerator) {
53 item_states_[command_id].accelerator = *accelerator;
54 NotifyMenuStateChanged();
55 }
56
ChangeLabelForCommandId(int command_id,const base::string16 & label)57 void StatusIconMenuModel::ChangeLabelForCommandId(int command_id,
58 const base::string16& label) {
59 item_states_[command_id].is_dynamic = true;
60 item_states_[command_id].label = label;
61 NotifyMenuStateChanged();
62 }
63
ChangeIconForCommandId(int command_id,const gfx::Image & icon)64 void StatusIconMenuModel::ChangeIconForCommandId(
65 int command_id, const gfx::Image& icon) {
66 item_states_[command_id].is_dynamic = true;
67 item_states_[command_id].icon = icon;
68 NotifyMenuStateChanged();
69 }
70
AddObserver(Observer * observer)71 void StatusIconMenuModel::AddObserver(Observer* observer) {
72 observer_list_.AddObserver(observer);
73 }
74
RemoveObserver(Observer * observer)75 void StatusIconMenuModel::RemoveObserver(Observer* observer) {
76 observer_list_.RemoveObserver(observer);
77 }
78
IsCommandIdChecked(int command_id) const79 bool StatusIconMenuModel::IsCommandIdChecked(int command_id) const {
80 auto iter = item_states_.find(command_id);
81 if (iter != item_states_.end())
82 return iter->second.checked;
83 return false;
84 }
85
IsCommandIdEnabled(int command_id) const86 bool StatusIconMenuModel::IsCommandIdEnabled(int command_id) const {
87 auto iter = item_states_.find(command_id);
88 if (iter != item_states_.end())
89 return iter->second.enabled;
90 return true;
91 }
92
IsCommandIdVisible(int command_id) const93 bool StatusIconMenuModel::IsCommandIdVisible(int command_id) const {
94 auto iter = item_states_.find(command_id);
95 if (iter != item_states_.end())
96 return iter->second.visible;
97 return true;
98 }
99
GetAcceleratorForCommandId(int command_id,ui::Accelerator * accelerator) const100 bool StatusIconMenuModel::GetAcceleratorForCommandId(
101 int command_id, ui::Accelerator* accelerator) const {
102 auto iter = item_states_.find(command_id);
103 if (iter != item_states_.end() &&
104 iter->second.accelerator.key_code() != ui::VKEY_UNKNOWN) {
105 *accelerator = iter->second.accelerator;
106 return true;
107 }
108 return false;
109 }
110
IsItemForCommandIdDynamic(int command_id) const111 bool StatusIconMenuModel::IsItemForCommandIdDynamic(int command_id) const {
112 auto iter = item_states_.find(command_id);
113 if (iter != item_states_.end())
114 return iter->second.is_dynamic;
115 return false;
116 }
117
GetLabelForCommandId(int command_id) const118 base::string16 StatusIconMenuModel::GetLabelForCommandId(int command_id) const {
119 auto iter = item_states_.find(command_id);
120 if (iter != item_states_.end())
121 return iter->second.label;
122 return base::string16();
123 }
124
GetIconForCommandId(int command_id) const125 ui::ImageModel StatusIconMenuModel::GetIconForCommandId(int command_id) const {
126 auto iter = item_states_.find(command_id);
127 if (iter != item_states_.end() && !iter->second.icon.IsEmpty())
128 return ui::ImageModel::FromImage(iter->second.icon);
129 return ui::ImageModel();
130 }
131
132 ////////////////////////////////////////////////////////////////////////////////
133 // StatusIconMenuModel, protected:
134
MenuItemsChanged()135 void StatusIconMenuModel::MenuItemsChanged() {
136 NotifyMenuStateChanged();
137 }
138
NotifyMenuStateChanged()139 void StatusIconMenuModel::NotifyMenuStateChanged() {
140 for (Observer& observer : observer_list_)
141 observer.OnMenuStateChanged();
142 }
143
144 ////////////////////////////////////////////////////////////////////////////////
145 // StatusIconMenuModel, private:
146
ExecuteCommand(int command_id,int event_flags)147 void StatusIconMenuModel::ExecuteCommand(int command_id, int event_flags) {
148 if (delegate_)
149 delegate_->ExecuteCommand(command_id, event_flags);
150 }
151