summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views/infobars/infobar_container.cc
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-21 22:27:24 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-21 22:27:24 +0000
commit616ed5a653d4bc13b4633d7c7b85d2f0c73bfd72 (patch)
tree04b8cd92d18cd6e1ff54e46c6c32b0d70391a831 /chrome/browser/views/infobars/infobar_container.cc
parentc7eeed7fa25e06ec3d0367a74d2b43671958c5d3 (diff)
downloadchromium_src-616ed5a653d4bc13b4633d7c7b85d2f0c73bfd72.zip
chromium_src-616ed5a653d4bc13b4633d7c7b85d2f0c73bfd72.tar.gz
chromium_src-616ed5a653d4bc13b4633d7c7b85d2f0c73bfd72.tar.bz2
Beginnings of a new InfoBar system.
This implements AlertInfoBar and InfoBarContainer. It also makes the crashed plugin/js oom infobars use this new system. Design Doc: http://dev.chromium.org/developers/design-documents/info-barshttp://crbug.com/4620 Review URL: http://codereview.chromium.org/11318 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@5856 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/views/infobars/infobar_container.cc')
-rw-r--r--chrome/browser/views/infobars/infobar_container.cc131
1 files changed, 131 insertions, 0 deletions
diff --git a/chrome/browser/views/infobars/infobar_container.cc b/chrome/browser/views/infobars/infobar_container.cc
new file mode 100644
index 0000000..2fe7a35
--- /dev/null
+++ b/chrome/browser/views/infobars/infobar_container.cc
@@ -0,0 +1,131 @@
+// Copyright (c) 2006-2008 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.
+
+#include "chrome/browser/views/infobars/infobar_container.h"
+
+#include "chrome/browser/infobar_delegate.h"
+#include "chrome/browser/tab_contents.h"
+#include "chrome/browser/views/frame/browser_view.h"
+#include "chrome/browser/views/infobars/infobars.h"
+#include "chrome/common/notification_types.h"
+
+// InfoBarContainer, public: ---------------------------------------------------
+
+InfoBarContainer::InfoBarContainer(BrowserView* browser_view)
+ : browser_view_(browser_view),
+ tab_contents_(NULL) {
+
+}
+
+InfoBarContainer::~InfoBarContainer() {
+ ChangeTabContents(NULL);
+}
+
+void InfoBarContainer::ChangeTabContents(TabContents* contents) {
+ if (tab_contents_) {
+ NotificationService::current()->RemoveObserver(
+ this, NOTIFY_TAB_CONTENTS_INFOBAR_ADDED,
+ Source<TabContents>(tab_contents_));
+ NotificationService::current()->RemoveObserver(
+ this, NOTIFY_TAB_CONTENTS_INFOBAR_REMOVED,
+ Source<TabContents>(tab_contents_));
+ }
+ tab_contents_ = contents;
+ if (tab_contents_) {
+ UpdateInfoBars();
+ NotificationService::current()->AddObserver(
+ this, NOTIFY_TAB_CONTENTS_INFOBAR_ADDED,
+ Source<TabContents>(tab_contents_));
+ NotificationService::current()->AddObserver(
+ this, NOTIFY_TAB_CONTENTS_INFOBAR_REMOVED,
+ Source<TabContents>(tab_contents_));
+ }
+}
+
+void InfoBarContainer::InfoBarAnimated(bool completed) {
+ browser_view_->SelectedTabToolbarSizeChanged(!completed);
+}
+
+void InfoBarContainer::RemoveDelegate(InfoBarDelegate* delegate) {
+ tab_contents_->RemoveInfoBar(delegate);
+}
+
+// InfoBarContainer, views::View overrides: ------------------------------------
+
+gfx::Size InfoBarContainer::GetPreferredSize() {
+ // We do not have a preferred width (we will expand to fit the available width
+ // of the BrowserView). Our preferred height is the sum of the preferred
+ // heights of the InfoBars contained within us.
+ int height = 0;
+ for (int i = 0; i < GetChildViewCount(); ++i)
+ height += GetChildViewAt(i)->GetPreferredSize().height();
+ return gfx::Size(0, height);
+}
+
+void InfoBarContainer::Layout() {
+ int top = 0;
+ for (int i = 0; i < GetChildViewCount(); ++i) {
+ views::View* child = GetChildViewAt(i);
+ gfx::Size ps = child->GetPreferredSize();
+ child->SetBounds(0, top, width(), ps.height());
+ top += ps.height();
+ }
+}
+
+void InfoBarContainer::ViewHierarchyChanged(bool is_add,
+ views::View* parent,
+ views::View* child) {
+ if (parent == this && child->GetParent() == this) {
+ // An InfoBar child was added or removed. Tell the BrowserView it needs to
+ // re-layout since our preferred size will have changed.
+ browser_view_->SelectedTabToolbarSizeChanged(false);
+ }
+}
+
+// InfoBarContainer, NotificationObserver implementation: ----------------------
+
+void InfoBarContainer::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ if (type == NOTIFY_TAB_CONTENTS_INFOBAR_ADDED) {
+ AddInfoBar(Details<InfoBarDelegate>(details).ptr());
+ } else if (type == NOTIFY_TAB_CONTENTS_INFOBAR_REMOVED) {
+ RemoveInfoBar(Details<InfoBarDelegate>(details).ptr());
+ } else {
+ NOTREACHED();
+ }
+}
+
+// InfoBarContainer, private: --------------------------------------------------
+
+void InfoBarContainer::UpdateInfoBars() {
+ // Clear out all the old child views.
+ RemoveAllChildViews(true);
+
+ for (size_t i = 0; i < tab_contents_->infobar_delegate_count(); ++i) {
+ InfoBarDelegate* delegate = tab_contents_->GetInfoBarDelegateAt(i);
+ InfoBar* infobar = delegate->CreateInfoBar();
+ infobar->set_container(this);
+ AddChildView(infobar);
+ infobar->Open();
+ }
+}
+
+void InfoBarContainer::AddInfoBar(InfoBarDelegate* delegate) {
+ InfoBar* infobar = delegate->CreateInfoBar();
+ infobar->set_container(this);
+ infobar->AnimateOpen();
+ AddChildView(infobar);
+}
+
+void InfoBarContainer::RemoveInfoBar(InfoBarDelegate* delegate) {
+ size_t index = 0;
+ for (; index < tab_contents_->infobar_delegate_count(); ++index) {
+ if (tab_contents_->GetInfoBarDelegateAt(index) == delegate)
+ break;
+ }
+
+ // The View will be removed once the Close animation completes.
+ static_cast<InfoBar*>(GetChildViewAt(index))->AnimateClose();
+}