| Index: views/widget/tooltip_window_gtk.cc
|
| diff --git a/views/widget/tooltip_window_gtk.cc b/views/widget/tooltip_window_gtk.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e76338c26af9d617abed30ac450558569f6317d1
|
| --- /dev/null
|
| +++ b/views/widget/tooltip_window_gtk.cc
|
| @@ -0,0 +1,94 @@
|
| +// 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 "views/widget/tooltip_window_gtk.h"
|
| +
|
| +#include "base/utf_string_conversions.h"
|
| +
|
| +namespace views {
|
| +
|
| +TooltipWindowGtk::TooltipWindowGtk(GtkWidget* widget)
|
| + : host_(widget),
|
| + window_(NULL),
|
| + alignment_(NULL),
|
| + label_(NULL) {
|
| + Init();
|
| +}
|
| +
|
| +TooltipWindowGtk::~TooltipWindowGtk() {
|
| + if (window_)
|
| + gtk_widget_destroy(window_);
|
| +}
|
| +
|
| +void TooltipWindowGtk::SetTooltipText(const std::wstring& text) {
|
| + const std::string& utf8 = WideToUTF8(text);
|
| +
|
| + gtk_label_set_text(label(), utf8.c_str());
|
| + // Setting the text in a label doesn't force recalculating wrap position.
|
| + // We force recalculating wrap position by resetting the max width.
|
| + gtk_label_set_max_width_chars(label(), 2999);
|
| + gtk_label_set_max_width_chars(label(), 3000);
|
| +}
|
| +
|
| +void TooltipWindowGtk::Init() {
|
| + // Creates and setup tooltip window.
|
| + window_ = gtk_window_new(GTK_WINDOW_POPUP);
|
| + gtk_window_set_type_hint(GTK_WINDOW(window_), GDK_WINDOW_TYPE_HINT_TOOLTIP);
|
| + gtk_widget_set_app_paintable(window_, TRUE);
|
| + gtk_window_set_resizable(GTK_WINDOW(window_), FALSE);
|
| + gtk_widget_set_name(window_, "gtk-tooltip");
|
| +
|
| + GdkColormap* rgba_colormap =
|
| + gdk_screen_get_rgba_colormap(gdk_screen_get_default());
|
| + if (rgba_colormap)
|
| + gtk_widget_set_colormap(window_, rgba_colormap);
|
| +
|
| + g_signal_connect(G_OBJECT(window_), "expose-event",
|
| + G_CALLBACK(&OnPaintThunk), this);
|
| + g_signal_connect(G_OBJECT(window_), "style-set",
|
| + G_CALLBACK(&OnStyleSetThunk), this);
|
| +
|
| + alignment_ = gtk_alignment_new(0.5, 0.5, 1.0, 1.0);
|
| + gtk_container_add(GTK_CONTAINER(window_), alignment_);
|
| + gtk_widget_show(alignment_);
|
| +
|
| + label_ = gtk_label_new("");
|
| + gtk_label_set_line_wrap(GTK_LABEL(label_), TRUE);
|
| + gtk_label_set_max_width_chars(GTK_LABEL(label_), 3000);
|
| + gtk_container_add(GTK_CONTAINER(alignment_), label_);
|
| + gtk_widget_show(label_);
|
| +
|
| + // Associates the tooltip window with given widget
|
| + gtk_widget_set_tooltip_window(host_, GTK_WINDOW(window_));
|
| +}
|
| +
|
| +// Paints our customized tooltip window.
|
| +gboolean TooltipWindowGtk::OnPaint(GtkWidget* widget, GdkEventExpose* event) {
|
| + gtk_paint_flat_box(widget->style,
|
| + widget->window,
|
| + GTK_STATE_NORMAL,
|
| + GTK_SHADOW_OUT,
|
| + NULL,
|
| + widget,
|
| + "tooltip",
|
| + 0, 0,
|
| + widget->allocation.width,
|
| + widget->allocation.height);
|
| +
|
| + return FALSE;
|
| +}
|
| +
|
| +// Style change handler.
|
| +void TooltipWindowGtk::OnStyleSet(GtkWidget* widget,
|
| + GtkStyle* previous_style) {
|
| + gtk_alignment_set_padding(GTK_ALIGNMENT(alignment_),
|
| + widget->style->ythickness,
|
| + widget->style->ythickness,
|
| + widget->style->xthickness,
|
| + widget->style->xthickness);
|
| +
|
| + gtk_widget_queue_draw(widget);
|
| +}
|
| +
|
| +} // namespace views
|
|
|