// Copyright 2012 The Chromium Authors
// 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_

#include "base/time/time.h"
#include "ui/base/window_open_disposition.h"

class CommandObserver;

////////////////////////////////////////////////////////////////////////////////
//
// CommandUpdater interface
//
//   This is the public API to manage the enabled state of a set of commands.
//   Observers register to listen to changes in this state so they can update
//   their presentation.
//
//   The actual implementation of this is in CommandUpdaterImpl, this interface
//   exists purely so that classes using the actual CommandUpdaterImpl can
//   expose it through a safe public interface (as opposed to directly exposing
//   the private implementation details).
//
class CommandUpdater {
 public:
  virtual ~CommandUpdater() = default;

  // Returns true if the specified command ID is supported.
  virtual bool SupportsCommand(int id) const = 0;

  // Returns true if the specified command ID is enabled. The command ID must be
  // supported by this updater.
  virtual bool IsCommandEnabled(int id) const = 0;

  // Performs the action associated with this command ID using CURRENT_TAB
  // disposition.
  // Returns true if the command was executed (i.e. it is supported and is
  // enabled).
  virtual bool ExecuteCommand(int id, base::TimeTicks time_stamp) = 0;
  bool ExecuteCommand(int id) {
    return ExecuteCommand(id, base::TimeTicks::Now());
  }

  // Performs the action associated with this command ID using the given
  // disposition.
  // Returns true if the command was executed (i.e. it is supported and is
  // enabled).
  virtual bool ExecuteCommandWithDisposition(int id,
                                             WindowOpenDisposition disposition,
                                             base::TimeTicks time_stamp) = 0;
  bool ExecuteCommandWithDisposition(int id,
                                     WindowOpenDisposition disposition) {
    return ExecuteCommandWithDisposition(id, disposition,
                                         base::TimeTicks::Now());
  }

  // Adds an observer to the state of a particular command. If the command does
  // not exist, it is created, initialized to false.
  virtual void AddCommandObserver(int id, CommandObserver* observer) = 0;

  // Removes an observer to the state of a particular command.
  virtual void RemoveCommandObserver(int id, CommandObserver* observer) = 0;

  // Removes |observer| for all commands on which it's registered.
  virtual void RemoveCommandObserver(CommandObserver* observer) = 0;

  // 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.
  // Returns true if the update succeeded (it's possible that the browser is in
  // "locked-down" state where we prevent changes to the command state).
  virtual bool UpdateCommandEnabled(int id, bool state) = 0;
};

#endif  // CHROME_BROWSER_COMMAND_UPDATER_H_
