15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)#ifndef CHROME_BROWSER_COMMAND_UPDATER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_COMMAND_UPDATER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandObserver;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CommandUpdaterDelegate;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CommandUpdater class
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   This object manages the enabled state of a set of commands. Observers
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   register to listen to changes in this state so they can update their
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   presentation.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandUpdater {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a CommandUpdater with |delegate| to handle the execution of specific
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // commands.
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit CommandUpdater(CommandUpdaterDelegate* delegate);
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~CommandUpdater();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the specified command ID is supported.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SupportsCommand(int id) const;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the specified command ID is enabled. The command ID must be
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // supported by this updater.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsCommandEnabled(int id) const;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Performs the action associated with this command ID using CURRENT_TAB
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disposition.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the command was executed (i.e. it is supported and is
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // enabled).
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ExecuteCommand(int id);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Performs the action associated with this command ID using the given
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disposition.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the command was executed (i.e. it is supported and is
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // enabled).
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ExecuteCommandWithDisposition(int id, WindowOpenDisposition disposition);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds an observer to the state of a particular command. If the command does
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not exist, it is created, initialized to false.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddCommandObserver(int id, CommandObserver* observer);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes an observer to the state of a particular command.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveCommandObserver(int id, CommandObserver* observer);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes |observer| for all commands on which it's registered.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveCommandObserver(CommandObserver* observer);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify all observers of a particular command that the command has been
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // enabled or disabled. If the command does not exist, it is created and
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // initialized to |state|. This function is very lightweight if the command
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state has not changed.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateCommandEnabled(int id, bool state);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A piece of data about a command - whether or not it is enabled, and a list
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of objects that observe the enabled state of this command.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Command;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get a Command node for a given command ID, creating an entry if it doesn't
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exist if desired.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Command* GetCommand(int id, bool create);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The delegate is responsible for executing commands.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdaterDelegate* delegate_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a map of command IDs to states and observer lists
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::hash_map<int, Command*> CommandMap;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandMap commands_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CommandUpdater);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_COMMAND_UPDATER_H_
85