blob: a3350722ae824f97bec9b24fa79246670f6fd7ba [file] [log] [blame]
// 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/controls/textfield/gtk_views_textview.h"
#include "base/utf_string_conversions.h"
#include "ui/gfx/canvas_skia_paint.h"
#include "ui/gfx/insets.h"
#include "ui/gfx/skia_utils_gtk.h"
#include "views/controls/textfield/native_textfield_gtk.h"
#include "views/controls/textfield/textfield.h"
G_BEGIN_DECLS
G_DEFINE_TYPE(GtkViewsTextView, gtk_views_textview, GTK_TYPE_TEXT_VIEW)
static gint gtk_views_textview_expose_event(GtkWidget *widget,
GdkEventExpose *event) {
GtkTextView* text_view = GTK_TEXT_VIEW(widget);
GdkWindow* text_window = gtk_text_view_get_window(text_view,
GTK_TEXT_WINDOW_TEXT);
if (event->window == text_window) {
gint width, height;
gdk_drawable_get_size (text_window, &width, &height);
gtk_paint_flat_box(widget->style, text_window,
static_cast<GtkStateType>(GTK_WIDGET_STATE(widget)), GTK_SHADOW_NONE,
&event->area, widget, "textview",
0, 0, width, height);
}
gint result = GTK_WIDGET_CLASS(gtk_views_textview_parent_class)->expose_event(
widget, event);
GtkTextBuffer* text_buffer = gtk_text_view_get_buffer(text_view);
views::NativeTextfieldGtk* host = GTK_VIEWS_TEXTVIEW(widget)->host;
GtkTextIter start;
GtkTextIter end;
gtk_text_buffer_get_bounds(text_buffer, &start, &end);
// Paint the info text to text window if GtkTextView contains no text.
if (host && event->window == text_window &&
!host->textfield()->text_to_display_when_empty().empty() &&
gtk_text_iter_equal(&start, &end)) {
gfx::CanvasSkiaPaint canvas(event);
if (!canvas.is_empty()) {
gfx::Insets insets =
views::NativeTextfieldGtk::GetTextViewInnerBorder(text_view);
gfx::Font font = host->textfield()->font();
const string16 text = host->textfield()->text_to_display_when_empty();
canvas.DrawStringInt(
text, font,
gfx::GdkColorToSkColor(widget->style->text[GTK_STATE_INSENSITIVE]),
insets.left(), insets.top(),
widget->allocation.width - insets.width(), font.GetHeight());
}
}
// Draw border and focus.
if (event->window == widget->window) {
gint width;
gint height;
gdk_drawable_get_size (widget->window, &width, &height);
bool has_focus = GTK_WIDGET_HAS_FOCUS(widget);
gtk_paint_shadow(widget->style, widget->window,
has_focus ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL,
GTK_SHADOW_OUT,
&event->area, widget, "textview",
0, 0, width, height);
if (has_focus) {
gtk_paint_focus(widget->style, widget->window,
static_cast<GtkStateType>(GTK_WIDGET_STATE(widget)),
&event->area, widget, "textview",
0, 0, width, height);
}
}
return result;
}
static void gtk_views_textview_class_init(
GtkViewsTextViewClass* views_textview_class) {
GtkWidgetClass* widget_class =
reinterpret_cast<GtkWidgetClass*>(views_textview_class);
widget_class->expose_event = gtk_views_textview_expose_event;
}
static void gtk_views_textview_init(GtkViewsTextView* text_view) {
text_view->host = NULL;
}
GtkWidget* gtk_views_textview_new(views::NativeTextfieldGtk* host) {
gpointer text_view = g_object_new(GTK_TYPE_VIEWS_TEXTVIEW, NULL);
GTK_VIEWS_TEXTVIEW(text_view)->host = host;
return GTK_WIDGET(text_view);
}
G_END_DECLS