OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "ui/views/controls/textfield/gtk_views_entry.h" | |
6 | |
7 #include "base/utf_string_conversions.h" | |
8 #include "ui/gfx/canvas_skia_paint.h" | |
9 #include "ui/gfx/insets.h" | |
10 #include "ui/gfx/skia_utils_gtk.h" | |
11 #include "ui/views/controls/textfield/native_textfield_gtk.h" | |
12 #include "ui/views/controls/textfield/textfield.h" | |
13 | |
14 G_BEGIN_DECLS | |
15 | |
16 G_DEFINE_TYPE(GtkViewsEntry, gtk_views_entry, GTK_TYPE_ENTRY) | |
17 | |
18 static gint gtk_views_entry_expose_event(GtkWidget *widget, | |
19 GdkEventExpose *event) { | |
20 views::NativeTextfieldGtk* host = GTK_VIEWS_ENTRY(widget)->host; | |
21 #if defined(OS_CHROMEOS) | |
22 // Draw textfield background over the default white rectangle. | |
23 if (event->window == widget->window) { | |
24 gfx::CanvasSkiaPaint canvas(event); | |
25 if (!canvas.is_empty() && host) { | |
26 host->textfield()->OnPaintBackground(&canvas); | |
27 } | |
28 } | |
29 #endif | |
30 | |
31 gint result = GTK_WIDGET_CLASS(gtk_views_entry_parent_class)->expose_event( | |
32 widget, event); | |
33 | |
34 GtkEntry* entry = GTK_ENTRY(widget); | |
35 | |
36 // Internally GtkEntry creates an additional window (text_area) that the | |
37 // text is drawn to. We only need paint after that window has painted. | |
38 if (host && event->window == entry->text_area && | |
39 !host->textfield()->text_to_display_when_empty().empty() && | |
40 g_utf8_strlen(gtk_entry_get_text(entry), -1) == 0) { | |
41 gfx::CanvasSkiaPaint canvas(event); | |
42 if (!canvas.is_empty()) { | |
43 gfx::Insets insets = | |
44 views::NativeTextfieldGtk::GetEntryInnerBorder(entry); | |
45 gfx::Font font = host->textfield()->font(); | |
46 const string16 text = host->textfield()->text_to_display_when_empty(); | |
47 canvas.DrawStringInt( | |
48 text, font, | |
49 gfx::GdkColorToSkColor(widget->style->text[GTK_STATE_INSENSITIVE]), | |
50 insets.left(), insets.top(), | |
51 widget->allocation.width - insets.width(), font.GetHeight()); | |
52 } | |
53 } | |
54 | |
55 return result; | |
56 } | |
57 | |
58 static void gtk_views_entry_class_init(GtkViewsEntryClass* views_entry_class) { | |
59 GtkWidgetClass* widget_class = | |
60 reinterpret_cast<GtkWidgetClass*>(views_entry_class); | |
61 widget_class->expose_event = gtk_views_entry_expose_event; | |
62 } | |
63 | |
64 static void gtk_views_entry_init(GtkViewsEntry* entry) { | |
65 entry->host = NULL; | |
66 } | |
67 | |
68 GtkWidget* gtk_views_entry_new(views::NativeTextfieldGtk* host) { | |
69 gpointer entry = g_object_new(GTK_TYPE_VIEWS_ENTRY, NULL); | |
70 GTK_VIEWS_ENTRY(entry)->host = host; | |
71 return GTK_WIDGET(entry); | |
72 } | |
73 | |
74 G_END_DECLS | |
OLD | NEW |