| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <gtk/gtk.h> | 5 #include <gtk/gtk.h> |
| 6 | 6 |
| 7 #include "views/controls/textfield/native_textfield_gtk.h" | 7 #include "views/controls/textfield/native_textfield_gtk.h" |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| 11 #include "gfx/gtk_util.h" | 11 #include "gfx/gtk_util.h" |
| 12 #include "gfx/insets.h" | 12 #include "gfx/insets.h" |
| 13 #include "gfx/skia_utils_gtk.h" | 13 #include "gfx/skia_utils_gtk.h" |
| 14 #include "views/controls/textfield/gtk_views_entry.h" |
| 14 #include "views/controls/textfield/textfield.h" | 15 #include "views/controls/textfield/textfield.h" |
| 15 | 16 |
| 16 namespace views { | 17 namespace views { |
| 18 |
| 17 // A character used to hide a text in password mode. | 19 // A character used to hide a text in password mode. |
| 18 const char kPasswordChar = '*'; | 20 static const char kPasswordChar = '*'; |
| 19 | 21 |
| 20 //////////////////////////////////////////////////////////////////////////////// | 22 //////////////////////////////////////////////////////////////////////////////// |
| 21 // NativeTextfieldGtk, public: | 23 // NativeTextfieldGtk, public: |
| 22 | 24 |
| 23 NativeTextfieldGtk::NativeTextfieldGtk(Textfield* textfield) | 25 NativeTextfieldGtk::NativeTextfieldGtk(Textfield* textfield) |
| 24 : textfield_(textfield) { | 26 : textfield_(textfield) { |
| 25 if (textfield_->style() & Textfield::STYLE_MULTILINE) | 27 if (textfield_->style() & Textfield::STYLE_MULTILINE) |
| 26 NOTIMPLEMENTED(); // We don't support multiline yet. | 28 NOTIMPLEMENTED(); // We don't support multiline yet. |
| 27 // Make |textfield| the focused view, so that when we get focused the focus | 29 // Make |textfield| the focused view, so that when we get focused the focus |
| 28 // manager sees |textfield| as the focused view (since we are just a wrapper | 30 // manager sees |textfield| as the focused view (since we are just a wrapper |
| 29 // view). | 31 // view). |
| 30 set_focus_view(textfield); | 32 set_focus_view(textfield); |
| 31 } | 33 } |
| 32 | 34 |
| 33 NativeTextfieldGtk::~NativeTextfieldGtk() { | 35 NativeTextfieldGtk::~NativeTextfieldGtk() { |
| 34 } | 36 } |
| 35 | 37 |
| 38 // Returns the inner border of an entry. |
| 39 // static |
| 40 gfx::Insets NativeTextfieldGtk::GetEntryInnerBorder(GtkEntry* entry) { |
| 41 const GtkBorder* inner_border = gtk_entry_get_inner_border(entry); |
| 42 if (inner_border) |
| 43 return gfx::Insets(*inner_border); |
| 44 |
| 45 // No explicit border set, try the style. |
| 46 GtkBorder* style_border; |
| 47 gtk_widget_style_get(GTK_WIDGET(entry), "inner-border", &style_border, NULL); |
| 48 if (style_border) { |
| 49 gfx::Insets insets = gfx::Insets(*style_border); |
| 50 gtk_border_free(style_border); |
| 51 return insets; |
| 52 } |
| 53 |
| 54 // If border is null, Gtk uses 2 on all sides. |
| 55 return gfx::Insets(2, 2, 2, 2); |
| 56 } |
| 57 |
| 36 //////////////////////////////////////////////////////////////////////////////// | 58 //////////////////////////////////////////////////////////////////////////////// |
| 37 // NativeTextfieldGtk, NativeTextfieldWrapper implementation: | 59 // NativeTextfieldGtk, NativeTextfieldWrapper implementation: |
| 38 | 60 |
| 39 string16 NativeTextfieldGtk::GetText() const { | 61 string16 NativeTextfieldGtk::GetText() const { |
| 40 return UTF8ToUTF16(gtk_entry_get_text(GTK_ENTRY(native_view()))); | 62 return UTF8ToUTF16(gtk_entry_get_text(GTK_ENTRY(native_view()))); |
| 41 } | 63 } |
| 42 | 64 |
| 43 void NativeTextfieldGtk::UpdateText() { | 65 void NativeTextfieldGtk::UpdateText() { |
| 44 if (!native_view()) | 66 if (!native_view()) |
| 45 return; | 67 return; |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 } | 165 } |
| 144 | 166 |
| 145 gfx::Insets NativeTextfieldGtk::CalculateInsets() { | 167 gfx::Insets NativeTextfieldGtk::CalculateInsets() { |
| 146 if (!native_view()) | 168 if (!native_view()) |
| 147 return gfx::Insets(); | 169 return gfx::Insets(); |
| 148 | 170 |
| 149 GtkWidget* widget = native_view(); | 171 GtkWidget* widget = native_view(); |
| 150 GtkEntry* entry = GTK_ENTRY(widget); | 172 GtkEntry* entry = GTK_ENTRY(widget); |
| 151 gfx::Insets insets; | 173 gfx::Insets insets; |
| 152 | 174 |
| 153 const GtkBorder* inner_border = gtk_entry_get_inner_border(entry); | 175 insets += GetEntryInnerBorder(entry); |
| 154 if (inner_border) { | |
| 155 insets += gfx::Insets(*inner_border); | |
| 156 } else { | |
| 157 // No explicit border set, try the style. | |
| 158 GtkBorder* style_border; | |
| 159 gtk_widget_style_get(widget, "inner-border", &style_border, NULL); | |
| 160 if (style_border) { | |
| 161 insets += gfx::Insets(*style_border); | |
| 162 gtk_border_free(style_border); | |
| 163 } else { | |
| 164 // If border is null, Gtk uses 2 on all sides. | |
| 165 insets += gfx::Insets(2, 2, 2, 2); | |
| 166 } | |
| 167 } | |
| 168 | 176 |
| 169 if (entry->has_frame) { | 177 if (entry->has_frame) { |
| 170 insets += gfx::Insets(widget->style->ythickness, | 178 insets += gfx::Insets(widget->style->ythickness, |
| 171 widget->style->xthickness, | 179 widget->style->xthickness, |
| 172 widget->style->ythickness, | 180 widget->style->ythickness, |
| 173 widget->style->xthickness); | 181 widget->style->xthickness); |
| 174 } | 182 } |
| 175 | 183 |
| 176 gboolean interior_focus; | 184 gboolean interior_focus; |
| 177 gint focus_width; | 185 gint focus_width; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 Textfield::Controller* controller = textfield_->GetController(); | 241 Textfield::Controller* controller = textfield_->GetController(); |
| 234 if (controller) | 242 if (controller) |
| 235 controller->ContentsChanged(textfield_, GetText()); | 243 controller->ContentsChanged(textfield_, GetText()); |
| 236 return false; | 244 return false; |
| 237 } | 245 } |
| 238 | 246 |
| 239 //////////////////////////////////////////////////////////////////////////////// | 247 //////////////////////////////////////////////////////////////////////////////// |
| 240 // NativeTextfieldGtk, NativeControlGtk overrides: | 248 // NativeTextfieldGtk, NativeControlGtk overrides: |
| 241 | 249 |
| 242 void NativeTextfieldGtk::CreateNativeControl() { | 250 void NativeTextfieldGtk::CreateNativeControl() { |
| 243 NativeControlCreated(gtk_entry_new()); | 251 NativeControlCreated(gtk_views_entry_new(this)); |
| 244 gtk_entry_set_invisible_char(GTK_ENTRY(native_view()), | 252 gtk_entry_set_invisible_char(GTK_ENTRY(native_view()), |
| 245 static_cast<gunichar>(kPasswordChar)); | 253 static_cast<gunichar>(kPasswordChar)); |
| 246 textfield_->UpdateAllProperties(); | 254 textfield_->UpdateAllProperties(); |
| 247 } | 255 } |
| 248 | 256 |
| 249 void NativeTextfieldGtk::NativeControlCreated(GtkWidget* widget) { | 257 void NativeTextfieldGtk::NativeControlCreated(GtkWidget* widget) { |
| 250 NativeControlGtk::NativeControlCreated(widget); | 258 NativeControlGtk::NativeControlCreated(widget); |
| 251 g_signal_connect(widget, "changed", | 259 g_signal_connect(widget, "changed", |
| 252 G_CALLBACK(OnChangedHandler), this); | 260 G_CALLBACK(OnChangedHandler), this); |
| 253 g_signal_connect(widget, "key-press-event", | 261 g_signal_connect(widget, "key-press-event", |
| 254 G_CALLBACK(OnKeyPressEventHandler), this); | 262 G_CALLBACK(OnKeyPressEventHandler), this); |
| 255 } | 263 } |
| 256 | 264 |
| 257 //////////////////////////////////////////////////////////////////////////////// | 265 //////////////////////////////////////////////////////////////////////////////// |
| 258 // NativeTextfieldWrapper, public: | 266 // NativeTextfieldWrapper, public: |
| 259 | 267 |
| 260 // static | 268 // static |
| 261 NativeTextfieldWrapper* NativeTextfieldWrapper::CreateWrapper( | 269 NativeTextfieldWrapper* NativeTextfieldWrapper::CreateWrapper( |
| 262 Textfield* field) { | 270 Textfield* field) { |
| 263 return new NativeTextfieldGtk(field); | 271 return new NativeTextfieldGtk(field); |
| 264 } | 272 } |
| 265 | 273 |
| 266 } // namespace views | 274 } // namespace views |
| OLD | NEW |