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