// Copyright (c) 2011 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_SIDEBAR_SIDEBAR_CONTAINER_H_
#define CHROME_BROWSER_SIDEBAR_SIDEBAR_CONTAINER_H_

#include <string>

#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "base/string16.h"
#include "chrome/browser/extensions/image_loading_tracker.h"
#include "content/browser/tab_contents/tab_contents_delegate.h"

class BrowserWindow;
class Profile;
class RenderViewHost;
class SkBitmap;
class TabContents;

///////////////////////////////////////////////////////////////////////////////
// SidebarContainer
//
//  Stores one particular sidebar state: sidebar's content, its content id,
//  tab it is linked to, mini tab icon, title etc.
//
class SidebarContainer
    : public TabContentsDelegate,
      private ImageLoadingTracker::Observer {
 public:
  // Interface to implement to listen for sidebar update notification.
  class Delegate {
   public:
    Delegate() {}
    virtual ~Delegate() {}
    virtual void UpdateSidebar(SidebarContainer* host) = 0;
   private:
    DISALLOW_COPY_AND_ASSIGN(Delegate);
  };

  SidebarContainer(TabContents* tab,
                   const std::string& content_id,
                   Delegate* delegate);
  virtual ~SidebarContainer();

  // Called right before destroying this sidebar.
  // Does all the necessary cleanup.
  void SidebarClosing();

  // Sets default sidebar parameters, as specified in extension manifest.
  void LoadDefaults();

  // Returns sidebar's content id.
  const std::string& content_id() const { return content_id_; }

  // Returns TabContents sidebar is linked to.
  TabContents* tab_contents() const { return tab_; }

  // Returns sidebar's TabContents.
  TabContents* sidebar_contents() const { return sidebar_contents_.get(); }

  // Accessor for the badge text.
  const string16& badge_text() const { return badge_text_; }

  // Accessor for the icon.
  const SkBitmap& icon() const { return *icon_; }

  // Accessor for the title.
  const string16& title() const { return title_; }

  // Functions supporting chrome.experimental.sidebar API.

  // Notifies hosting window that this sidebar was expanded.
  void Show();

  // Notifies hosting window that this sidebar was expanded.
  void Expand();

  // Notifies hosting window that this sidebar was collapsed.
  void Collapse();

  // Navigates sidebar contents to the |url|.
  void Navigate(const GURL& url);

  // Changes sidebar's badge text.
  void SetBadgeText(const string16& badge_text);

  // Changes sidebar's icon.
  void SetIcon(const SkBitmap& bitmap);

  // Changes sidebar's title.
  void SetTitle(const string16& title);

 private:
  // Overridden from TabContentsDelegate.
  virtual void OpenURLFromTab(TabContents* source,
                              const GURL& url,
                              const GURL& referrer,
                              WindowOpenDisposition disposition,
                              PageTransition::Type transition) {}
  virtual void NavigationStateChanged(const TabContents* source,
                                      unsigned changed_flags) {}
  virtual void AddNewContents(TabContents* source,
                              TabContents* new_contents,
                              WindowOpenDisposition disposition,
                              const gfx::Rect& initial_pos,
                              bool user_gesture) {}
  virtual void ActivateContents(TabContents* contents) {}
  virtual void DeactivateContents(TabContents* contents) {}
  virtual void LoadingStateChanged(TabContents* source) {}
  virtual void CloseContents(TabContents* source) {}
  virtual void MoveContents(TabContents* source, const gfx::Rect& pos) {}
  virtual bool IsPopup(const TabContents* source) const;
  virtual void UpdateTargetURL(TabContents* source, const GURL& url) {}

  // Overridden from ImageLoadingTracker::Observer.
  virtual void OnImageLoaded(SkBitmap* image,
                             const ExtensionResource& resource,
                             int index);

  // Returns an extension this sidebar belongs to.
  const Extension* GetExtension() const;

  // Contents of the tab this sidebar is linked to.
  TabContents* tab_;

  // Sidebar's content id. There might be more than one sidebar liked to each
  // particular tab and they are identified by their unique content id.
  const std::string content_id_;

  // Sidebar update notification listener.
  Delegate* delegate_;

  // Sidebar contents.
  scoped_ptr<TabContents> sidebar_contents_;

  // Badge text displayed on the sidebar's mini tab.
  string16 badge_text_;

  // Icon displayed on the sidebar's mini tab.
  scoped_ptr<SkBitmap> icon_;

  // Sidebar's title, displayed as a tooltip for sidebar's mini tab.
  string16 title_;

  // On the first expand sidebar will be automatically navigated to the default
  // page (specified in the extension manifest), but only if the extension has
  // not explicitly navigated it yet. This variable is set to false on the first
  // sidebar navigation.
  bool navigate_to_default_page_on_expand_;
  // Since the default icon (specified in the extension manifest) is loaded
  // asynchronously, sidebar icon can already be set by the extension
  // by the time it's loaded. This variable tracks whether the loaded default
  // icon should be used or discarded.
  bool use_default_icon_;

  // Helper to load icons from extension asynchronously.
  scoped_ptr<ImageLoadingTracker> image_loading_tracker_;

  DISALLOW_COPY_AND_ASSIGN(SidebarContainer);
};

#endif  // CHROME_BROWSER_SIDEBAR_SIDEBAR_CONTAINER_H_