1 // Copyright (c) 2006-2008 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/command_updater.h" 6 7 #include <algorithm> 8 9 #include "base/logging.h" 10 #include "base/observer_list.h" 11 #include "base/stl_util-inl.h" 12 13 CommandUpdater::CommandUpdaterDelegate::~CommandUpdaterDelegate() { 14 } 15 16 class CommandUpdater::Command { 17 public: 18 bool enabled; 19 ObserverList<CommandObserver> observers; 20 21 Command() : enabled(true) {} 22 }; 23 24 CommandUpdater::CommandUpdater(CommandUpdaterDelegate* handler) 25 : delegate_(handler) { 26 } 27 28 CommandUpdater::~CommandUpdater() { 29 STLDeleteContainerPairSecondPointers(commands_.begin(), commands_.end()); 30 } 31 32 bool CommandUpdater::IsCommandEnabled(int id) const { 33 const CommandMap::const_iterator command(commands_.find(id)); 34 if (command == commands_.end()) 35 return false; 36 return command->second->enabled; 37 } 38 39 bool CommandUpdater::SupportsCommand(int id) const { 40 return commands_.find(id) != commands_.end(); 41 } 42 43 void CommandUpdater::ExecuteCommand(int id) { 44 if (IsCommandEnabled(id)) 45 delegate_->ExecuteCommand(id); 46 } 47 48 CommandUpdater::CommandObserver::~CommandObserver() { 49 } 50 51 void CommandUpdater::UpdateCommandEnabled(int id, bool enabled) { 52 Command* command = GetCommand(id, true); 53 if (command->enabled == enabled) 54 return; // Nothing to do. 55 command->enabled = enabled; 56 FOR_EACH_OBSERVER(CommandObserver, command->observers, 57 EnabledStateChangedForCommand(id, enabled)); 58 } 59 60 CommandUpdater::Command* CommandUpdater::GetCommand(int id, bool create) { 61 bool supported = SupportsCommand(id); 62 if (supported) 63 return commands_[id]; 64 DCHECK(create); 65 Command* command = new Command; 66 commands_[id] = command; 67 return command; 68 } 69 70 void CommandUpdater::AddCommandObserver(int id, CommandObserver* observer) { 71 GetCommand(id, true)->observers.AddObserver(observer); 72 } 73 74 void CommandUpdater::RemoveCommandObserver(int id, CommandObserver* observer) { 75 GetCommand(id, false)->observers.RemoveObserver(observer); 76 } 77 78 void CommandUpdater::RemoveCommandObserver(CommandObserver* observer) { 79 for (CommandMap::const_iterator it = commands_.begin(); 80 it != commands_.end(); 81 ++it) { 82 Command* command = it->second; 83 if (command) 84 command->observers.RemoveObserver(observer); 85 } 86 } 87