// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_COMMAND_UPDATER_H_ #define CHROME_BROWSER_COMMAND_UPDATER_H_ #pragma once #include "base/basictypes.h" #include "base/hash_tables.h" //////////////////////////////////////////////////////////////////////////////// // // CommandUpdater class // // This object manages the enabled state of a set of commands. Observers // register to listen to changes in this state so they can update their // presentation. // class CommandUpdater { public: // A Delegate object implements this interface so that it can execute commands // when needed. class CommandUpdaterDelegate { public: // Perform the action associated with the command with the specified ID. virtual void ExecuteCommand(int id) = 0; protected: virtual ~CommandUpdaterDelegate(); }; // Create a CommandUpdater with a CommandUpdaterDelegate to handle execution // of specific commands. explicit CommandUpdater(CommandUpdaterDelegate* handler); virtual ~CommandUpdater(); // Returns true if the specified command ID is supported. bool SupportsCommand(int id) const; // Returns true if the specified command ID is enabled. The command ID must be // supported by this updater. bool IsCommandEnabled(int id) const; // Performs the action associated with this command ID. // TODO(beng): get rid of this since it's effectively just a pass-thru and the // call sites would be better off using more well defined delegate interfaces. void ExecuteCommand(int id); // An Observer interface implemented by objects that want to be informed when // the state of a particular command ID is modified. class CommandObserver { public: // Notifies the observer that the enabled state has changed for the // specified command id. virtual void EnabledStateChangedForCommand(int id, bool enabled) = 0; protected: virtual ~CommandObserver(); }; // Adds an observer to the state of a particular command. If the command does // not exist, it is created, initialized to false. void AddCommandObserver(int id, CommandObserver* observer); // Removes an observer to the state of a particular command. void RemoveCommandObserver(int id, CommandObserver* observer); // Removes |observer| for all commands on which it's registered. void RemoveCommandObserver(CommandObserver* observer); // Notify all observers of a particular command that the command has been // enabled or disabled. If the command does not exist, it is created and // initialized to |state|. This function is very lightweight if the command // state has not changed. void UpdateCommandEnabled(int id, bool state); private: // A piece of data about a command - whether or not it is enabled, and a list // of objects that observe the enabled state of this command. class Command; // Get a Command node for a given command ID, creating an entry if it doesn't // exist if desired. Command* GetCommand(int id, bool create); // The delegate is responsible for executing commands. CommandUpdaterDelegate* delegate_; // This is a map of command IDs to states and observer lists typedef base::hash_map CommandMap; CommandMap commands_; CommandUpdater(); DISALLOW_COPY_AND_ASSIGN(CommandUpdater); }; #endif // CHROME_BROWSER_COMMAND_UPDATER_H_