Index: chrome/browser/views/infobars/infobar_container.cc |
=================================================================== |
--- chrome/browser/views/infobars/infobar_container.cc (revision 0) |
+++ chrome/browser/views/infobars/infobar_container.cc (revision 0) |
@@ -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); |
+ infobar->Open(); |
+ AddChildView(infobar); |
+ } |
+} |
+ |
+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(); |
+} |
Property changes on: chrome\browser\views\infobars\infobar_container.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |