| Index: chrome/browser/gtk/infobar_container_gtk.cc
|
| ===================================================================
|
| --- chrome/browser/gtk/infobar_container_gtk.cc (revision 71352)
|
| +++ chrome/browser/gtk/infobar_container_gtk.cc (working copy)
|
| @@ -1,221 +0,0 @@
|
| -// Copyright (c) 2010 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/gtk/infobar_container_gtk.h"
|
| -
|
| -#include <gtk/gtk.h>
|
| -
|
| -#include <utility>
|
| -
|
| -#include "base/command_line.h"
|
| -#include "chrome/browser/browser_window.h"
|
| -#include "chrome/browser/gtk/browser_window_gtk.h"
|
| -#include "chrome/browser/gtk/gtk_theme_provider.h"
|
| -#include "chrome/browser/gtk/gtk_util.h"
|
| -#include "chrome/browser/gtk/infobar_gtk.h"
|
| -#include "chrome/browser/platform_util.h"
|
| -#include "chrome/browser/tab_contents/infobar_delegate.h"
|
| -#include "chrome/browser/tab_contents/tab_contents.h"
|
| -#include "chrome/common/notification_details.h"
|
| -#include "chrome/common/notification_source.h"
|
| -#include "third_party/skia/include/core/SkPaint.h"
|
| -
|
| -namespace {
|
| -
|
| -static const char* kInfoBar = "info-bar";
|
| -
|
| -// If |infobar_widget| matches |info_bar_delegate|, then close the infobar.
|
| -void AnimateClosingForDelegate(GtkWidget* infobar_widget,
|
| - gpointer info_bar_delegate) {
|
| - InfoBarDelegate* delegate =
|
| - static_cast<InfoBarDelegate*>(info_bar_delegate);
|
| - InfoBar* infobar = reinterpret_cast<InfoBar*>(
|
| - g_object_get_data(G_OBJECT(infobar_widget), kInfoBar));
|
| -
|
| - if (!infobar) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - if (delegate == infobar->delegate())
|
| - infobar->AnimateClose();
|
| -}
|
| -
|
| -// If |infobar_widget| matches |info_bar_delegate|, then close the infobar w/o
|
| -// an animation.
|
| -void ClosingForDelegate(GtkWidget* infobar_widget, gpointer info_bar_delegate) {
|
| - InfoBarDelegate* delegate =
|
| - static_cast<InfoBarDelegate*>(info_bar_delegate);
|
| - InfoBar* infobar = reinterpret_cast<InfoBar*>(
|
| - g_object_get_data(G_OBJECT(infobar_widget), kInfoBar));
|
| -
|
| - if (!infobar) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - if (delegate == infobar->delegate())
|
| - infobar->Close();
|
| -}
|
| -
|
| -// Get the height of the widget and add it to |userdata|, but only if it is in
|
| -// the process of animating.
|
| -void SumAnimatingBarHeight(GtkWidget* widget, gpointer userdata) {
|
| - int* height_sum = static_cast<int*>(userdata);
|
| - InfoBar* infobar = reinterpret_cast<InfoBar*>(
|
| - g_object_get_data(G_OBJECT(widget), kInfoBar));
|
| - if (infobar->IsAnimating())
|
| - *height_sum += widget->allocation.height;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// InfoBarContainerGtk, public: ------------------------------------------------
|
| -
|
| -InfoBarContainerGtk::InfoBarContainerGtk(Profile* profile)
|
| - : profile_(profile),
|
| - tab_contents_(NULL),
|
| - container_(gtk_vbox_new(FALSE, 0)) {
|
| - gtk_widget_show(widget());
|
| -}
|
| -
|
| -InfoBarContainerGtk::~InfoBarContainerGtk() {
|
| - ChangeTabContents(NULL);
|
| -
|
| - container_.Destroy();
|
| -}
|
| -
|
| -void InfoBarContainerGtk::ChangeTabContents(TabContents* contents) {
|
| - if (tab_contents_)
|
| - registrar_.RemoveAll();
|
| -
|
| - gtk_util::RemoveAllChildren(widget());
|
| - UpdateToolbarInfoBarState(NULL, false);
|
| -
|
| - tab_contents_ = contents;
|
| - if (tab_contents_) {
|
| - UpdateInfoBars();
|
| - Source<TabContents> source(tab_contents_);
|
| - registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_ADDED, source);
|
| - registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_REMOVED,
|
| - source);
|
| - registrar_.Add(this, NotificationType::TAB_CONTENTS_INFOBAR_REPLACED,
|
| - source);
|
| - }
|
| -}
|
| -
|
| -void InfoBarContainerGtk::RemoveDelegate(InfoBarDelegate* delegate) {
|
| - tab_contents_->RemoveInfoBar(delegate);
|
| -}
|
| -
|
| -int InfoBarContainerGtk::TotalHeightOfAnimatingBars() const {
|
| - int sum = 0;
|
| - gtk_container_foreach(GTK_CONTAINER(widget()), SumAnimatingBarHeight, &sum);
|
| - return sum;
|
| -}
|
| -
|
| -// InfoBarContainerGtk, NotificationObserver implementation: -------------------
|
| -
|
| -void InfoBarContainerGtk::Observe(NotificationType type,
|
| - const NotificationSource& source,
|
| - const NotificationDetails& details) {
|
| - if (type == NotificationType::TAB_CONTENTS_INFOBAR_ADDED) {
|
| - AddInfoBar(Details<InfoBarDelegate>(details).ptr(), true);
|
| - } else if (type == NotificationType::TAB_CONTENTS_INFOBAR_REMOVED) {
|
| - RemoveInfoBar(Details<InfoBarDelegate>(details).ptr(), true);
|
| - } else if (type == NotificationType::TAB_CONTENTS_INFOBAR_REPLACED) {
|
| - std::pair<InfoBarDelegate*, InfoBarDelegate*>* delegates =
|
| - Details<std::pair<InfoBarDelegate*, InfoBarDelegate*> >(details).ptr();
|
| -
|
| - // By not animating the removal/addition, this appears to be a replace.
|
| - RemoveInfoBar(delegates->first, false);
|
| - AddInfoBar(delegates->second, false);
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| -}
|
| -
|
| -// InfoBarContainerGtk, private: -----------------------------------------------
|
| -
|
| -void InfoBarContainerGtk::UpdateInfoBars() {
|
| - for (int i = 0; i < tab_contents_->infobar_delegate_count(); ++i) {
|
| - InfoBarDelegate* delegate = tab_contents_->GetInfoBarDelegateAt(i);
|
| - AddInfoBar(delegate, false);
|
| - }
|
| -}
|
| -
|
| -void InfoBarContainerGtk::ShowArrowForDelegate(InfoBarDelegate* delegate,
|
| - bool animate) {
|
| - GList* children = gtk_container_get_children(GTK_CONTAINER(widget()));
|
| - if (!children)
|
| - return;
|
| -
|
| - // Iterate through the infobars and find the last one that isn't closing.
|
| - InfoBar* last_bar = NULL;
|
| - InfoBar* this_bar = NULL;
|
| - for (GList* iter = children; iter != NULL; iter = iter->next) {
|
| - this_bar = reinterpret_cast<InfoBar*>(
|
| - g_object_get_data(G_OBJECT(iter->data), kInfoBar));
|
| -
|
| - if (this_bar->delegate() == delegate)
|
| - break;
|
| -
|
| - if (!this_bar->IsClosing())
|
| - last_bar = this_bar;
|
| -
|
| - this_bar = NULL;
|
| - }
|
| -
|
| - if (last_bar)
|
| - last_bar->ShowArrowFor(this_bar, animate);
|
| - else
|
| - UpdateToolbarInfoBarState(this_bar, animate);
|
| -
|
| - g_list_free(children);
|
| -}
|
| -
|
| -void InfoBarContainerGtk::AddInfoBar(InfoBarDelegate* delegate, bool animate) {
|
| - InfoBar* infobar = delegate->CreateInfoBar();
|
| - infobar->set_container(this);
|
| - infobar->SetThemeProvider(GtkThemeProvider::GetFrom(profile_));
|
| - gtk_box_pack_start(GTK_BOX(widget()), infobar->widget(),
|
| - FALSE, FALSE, 0);
|
| -
|
| - if (animate)
|
| - infobar->AnimateOpen();
|
| - else
|
| - infobar->Open();
|
| -
|
| - ShowArrowForDelegate(delegate, animate);
|
| -}
|
| -
|
| -void InfoBarContainerGtk::RemoveInfoBar(InfoBarDelegate* delegate,
|
| - bool animate) {
|
| - if (animate) {
|
| - gtk_container_foreach(GTK_CONTAINER(widget()),
|
| - AnimateClosingForDelegate, delegate);
|
| - } else {
|
| - gtk_container_foreach(GTK_CONTAINER(widget()), ClosingForDelegate,
|
| - delegate);
|
| - }
|
| -
|
| - InfoBarDelegate* next_delegate = NULL;
|
| - for (int i = 1; i < tab_contents_->infobar_delegate_count(); ++i) {
|
| - if (tab_contents_->GetInfoBarDelegateAt(i - 1) == delegate) {
|
| - next_delegate = tab_contents_->GetInfoBarDelegateAt(i);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - ShowArrowForDelegate(next_delegate, animate);
|
| -}
|
| -
|
| -void InfoBarContainerGtk::UpdateToolbarInfoBarState(
|
| - InfoBar* infobar, bool animate) {
|
| - GtkWindow* parent = platform_util::GetTopLevel(widget());
|
| - BrowserWindowGtk* browser_window =
|
| - BrowserWindowGtk::GetBrowserWindowForNativeWindow(parent);
|
| - if (browser_window)
|
| - browser_window->SetInfoBarShowing(infobar, animate);
|
| -}
|
|
|