| Index: chrome/browser/ui/gtk/infobars/infobar_gtk.cc
|
| diff --git a/chrome/browser/ui/gtk/infobars/infobar_gtk.cc b/chrome/browser/ui/gtk/infobars/infobar_gtk.cc
|
| deleted file mode 100644
|
| index 386811e34461f94cbcbeb58e31b1a0717c1d8a83..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/gtk/infobars/infobar_gtk.cc
|
| +++ /dev/null
|
| @@ -1,333 +0,0 @@
|
| -// Copyright (c) 2012 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/ui/gtk/infobars/infobar_gtk.h"
|
| -
|
| -#include "base/debug/trace_event.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/chrome_notification_types.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/themes/theme_properties.h"
|
| -#include "chrome/browser/ui/gtk/browser_window_gtk.h"
|
| -#include "chrome/browser/ui/gtk/custom_button.h"
|
| -#include "chrome/browser/ui/gtk/gtk_chrome_link_button.h"
|
| -#include "chrome/browser/ui/gtk/gtk_theme_service.h"
|
| -#include "chrome/browser/ui/gtk/gtk_util.h"
|
| -#include "chrome/browser/ui/gtk/infobars/infobar_container_gtk.h"
|
| -#include "content/public/browser/notification_source.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "ui/base/gtk/gtk_expanded_container.h"
|
| -#include "ui/base/gtk/gtk_hig_constants.h"
|
| -#include "ui/base/gtk/gtk_signal_registrar.h"
|
| -#include "ui/base/models/menu_model.h"
|
| -#include "ui/gfx/gtk_util.h"
|
| -#include "ui/gfx/image/image.h"
|
| -
|
| -namespace {
|
| -
|
| -// Pixels between infobar elements.
|
| -const int kElementPadding = 5;
|
| -
|
| -// Extra padding on either end of info bar.
|
| -const int kLeftPadding = 5;
|
| -const int kRightPadding = 5;
|
| -
|
| -} // namespace
|
| -
|
| -
|
| -// InfoBar --------------------------------------------------------------------
|
| -
|
| -// static
|
| -const int InfoBar::kSeparatorLineHeight = 1;
|
| -const int InfoBar::kDefaultArrowTargetHeight = 9;
|
| -const int InfoBar::kMaximumArrowTargetHeight = 24;
|
| -const int InfoBar::kDefaultArrowTargetHalfWidth = kDefaultArrowTargetHeight;
|
| -const int InfoBar::kMaximumArrowTargetHalfWidth = 14;
|
| -const int InfoBar::kDefaultBarTargetHeight = 36;
|
| -
|
| -
|
| -// InfoBarGtk -----------------------------------------------------------------
|
| -
|
| -// static
|
| -const int InfoBarGtk::kEndOfLabelSpacing = 6;
|
| -
|
| -InfoBarGtk::InfoBarGtk(scoped_ptr<InfoBarDelegate> delegate)
|
| - : InfoBar(delegate.Pass()),
|
| - bg_box_(NULL),
|
| - hbox_(NULL),
|
| - theme_service_(NULL),
|
| - signals_(new ui::GtkSignalRegistrar) {
|
| -}
|
| -
|
| -InfoBarGtk::~InfoBarGtk() {
|
| -}
|
| -
|
| -GdkColor InfoBarGtk::GetBorderColor() const {
|
| - DCHECK(theme_service_);
|
| - return theme_service_->GetBorderColor();
|
| -}
|
| -
|
| -int InfoBarGtk::AnimatingHeight() const {
|
| - return animation().is_animating() ? bar_target_height() : 0;
|
| -}
|
| -
|
| -SkColor InfoBarGtk::ConvertGetColor(ColorGetter getter) {
|
| - double r, g, b;
|
| - (this->*getter)(delegate()->GetInfoBarType(), &r, &g, &b);
|
| - return SkColorSetARGB(255, 255 * r, 255 * g, 255 * b);
|
| -}
|
| -
|
| -void InfoBarGtk::GetTopColor(InfoBarDelegate::Type type,
|
| - double* r, double* g, double* b) {
|
| - GetBackgroundColor(InfoBar::GetTopColor(type), r, g, b);
|
| -}
|
| -
|
| -void InfoBarGtk::GetBottomColor(InfoBarDelegate::Type type,
|
| - double* r, double* g, double* b) {
|
| - GetBackgroundColor(InfoBar::GetBottomColor(type), r, g, b);
|
| -}
|
| -
|
| -void InfoBarGtk::PlatformSpecificSetOwner() {
|
| - DCHECK(owner());
|
| - DCHECK(!theme_service_);
|
| - theme_service_ = GtkThemeService::GetFrom(Profile::FromBrowserContext(
|
| - owner()->web_contents()->GetBrowserContext()));
|
| -
|
| - // Create |hbox_| and pad the sides.
|
| - hbox_ = gtk_hbox_new(FALSE, kElementPadding);
|
| -
|
| - // Make the whole infor bar horizontally shrinkable.
|
| - gtk_widget_set_size_request(hbox_, 0, -1);
|
| -
|
| - GtkWidget* padding = gtk_alignment_new(0, 0, 1, 1);
|
| - gtk_alignment_set_padding(GTK_ALIGNMENT(padding),
|
| - 0, 0, kLeftPadding, kRightPadding);
|
| -
|
| - bg_box_ = gtk_event_box_new();
|
| - gtk_widget_set_app_paintable(bg_box_, TRUE);
|
| - g_signal_connect(bg_box_, "expose-event",
|
| - G_CALLBACK(OnBackgroundExposeThunk), this);
|
| - gtk_container_add(GTK_CONTAINER(padding), hbox_);
|
| - gtk_container_add(GTK_CONTAINER(bg_box_), padding);
|
| -
|
| - // Add the icon on the left, if any.
|
| - gfx::Image icon = delegate()->GetIcon();
|
| - if (!icon.IsEmpty()) {
|
| - GtkWidget* image = gtk_image_new_from_pixbuf(icon.ToGdkPixbuf());
|
| -
|
| - gtk_misc_set_alignment(GTK_MISC(image), 0.5, 0.5);
|
| -
|
| - gtk_box_pack_start(GTK_BOX(hbox_), image, FALSE, FALSE, 0);
|
| - }
|
| -
|
| - close_button_.reset(CustomDrawButton::CloseButtonBar(theme_service_));
|
| - gtk_util::CenterWidgetInHBox(hbox_, close_button_->widget(), true, 0);
|
| - signals_->Connect(close_button_->widget(), "clicked",
|
| - G_CALLBACK(OnCloseButtonThunk), this);
|
| -
|
| - widget_.Own(gtk_expanded_container_new());
|
| - gtk_container_add(GTK_CONTAINER(widget_.get()), bg_box_);
|
| - gtk_widget_set_size_request(widget_.get(), -1, 0);
|
| -
|
| - g_signal_connect(widget_.get(), "child-size-request",
|
| - G_CALLBACK(OnChildSizeRequestThunk),
|
| - this);
|
| -
|
| - registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
|
| - content::Source<ThemeService>(theme_service_));
|
| - UpdateBorderColor();
|
| -}
|
| -
|
| -void InfoBarGtk::PlatformSpecificShow(bool animate) {
|
| - DCHECK(bg_box_);
|
| -
|
| - DCHECK(widget());
|
| - gtk_widget_show_all(widget());
|
| - gtk_widget_set_size_request(widget(), -1, bar_height());
|
| -
|
| - GdkWindow* gdk_window = gtk_widget_get_window(bg_box_);
|
| - if (gdk_window)
|
| - gdk_window_lower(gdk_window);
|
| -}
|
| -
|
| -void InfoBarGtk::PlatformSpecificOnCloseSoon() {
|
| - // We must close all menus and prevent any signals from being emitted while
|
| - // we are animating the info bar closed.
|
| - menu_.reset();
|
| - signals_.reset();
|
| -}
|
| -
|
| -void InfoBarGtk::PlatformSpecificOnHeightsRecalculated() {
|
| - DCHECK(bg_box_);
|
| - DCHECK(widget());
|
| - gtk_widget_set_size_request(bg_box_, -1, bar_target_height());
|
| - gtk_expanded_container_move(GTK_EXPANDED_CONTAINER(widget()),
|
| - bg_box_, 0,
|
| - bar_height() - bar_target_height());
|
| -
|
| - gtk_widget_set_size_request(widget(), -1, bar_height());
|
| - gtk_widget_queue_draw(widget());
|
| -}
|
| -
|
| -void InfoBarGtk::Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - DCHECK(widget());
|
| - UpdateBorderColor();
|
| -}
|
| -
|
| -void InfoBarGtk::ForceCloseButtonToUseChromeTheme() {
|
| - close_button_->ForceChromeTheme();
|
| -}
|
| -
|
| -GtkWidget* InfoBarGtk::CreateLabel(const std::string& text) {
|
| - DCHECK(theme_service_);
|
| - return theme_service_->BuildLabel(text, ui::kGdkBlack);
|
| -}
|
| -
|
| -GtkWidget* InfoBarGtk::CreateLinkButton(const std::string& text) {
|
| - DCHECK(theme_service_);
|
| - return theme_service_->BuildChromeLinkButton(text);
|
| -}
|
| -
|
| -// static
|
| -GtkWidget* InfoBarGtk::CreateMenuButton(const std::string& text) {
|
| - GtkWidget* button = gtk_button_new();
|
| - GtkWidget* former_child = gtk_bin_get_child(GTK_BIN(button));
|
| - if (former_child)
|
| - gtk_container_remove(GTK_CONTAINER(button), former_child);
|
| -
|
| - GtkWidget* hbox = gtk_hbox_new(FALSE, 0);
|
| -
|
| - GtkWidget* label = gtk_label_new(text.c_str());
|
| - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
|
| -
|
| - GtkWidget* arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE);
|
| - gtk_box_pack_start(GTK_BOX(hbox), arrow, FALSE, FALSE, 0);
|
| -
|
| - gtk_container_add(GTK_CONTAINER(button), hbox);
|
| -
|
| - return button;
|
| -}
|
| -
|
| -void InfoBarGtk::AddLabelWithInlineLink(const base::string16& display_text,
|
| - const base::string16& link_text,
|
| - size_t link_offset,
|
| - GCallback callback) {
|
| - DCHECK(hbox_);
|
| - GtkWidget* link_button = CreateLinkButton(base::UTF16ToUTF8(link_text));
|
| - gtk_util::ForceFontSizePixels(
|
| - GTK_CHROME_LINK_BUTTON(link_button)->label, 13.4);
|
| - DCHECK(callback);
|
| - signals_->Connect(link_button, "clicked", callback, this);
|
| - gtk_util::SetButtonTriggersNavigation(link_button);
|
| -
|
| - GtkWidget* hbox = gtk_hbox_new(FALSE, 0);
|
| - // We want the link to be horizontally shrinkable, so that the Chrome
|
| - // window can be resized freely even with a very long link.
|
| - gtk_widget_set_size_request(hbox, 0, -1);
|
| - gtk_box_pack_start(GTK_BOX(hbox_), hbox, TRUE, TRUE, 0);
|
| -
|
| - // Need to insert the link inside the display text.
|
| - GtkWidget* initial_label = CreateLabel(
|
| - base::UTF16ToUTF8(display_text.substr(0, link_offset)));
|
| - GtkWidget* trailing_label = CreateLabel(
|
| - base::UTF16ToUTF8(display_text.substr(link_offset)));
|
| -
|
| - gtk_util::ForceFontSizePixels(initial_label, 13.4);
|
| - gtk_util::ForceFontSizePixels(trailing_label, 13.4);
|
| -
|
| - // TODO(joth): None of the label widgets are set as shrinkable here, meaning
|
| - // the text will run under the close button etc. when the width is restricted,
|
| - // rather than eliding.
|
| -
|
| - // We don't want any spacing between the elements, so we pack them into
|
| - // this hbox that doesn't use kElementPadding.
|
| - gtk_box_pack_start(GTK_BOX(hbox), initial_label, FALSE, FALSE, 0);
|
| - gtk_util::CenterWidgetInHBox(hbox, link_button, false, 0);
|
| - gtk_box_pack_start(GTK_BOX(hbox), trailing_label, FALSE, FALSE, 0);
|
| -}
|
| -
|
| -void InfoBarGtk::ShowMenuWithModel(GtkWidget* sender,
|
| - MenuGtk::Delegate* delegate,
|
| - ui::MenuModel* model) {
|
| - menu_.reset(new MenuGtk(delegate, model));
|
| - menu_->PopupForWidget(sender, 1, gtk_get_current_event_time());
|
| -}
|
| -
|
| -void InfoBarGtk::GetBackgroundColor(SkColor color,
|
| - double* r, double* g, double* b) {
|
| - DCHECK(theme_service_);
|
| - if (theme_service_->UsingNativeTheme())
|
| - color = theme_service_->GetColor(ThemeProperties::COLOR_TOOLBAR);
|
| - *r = SkColorGetR(color) / 255.0;
|
| - *g = SkColorGetG(color) / 255.0;
|
| - *b = SkColorGetB(color) / 255.0;
|
| -}
|
| -
|
| -void InfoBarGtk::UpdateBorderColor() {
|
| - DCHECK(widget());
|
| - gtk_widget_queue_draw(widget());
|
| -}
|
| -
|
| -void InfoBarGtk::OnCloseButton(GtkWidget* button) {
|
| - // If we're not owned, we're already closing, so don't call
|
| - // InfoBarDismissed(), since this can lead to us double-recording dismissals.
|
| - if (owner())
|
| - delegate()->InfoBarDismissed();
|
| - RemoveSelf();
|
| -}
|
| -
|
| -gboolean InfoBarGtk::OnBackgroundExpose(GtkWidget* sender,
|
| - GdkEventExpose* event) {
|
| - TRACE_EVENT0("ui::gtk", "InfoBarGtk::OnBackgroundExpose");
|
| - DCHECK(theme_service_);
|
| -
|
| - GtkAllocation allocation;
|
| - gtk_widget_get_allocation(sender, &allocation);
|
| - const int height = allocation.height;
|
| -
|
| - cairo_t* cr = gdk_cairo_create(gtk_widget_get_window(sender));
|
| - gdk_cairo_rectangle(cr, &event->area);
|
| - cairo_clip(cr);
|
| -
|
| - cairo_pattern_t* pattern = cairo_pattern_create_linear(0, 0, 0, height);
|
| -
|
| - double top_r, top_g, top_b;
|
| - GetTopColor(delegate()->GetInfoBarType(), &top_r, &top_g, &top_b);
|
| - cairo_pattern_add_color_stop_rgb(pattern, 0.0, top_r, top_g, top_b);
|
| -
|
| - double bottom_r, bottom_g, bottom_b;
|
| - GetBottomColor(delegate()->GetInfoBarType(), &bottom_r, &bottom_g, &bottom_b);
|
| - cairo_pattern_add_color_stop_rgb(
|
| - pattern, 1.0, bottom_r, bottom_g, bottom_b);
|
| - cairo_set_source(cr, pattern);
|
| - cairo_paint(cr);
|
| - cairo_pattern_destroy(pattern);
|
| -
|
| - // Draw the bottom border.
|
| - GdkColor border_color = GetBorderColor();
|
| - cairo_set_source_rgb(cr, border_color.red / 65535.0,
|
| - border_color.green / 65535.0,
|
| - border_color.blue / 65535.0);
|
| - cairo_set_line_width(cr, 1.0);
|
| - cairo_move_to(cr, 0, allocation.height - 0.5);
|
| - cairo_rel_line_to(cr, allocation.width, 0);
|
| - cairo_stroke(cr);
|
| -
|
| - cairo_destroy(cr);
|
| -
|
| - if (container()) {
|
| - static_cast<InfoBarContainerGtk*>(container())->
|
| - PaintInfobarBitsOn(sender, event, this);
|
| - }
|
| -
|
| - return FALSE;
|
| -}
|
| -
|
| -void InfoBarGtk::OnChildSizeRequest(GtkWidget* expanded,
|
| - GtkWidget* child,
|
| - GtkRequisition* requisition) {
|
| - requisition->height = -1;
|
| -}
|
|
|