| Index: chrome/browser/ui/gtk/autofill/autofill_popup_view_gtk.cc
|
| diff --git a/chrome/browser/ui/gtk/autofill/autofill_popup_view_gtk.cc b/chrome/browser/ui/gtk/autofill/autofill_popup_view_gtk.cc
|
| deleted file mode 100644
|
| index bd425d28ce389cfe6ecd973ceb2f4fc428aaba0b..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/gtk/autofill/autofill_popup_view_gtk.cc
|
| +++ /dev/null
|
| @@ -1,297 +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/autofill/autofill_popup_view_gtk.h"
|
| -
|
| -#include <gdk/gdkkeysyms.h>
|
| -#include <pango/pango.h>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/ui/autofill/autofill_popup_controller.h"
|
| -#include "chrome/browser/ui/gtk/gtk_util.h"
|
| -#include "components/autofill/core/browser/popup_item_ids.h"
|
| -#include "grit/ui_resources.h"
|
| -#include "ui/base/gtk/gtk_hig_constants.h"
|
| -#include "ui/base/gtk/gtk_windowing.h"
|
| -#include "ui/base/resource/resource_bundle.h"
|
| -#include "ui/gfx/geometry/point.h"
|
| -#include "ui/gfx/geometry/rect.h"
|
| -#include "ui/gfx/gtk_compat.h"
|
| -#include "ui/gfx/image/image.h"
|
| -#include "ui/gfx/native_widget_types.h"
|
| -#include "ui/gfx/pango_util.h"
|
| -#include "ui/gfx/text_utils.h"
|
| -
|
| -namespace {
|
| -
|
| -const GdkColor kBorderColor = GDK_COLOR_RGB(0xc7, 0xca, 0xce);
|
| -const GdkColor kHoveredBackgroundColor = GDK_COLOR_RGB(0xcd, 0xcd, 0xcd);
|
| -const GdkColor kNameColor = GDK_COLOR_RGB(0x00, 0x00, 0x00);
|
| -const GdkColor kWarningColor = GDK_COLOR_RGB(0x7f, 0x7f, 0x7f);
|
| -const GdkColor kSubtextColor = GDK_COLOR_RGB(0x7f, 0x7f, 0x7f);
|
| -
|
| -} // namespace
|
| -
|
| -namespace autofill {
|
| -
|
| -AutofillPopupViewGtk::AutofillPopupViewGtk(
|
| - AutofillPopupController* controller)
|
| - : controller_(controller),
|
| - window_(gtk_window_new(GTK_WINDOW_POPUP)) {
|
| - gtk_window_set_resizable(GTK_WINDOW(window_), FALSE);
|
| - gtk_widget_set_app_paintable(window_, TRUE);
|
| - gtk_widget_set_double_buffered(window_, TRUE);
|
| -
|
| - // Setup the window to ensure it receives the expose event.
|
| - gtk_widget_add_events(window_, GDK_BUTTON_MOTION_MASK |
|
| - GDK_BUTTON_RELEASE_MASK |
|
| - GDK_EXPOSURE_MASK |
|
| - GDK_POINTER_MOTION_MASK);
|
| -
|
| - GtkWidget* toplevel_window = gtk_widget_get_toplevel(
|
| - controller->container_view());
|
| - signals_.Connect(toplevel_window, "configure-event",
|
| - G_CALLBACK(HandleConfigureThunk), this);
|
| - g_signal_connect(window_, "expose-event",
|
| - G_CALLBACK(HandleExposeThunk), this);
|
| - g_signal_connect(window_, "leave-notify-event",
|
| - G_CALLBACK(HandleLeaveThunk), this);
|
| - g_signal_connect(window_, "motion-notify-event",
|
| - G_CALLBACK(HandleMotionThunk), this);
|
| - g_signal_connect(window_, "button-release-event",
|
| - G_CALLBACK(HandleButtonReleaseThunk), this);
|
| -
|
| - // Cache the layout so we don't have to create it for every expose.
|
| - layout_ = gtk_widget_create_pango_layout(window_, NULL);
|
| -}
|
| -
|
| -AutofillPopupViewGtk::~AutofillPopupViewGtk() {
|
| - g_object_unref(layout_);
|
| - gtk_widget_destroy(window_);
|
| -}
|
| -
|
| -void AutofillPopupViewGtk::Hide() {
|
| - delete this;
|
| -}
|
| -
|
| -void AutofillPopupViewGtk::Show() {
|
| - UpdateBoundsAndRedrawPopup();
|
| -
|
| - gtk_widget_show(window_);
|
| -
|
| - GtkWidget* parent_window =
|
| - gtk_widget_get_toplevel(controller_->container_view());
|
| - ui::StackPopupWindow(window_, parent_window);
|
| -}
|
| -
|
| -void AutofillPopupViewGtk::InvalidateRow(size_t row) {
|
| - GdkRectangle row_rect = controller_->GetRowBounds(row).ToGdkRectangle();
|
| - GdkWindow* gdk_window = gtk_widget_get_window(window_);
|
| - gdk_window_invalidate_rect(gdk_window, &row_rect, FALSE);
|
| -}
|
| -
|
| -void AutofillPopupViewGtk::UpdateBoundsAndRedrawPopup() {
|
| - gtk_widget_set_size_request(window_,
|
| - controller_->popup_bounds().width(),
|
| - controller_->popup_bounds().height());
|
| - gtk_window_move(GTK_WINDOW(window_),
|
| - controller_->popup_bounds().x(),
|
| - controller_->popup_bounds().y());
|
| -
|
| - GdkWindow* gdk_window = gtk_widget_get_window(window_);
|
| - GdkRectangle popup_rect = controller_->popup_bounds().ToGdkRectangle();
|
| - if (gdk_window != NULL)
|
| - gdk_window_invalidate_rect(gdk_window, &popup_rect, FALSE);
|
| -}
|
| -
|
| -gboolean AutofillPopupViewGtk::HandleConfigure(GtkWidget* widget,
|
| - GdkEventConfigure* event) {
|
| - controller_->Hide();
|
| - return FALSE;
|
| -}
|
| -
|
| -gboolean AutofillPopupViewGtk::HandleButtonRelease(GtkWidget* widget,
|
| - GdkEventButton* event) {
|
| - // We only care about the left click.
|
| - if (event->button != 1)
|
| - return FALSE;
|
| -
|
| - controller_->SetSelectionAtPoint(gfx::Point(event->x, event->y));
|
| - controller_->AcceptSelectedLine();
|
| - return TRUE;
|
| -}
|
| -
|
| -gboolean AutofillPopupViewGtk::HandleExpose(GtkWidget* widget,
|
| - GdkEventExpose* event) {
|
| - cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(gtk_widget_get_window(widget)));
|
| - gdk_cairo_rectangle(cr, &event->area);
|
| - cairo_clip(cr);
|
| -
|
| - // Draw the 1px border around the entire window.
|
| - gdk_cairo_set_source_color(cr, &kBorderColor);
|
| - gdk_cairo_rectangle(cr, &widget->allocation);
|
| - cairo_stroke(cr);
|
| - SetUpLayout();
|
| -
|
| - gfx::Rect damage_rect(event->area);
|
| -
|
| - for (size_t i = 0; i < controller_->names().size(); ++i) {
|
| - gfx::Rect line_rect = controller_->GetRowBounds(i);
|
| - // Only repaint and layout damaged lines.
|
| - if (!line_rect.Intersects(damage_rect))
|
| - continue;
|
| -
|
| - if (controller_->identifiers()[i] == POPUP_ITEM_ID_SEPARATOR)
|
| - DrawSeparator(cr, line_rect);
|
| - else
|
| - DrawAutofillEntry(cr, i, line_rect);
|
| - }
|
| -
|
| - cairo_destroy(cr);
|
| -
|
| - return TRUE;
|
| -}
|
| -
|
| -gboolean AutofillPopupViewGtk::HandleLeave(GtkWidget* widget,
|
| - GdkEventCrossing* event) {
|
| - controller_->SelectionCleared();
|
| -
|
| - return FALSE;
|
| -}
|
| -
|
| -gboolean AutofillPopupViewGtk::HandleMotion(GtkWidget* widget,
|
| - GdkEventMotion* event) {
|
| - controller_->SetSelectionAtPoint(gfx::Point(event->x, event->y));
|
| -
|
| - return TRUE;
|
| -}
|
| -
|
| -void AutofillPopupViewGtk::SetUpLayout() {
|
| - pango_layout_set_width(layout_, window_->allocation.width * PANGO_SCALE);
|
| - pango_layout_set_height(layout_, window_->allocation.height * PANGO_SCALE);
|
| -}
|
| -
|
| -void AutofillPopupViewGtk::SetLayoutText(const base::string16& text,
|
| - const gfx::FontList& font_list,
|
| - const GdkColor text_color) {
|
| - PangoAttrList* attrs = pango_attr_list_new();
|
| -
|
| - PangoAttribute* fg_attr = pango_attr_foreground_new(text_color.red,
|
| - text_color.green,
|
| - text_color.blue);
|
| - pango_attr_list_insert(attrs, fg_attr); // Ownership taken.
|
| -
|
| - pango_layout_set_attributes(layout_, attrs); // Ref taken.
|
| - pango_attr_list_unref(attrs);
|
| -
|
| - gfx::ScopedPangoFontDescription font_description(
|
| - pango_font_description_from_string(
|
| - font_list.GetFontDescriptionString().c_str()));
|
| - pango_layout_set_font_description(layout_, font_description.get());
|
| -
|
| - gtk_util::SetLayoutText(layout_, text);
|
| -
|
| - // The popup is already the correct size for the text, so set the width to -1
|
| - // to prevent additional wrapping or ellipsization.
|
| - pango_layout_set_width(layout_, -1);
|
| -}
|
| -
|
| -void AutofillPopupViewGtk::DrawSeparator(cairo_t* cairo_context,
|
| - const gfx::Rect& separator_rect) {
|
| - cairo_save(cairo_context);
|
| - cairo_move_to(cairo_context, 0, separator_rect.y());
|
| - cairo_line_to(cairo_context,
|
| - separator_rect.width(),
|
| - separator_rect.y() + separator_rect.height());
|
| - cairo_stroke(cairo_context);
|
| - cairo_restore(cairo_context);
|
| -}
|
| -
|
| -void AutofillPopupViewGtk::DrawAutofillEntry(cairo_t* cairo_context,
|
| - size_t index,
|
| - const gfx::Rect& entry_rect) {
|
| - if (controller_->selected_line() == static_cast<int>(index)) {
|
| - gdk_cairo_set_source_color(cairo_context, &kHoveredBackgroundColor);
|
| - cairo_rectangle(cairo_context, entry_rect.x(), entry_rect.y(),
|
| - entry_rect.width(), entry_rect.height());
|
| - cairo_fill(cairo_context);
|
| - }
|
| -
|
| - // Draw the value.
|
| - SetLayoutText(controller_->names()[index],
|
| - controller_->GetNameFontListForRow(index),
|
| - controller_->IsWarning(index) ? kWarningColor : kNameColor);
|
| - int value_text_width =
|
| - gfx::GetStringWidth(controller_->names()[index],
|
| - controller_->GetNameFontListForRow(index));
|
| -
|
| - // Center the text within the line.
|
| - int row_height = entry_rect.height();
|
| - int value_content_y = std::max(
|
| - entry_rect.y(),
|
| - entry_rect.y() +
|
| - (row_height -
|
| - controller_->GetNameFontListForRow(index).GetHeight()) / 2);
|
| -
|
| - bool is_rtl = controller_->IsRTL();
|
| - int value_content_x = is_rtl ?
|
| - entry_rect.width() - value_text_width - kEndPadding : kEndPadding;
|
| -
|
| - cairo_save(cairo_context);
|
| - cairo_move_to(cairo_context, value_content_x, value_content_y);
|
| - pango_cairo_show_layout(cairo_context, layout_);
|
| - cairo_restore(cairo_context);
|
| -
|
| - // Use this to figure out where all the other Autofill items should be placed.
|
| - int x_align_left = is_rtl ? kEndPadding : entry_rect.width() - kEndPadding;
|
| -
|
| - // Draw the Autofill icon, if one exists
|
| - if (!controller_->icons()[index].empty()) {
|
| - int icon = controller_->GetIconResourceID(controller_->icons()[index]);
|
| - DCHECK_NE(-1, icon);
|
| - const gfx::Image& image =
|
| - ui::ResourceBundle::GetSharedInstance().GetImageNamed(icon);
|
| - int icon_y = entry_rect.y() + (row_height - image.Height()) / 2;
|
| -
|
| - x_align_left += is_rtl ? 0 : -image.Width();
|
| -
|
| - cairo_save(cairo_context);
|
| - gtk_util::DrawFullImage(cairo_context,
|
| - window_,
|
| - image,
|
| - x_align_left,
|
| - icon_y);
|
| - cairo_restore(cairo_context);
|
| -
|
| - x_align_left += is_rtl ? image.Width() + kIconPadding : -kIconPadding;
|
| - }
|
| -
|
| - // Draw the subtext.
|
| - SetLayoutText(controller_->subtexts()[index],
|
| - controller_->subtext_font_list(),
|
| - kSubtextColor);
|
| - if (!is_rtl) {
|
| - x_align_left -= gfx::GetStringWidth(controller_->subtexts()[index],
|
| - controller_->subtext_font_list());
|
| - }
|
| -
|
| - // Center the text within the line.
|
| - int subtext_content_y = std::max(
|
| - entry_rect.y(),
|
| - entry_rect.y() +
|
| - (row_height - controller_->subtext_font_list().GetHeight()) / 2);
|
| -
|
| - cairo_save(cairo_context);
|
| - cairo_move_to(cairo_context, x_align_left, subtext_content_y);
|
| - pango_cairo_show_layout(cairo_context, layout_);
|
| - cairo_restore(cairo_context);
|
| -}
|
| -
|
| -AutofillPopupView* AutofillPopupView::Create(
|
| - AutofillPopupController* controller) {
|
| - return new AutofillPopupViewGtk(controller);
|
| -}
|
| -
|
| -} // namespace autofill
|
|
|