// 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_FRAME_INFOBARS_INFOBAR_MANAGER_H_
#define CHROME_FRAME_INFOBARS_INFOBAR_MANAGER_H_

#include <windows.h>

class InfobarContent;

enum InfobarType {
  FIRST_INFOBAR_TYPE = 0,
  TOP_INFOBAR = 0,          // Infobar at the top.
  BOTTOM_INFOBAR = 1,       // Infobar at the bottom.
  END_OF_INFOBAR_TYPE = 2
};

// Creates and manages infobars at the top or bottom of an IE content window.
// Instances must only be retrieved and used within the UI thread of the IE
// content window.
class InfobarManager {
 public:
  // Returns an InfobarManager for the specified IE tab window. Caller does not
  // own the pointer (resources will be freed when the window is destroyed).
  //
  // The pointer may be invalidated by further processing of window events, and
  // as such should be immediately discarded after use.
  //
  // Returns NULL in case of failure.
  static InfobarManager* Get(HWND tab_window);

  virtual ~InfobarManager();

  // Shows the supplied content in an infobar of the specified type.
  // Normally, InfobarContent::InstallInFrame will be called with an interface
  // the content may use to interact with the Infobar facility.
  //
  // InfobarContent is deleted when the Infobar facility is finished with the
  // content (either through failure or when successfully hidden).
  virtual bool Show(InfobarContent* content, InfobarType type) = 0;

  // Hides the infobar of the specified type.
  virtual void Hide(InfobarType type) = 0;

  // Hides all infobars.
  virtual void HideAll() = 0;
};  // class InfobarManager

#endif  // CHROME_FRAME_INFOBARS_INFOBAR_MANAGER_H_