1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_CONTAINER_NATIVE_H_
6#define CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_CONTAINER_NATIVE_H_
7#pragma once
8
9#include "chrome/browser/ui/views/tab_contents/native_tab_contents_container.h"
10#include "content/common/notification_observer.h"
11#include "content/common/notification_registrar.h"
12#include "views/view.h"
13
14class NativeTabContentsContainer;
15class RenderViewHost;
16class RenderWidgetHostView;
17class TabContents;
18
19class TabContentsContainer : public views::View,
20                             public NotificationObserver {
21 public:
22  TabContentsContainer();
23  virtual ~TabContentsContainer();
24
25  // Changes the TabContents associated with this view.
26  void ChangeTabContents(TabContents* contents);
27
28  View* GetFocusView() { return native_container_->GetView(); }
29
30  // Accessor for |tab_contents_|.
31  TabContents* tab_contents() const { return tab_contents_; }
32
33  // Called by the BrowserView to notify that |tab_contents| got the focus.
34  void TabContentsFocused(TabContents* tab_contents);
35
36  // Tells the container to update less frequently during resizing operations
37  // so performance is better.
38  void SetFastResize(bool fast_resize);
39
40  // Updates the current reserved rect in view coordinates where contents
41  // should not be rendered to draw the resize corner, sidebar mini tabs etc.
42  void SetReservedContentsRect(const gfx::Rect& reserved_rect);
43
44  // Overridden from NotificationObserver:
45  virtual void Observe(NotificationType type,
46                       const NotificationSource& source,
47                       const NotificationDetails& details) OVERRIDE;
48
49  // Overridden from views::View:
50  virtual void Layout() OVERRIDE;
51  virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
52
53 protected:
54  // Overridden from views::View:
55  virtual void ViewHierarchyChanged(bool is_add, views::View* parent,
56                                    views::View* child) OVERRIDE;
57
58 private:
59  // Add or remove observers for events that we care about.
60  void AddObservers();
61  void RemoveObservers();
62
63  // Called when the RenderViewHost of the hosted TabContents has changed, e.g.
64  // to show an interstitial page.
65  void RenderViewHostChanged(RenderViewHost* old_host,
66                             RenderViewHost* new_host);
67
68  // Called when a TabContents is destroyed. This gives us a chance to clean
69  // up our internal state if the TabContents is somehow destroyed before we
70  // get notified.
71  void TabContentsDestroyed(TabContents* contents);
72
73  // Called when the RenderWidgetHostView of the hosted TabContents has changed.
74  void RenderWidgetHostViewChanged(RenderWidgetHostView* new_view);
75
76  // An instance of a NativeTabContentsContainer object that holds the native
77  // view handle associated with the attached TabContents.
78  NativeTabContentsContainer* native_container_;
79
80  // The attached TabContents.
81  TabContents* tab_contents_;
82
83  // Handles registering for our notifications.
84  NotificationRegistrar registrar_;
85
86  // The current reserved rect in view coordinates where contents should not be
87  // rendered to draw the resize corner, sidebar mini tabs etc.
88  // Cached here to update ever changing renderers.
89  gfx::Rect cached_reserved_rect_;
90
91  DISALLOW_COPY_AND_ASSIGN(TabContentsContainer);
92};
93
94#endif  // CHROME_BROWSER_UI_VIEWS_TAB_CONTENTS_TAB_CONTENTS_CONTAINER_NATIVE_H_
95