// 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_