diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-21 22:27:24 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-21 22:27:24 +0000 |
commit | 616ed5a653d4bc13b4633d7c7b85d2f0c73bfd72 (patch) | |
tree | 04b8cd92d18cd6e1ff54e46c6c32b0d70391a831 /chrome/browser/views/infobars/infobar_container.cc | |
parent | c7eeed7fa25e06ec3d0367a74d2b43671958c5d3 (diff) | |
download | chromium_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.cc | 131 |
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(); +} |