Home | History | Annotate | Download | only in browser
      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