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