diff options
Diffstat (limited to 'views/widget/tooltip_window_gtk.cc')
-rw-r--r-- | views/widget/tooltip_window_gtk.cc | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/views/widget/tooltip_window_gtk.cc b/views/widget/tooltip_window_gtk.cc new file mode 100644 index 0000000..e76338c --- /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 |