sidebar_container.h revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#ifndef CHROME_BROWSER_SIDEBAR_SIDEBAR_CONTAINER_H_
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define CHROME_BROWSER_SIDEBAR_SIDEBAR_CONTAINER_H_
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <string>
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/basictypes.h"
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/scoped_ptr.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string16.h"
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/tab_contents/tab_contents_delegate.h"
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass BrowserWindow;
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass Profile;
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass RenderViewHost;
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SkBitmap;
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TabContents;
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen///////////////////////////////////////////////////////////////////////////////
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// SidebarContainer
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//  Stores one particular sidebar state: sidebar's content, its content id,
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//  tab it is linked to, mini tab icon, title etc.
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SidebarContainer
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : public TabContentsDelegate {
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Interface to implement to listen for sidebar update notification.
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  class Delegate {
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   public:
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    Delegate() {}
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual ~Delegate() {}
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void UpdateSidebar(SidebarContainer* host) = 0;
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   private:
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    DISALLOW_COPY_AND_ASSIGN(Delegate);
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SidebarContainer(TabContents* tab, const std::string& content_id,
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   Delegate* delegate);
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~SidebarContainer();
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Called right before destroying this sidebar.
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Does all the necessary cleanup.
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void SidebarClosing();
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns sidebar's content id.
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string& content_id() const { return content_id_; }
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns TabContents sidebar is linked to.
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_contents() const { return tab_; }
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns sidebar's TabContents.
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* sidebar_contents() const { return sidebar_contents_.get(); }
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Accessor for the badge text.
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const string16& badge_text() const { return badge_text_; }
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Accessor for the icon.
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const SkBitmap& icon() const { return *icon_; }
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Accessor for the title.
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const string16& title() const { return title_; }
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Functions supporting chrome.experimental.sidebar API.
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Notifies hosting window that this sidebar was expanded.
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Show();
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Notifies hosting window that this sidebar was expanded.
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Expand();
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Notifies hosting window that this sidebar was collapsed.
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Collapse();
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Navigates sidebar contents to the |url|.
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Navigate(const GURL& url);
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Changes sidebar's badge text.
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void SetBadgeText(const string16& badge_text);
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Changes sidebar's icon.
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void SetIcon(const SkBitmap& bitmap);
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Changes sidebar's title.
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void SetTitle(const string16& title);
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Overridden from TabContentsDelegate.
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OpenURLFromTab(TabContents* source,
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                              const GURL& url,
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                              const GURL& referrer,
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                              WindowOpenDisposition disposition,
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                              PageTransition::Type transition) {}
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void NavigationStateChanged(const TabContents* source,
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                      unsigned changed_flags) {}
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void AddNewContents(TabContents* source,
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                              TabContents* new_contents,
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                              WindowOpenDisposition disposition,
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                              const gfx::Rect& initial_pos,
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                              bool user_gesture) {}
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void ActivateContents(TabContents* contents) {}
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void DeactivateContents(TabContents* contents) {}
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void LoadingStateChanged(TabContents* source) {}
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void CloseContents(TabContents* source) {}
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void MoveContents(TabContents* source, const gfx::Rect& pos) {}
10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual bool IsPopup(const TabContents* source) const;
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void URLStarredChanged(TabContents* source, bool starred) {}
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void UpdateTargetURL(TabContents* source, const GURL& url) {}
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void ToolbarSizeChanged(TabContents* source, bool is_animating) {}
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Contents of the tab this sidebar is linked to.
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_;
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Sidebar's content id. There might be more than one sidebar liked to each
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // particular tab and they are identified by their unique content id.
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string content_id_;
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Sidebar update notification listener.
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Delegate* delegate_;
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Sidebar contents.
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<TabContents> sidebar_contents_;
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Badge text displayed on the sidebar's mini tab.
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 badge_text_;
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Icon displayed on the sidebar's mini tab.
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_ptr<SkBitmap> icon_;
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Sidebar's title, displayed as a tooltip for sidebar's mini tab.
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 title_;
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(SidebarContainer);
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif  // CHROME_BROWSER_SIDEBAR_SIDEBAR_CONTAINER_H_
139