Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: ui/views/controls/textfield/native_textfield_views.cc

Issue 11421204: Use native theme colors for textfields; etc. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Nix cursor color; adjust textfield functions; add read-only theme colors. Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ui/views/controls/textfield/native_textfield_views.h" 5 #include "ui/views/controls/textfield/native_textfield_views.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 29 matching lines...) Expand all
40 #include "ui/views/metrics.h" 40 #include "ui/views/metrics.h"
41 #include "ui/views/widget/widget.h" 41 #include "ui/views/widget/widget.h"
42 #include "unicode/uchar.h" 42 #include "unicode/uchar.h"
43 43
44 #if defined(USE_AURA) 44 #if defined(USE_AURA)
45 #include "ui/base/cursor/cursor.h" 45 #include "ui/base/cursor/cursor.h"
46 #endif 46 #endif
47 47
48 namespace { 48 namespace {
49 49
50 // Text color for read only.
51 const SkColor kReadonlyTextColor = SK_ColorDKGRAY;
52
53 // Default "system" color for text cursor. 50 // Default "system" color for text cursor.
54 const SkColor kDefaultCursorColor = SK_ColorBLACK; 51 const SkColor kDefaultCursorColor = SK_ColorBLACK;
55 52
56 // Parameters to control cursor blinking. 53 // Parameters to control cursor blinking.
57 const int kCursorVisibleTimeMs = 800; 54 const int kCursorVisibleTimeMs = 800;
58 const int kCursorInvisibleTimeMs = 500; 55 const int kCursorInvisibleTimeMs = 500;
59 56
60 } // namespace 57 } // namespace
61 58
62 namespace views { 59 namespace views {
(...skipping 14 matching lines...) Expand all
77 ALLOW_THIS_IN_INITIALIZER_LIST(touch_selection_controller_( 74 ALLOW_THIS_IN_INITIALIZER_LIST(touch_selection_controller_(
78 TouchSelectionController::create(this))) { 75 TouchSelectionController::create(this))) {
79 set_border(text_border_); 76 set_border(text_border_);
80 77
81 #if defined(OS_CHROMEOS) 78 #if defined(OS_CHROMEOS)
82 GetRenderText()->SetFontList(gfx::FontList(l10n_util::GetStringUTF8( 79 GetRenderText()->SetFontList(gfx::FontList(l10n_util::GetStringUTF8(
83 IDS_UI_FONT_FAMILY_CROS))); 80 IDS_UI_FONT_FAMILY_CROS)));
84 #else 81 #else
85 GetRenderText()->SetFont(textfield_->font()); 82 GetRenderText()->SetFont(textfield_->font());
86 #endif 83 #endif
87 // Set the default text style.
88 gfx::StyleRange default_style;
89 default_style.foreground = textfield_->text_color();
90 GetRenderText()->set_default_style(default_style);
91 GetRenderText()->ApplyDefaultStyle();
92 84
85 UpdateColorsFromTheme(GetNativeTheme());
93 set_context_menu_controller(this); 86 set_context_menu_controller(this);
94 set_drag_controller(this); 87 set_drag_controller(this);
95 } 88 }
96 89
97 NativeTextfieldViews::~NativeTextfieldViews() { 90 NativeTextfieldViews::~NativeTextfieldViews() {
98 } 91 }
99 92
100 //////////////////////////////////////////////////////////////////////////////// 93 ////////////////////////////////////////////////////////////////////////////////
101 // NativeTextfieldViews, View overrides: 94 // NativeTextfieldViews, View overrides:
102 95
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 262
270 void NativeTextfieldViews::OnFocus() { 263 void NativeTextfieldViews::OnFocus() {
271 NOTREACHED(); 264 NOTREACHED();
272 } 265 }
273 266
274 void NativeTextfieldViews::OnBlur() { 267 void NativeTextfieldViews::OnBlur() {
275 NOTREACHED(); 268 NOTREACHED();
276 } 269 }
277 270
278 void NativeTextfieldViews::OnNativeThemeChanged(const ui::NativeTheme* theme) { 271 void NativeTextfieldViews::OnNativeThemeChanged(const ui::NativeTheme* theme) {
279 gfx::RenderText* render_text = GetRenderText(); 272 UpdateColorsFromTheme(theme);
280 render_text->set_selection_color(
281 theme->GetSystemColor(ui::NativeTheme::kColorId_TextfieldSelectionColor));
282 render_text->set_selection_background_focused_color(
283 theme->GetSystemColor(
284 ui::NativeTheme::kColorId_TextfieldSelectionBackgroundFocused));
285 render_text->set_selection_background_unfocused_color(
286 theme->GetSystemColor(
287 ui::NativeTheme::kColorId_TextfieldSelectionBackgroundUnfocused));
288 } 273 }
289 274
290 void NativeTextfieldViews::SelectRect(const gfx::Point& start, 275 void NativeTextfieldViews::SelectRect(const gfx::Point& start,
291 const gfx::Point& end) { 276 const gfx::Point& end) {
292 if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) 277 if (GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE)
293 return; 278 return;
294 279
295 gfx::SelectionModel start_caret = GetRenderText()->FindCursorPosition(start); 280 gfx::SelectionModel start_caret = GetRenderText()->FindCursorPosition(start);
296 gfx::SelectionModel end_caret = GetRenderText()->FindCursorPosition(end); 281 gfx::SelectionModel end_caret = GetRenderText()->FindCursorPosition(end);
297 gfx::SelectionModel selection( 282 gfx::SelectionModel selection(
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 gfx::Insets insets = GetInsets(); 404 gfx::Insets insets = GetInsets();
420 textfield_->SetHorizontalMargins(insets.left(), insets.right()); 405 textfield_->SetHorizontalMargins(insets.left(), insets.right());
421 textfield_->SetVerticalMargins(insets.top(), insets.bottom()); 406 textfield_->SetVerticalMargins(insets.top(), insets.bottom());
422 } else { 407 } else {
423 textfield_->SetHorizontalMargins(0, 0); 408 textfield_->SetHorizontalMargins(0, 0);
424 textfield_->SetVerticalMargins(0, 0); 409 textfield_->SetVerticalMargins(0, 0);
425 } 410 }
426 } 411 }
427 412
428 void NativeTextfieldViews::UpdateTextColor() { 413 void NativeTextfieldViews::UpdateTextColor() {
414 gfx::StyleRange default_style(GetRenderText()->default_style());
415 default_style.foreground = textfield_->GetTextColor();
416 GetRenderText()->set_default_style(default_style);
417 GetRenderText()->ApplyDefaultStyle();
429 SchedulePaint(); 418 SchedulePaint();
430 } 419 }
431 420
432 void NativeTextfieldViews::UpdateBackgroundColor() { 421 void NativeTextfieldViews::UpdateBackgroundColor() {
433 // TODO(oshima): Background has to match the border's shape. 422 const SkColor color = textfield_->GetBackgroundColor();
434 set_background( 423 set_background(Background::CreateSolidBackground(color));
435 Background::CreateSolidBackground(textfield_->background_color())); 424 GetRenderText()->set_background_is_transparent(SkColorGetA(color) != 0xFF);
436 SchedulePaint();
437 }
438
439 void NativeTextfieldViews::UpdateCursorColor() {
440 SchedulePaint(); 425 SchedulePaint();
441 } 426 }
442 427
443 void NativeTextfieldViews::UpdateReadOnly() { 428 void NativeTextfieldViews::UpdateReadOnly() {
444 // Update the default text style.
445 gfx::StyleRange default_style(GetRenderText()->default_style());
446 default_style.foreground = textfield_->read_only() ? kReadonlyTextColor :
447 textfield_->text_color();
448 GetRenderText()->set_default_style(default_style);
449 GetRenderText()->ApplyDefaultStyle();
450
451 SchedulePaint();
452 OnTextInputTypeChanged(); 429 OnTextInputTypeChanged();
453 } 430 }
454 431
455 void NativeTextfieldViews::UpdateFont() { 432 void NativeTextfieldViews::UpdateFont() {
456 #if defined(OS_CHROMEOS) 433 #if defined(OS_CHROMEOS)
457 // For ChromeOS, we support a pre-defined font list per locale. UpdateFont() 434 // For ChromeOS, we support a pre-defined font list per locale. UpdateFont()
458 // only changes the font size, not the font family names. 435 // only changes the font size, not the font family names.
459 GetRenderText()->SetFontSize(textfield_->font().GetFontSize()); 436 GetRenderText()->SetFontSize(textfield_->font().GetFontSize());
460 #else 437 #else
461 GetRenderText()->SetFont(textfield_->font()); 438 GetRenderText()->SetFont(textfield_->font());
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
909 886
910 gfx::RenderText* NativeTextfieldViews::GetRenderText() const { 887 gfx::RenderText* NativeTextfieldViews::GetRenderText() const {
911 return model_->render_text(); 888 return model_->render_text();
912 } 889 }
913 890
914 string16 NativeTextfieldViews::GetTextForDisplay(const string16& text) { 891 string16 NativeTextfieldViews::GetTextForDisplay(const string16& text) {
915 return textfield_->style() & Textfield::STYLE_LOWERCASE ? 892 return textfield_->style() & Textfield::STYLE_LOWERCASE ?
916 base::i18n::ToLower(text) : text; 893 base::i18n::ToLower(text) : text;
917 } 894 }
918 895
896 void NativeTextfieldViews::UpdateColorsFromTheme(const ui::NativeTheme* theme) {
897 UpdateTextColor();
898 UpdateBackgroundColor();
899 gfx::RenderText* render_text = GetRenderText();
900 render_text->set_cursor_color(kDefaultCursorColor);
901 render_text->set_selection_color(theme->GetSystemColor(
902 ui::NativeTheme::kColorId_TextfieldSelectionColor));
903 render_text->set_selection_background_focused_color(theme->GetSystemColor(
904 ui::NativeTheme::kColorId_TextfieldSelectionBackgroundFocused));
905 render_text->set_selection_background_unfocused_color(theme->GetSystemColor(
906 ui::NativeTheme::kColorId_TextfieldSelectionBackgroundUnfocused));
907 }
908
919 void NativeTextfieldViews::UpdateCursor() { 909 void NativeTextfieldViews::UpdateCursor() {
920 is_cursor_visible_ = !is_cursor_visible_; 910 is_cursor_visible_ = !is_cursor_visible_;
921 RepaintCursor(); 911 RepaintCursor();
922 MessageLoop::current()->PostDelayedTask( 912 MessageLoop::current()->PostDelayedTask(
923 FROM_HERE, 913 FROM_HERE,
924 base::Bind(&NativeTextfieldViews::UpdateCursor, 914 base::Bind(&NativeTextfieldViews::UpdateCursor,
925 cursor_timer_.GetWeakPtr()), 915 cursor_timer_.GetWeakPtr()),
926 base::TimeDelta::FromMilliseconds( 916 base::TimeDelta::FromMilliseconds(
927 is_cursor_visible_ ? kCursorVisibleTimeMs : kCursorInvisibleTimeMs)); 917 is_cursor_visible_ ? kCursorVisibleTimeMs : kCursorInvisibleTimeMs));
928 } 918 }
929 919
930 void NativeTextfieldViews::RepaintCursor() { 920 void NativeTextfieldViews::RepaintCursor() {
931 gfx::Rect r(GetCaretBounds()); 921 gfx::Rect r(GetCaretBounds());
932 r.Inset(-1, -1, -1, -1); 922 r.Inset(-1, -1, -1, -1);
933 SchedulePaintInRect(r); 923 SchedulePaintInRect(r);
934 } 924 }
935 925
936 void NativeTextfieldViews::PaintTextAndCursor(gfx::Canvas* canvas) { 926 void NativeTextfieldViews::PaintTextAndCursor(gfx::Canvas* canvas) {
937 TRACE_EVENT0("views", "NativeTextfieldViews::PaintTextAndCursor"); 927 TRACE_EVENT0("views", "NativeTextfieldViews::PaintTextAndCursor");
938 canvas->Save(); 928 canvas->Save();
939 GetRenderText()->set_background_is_transparent(
940 !textfield_->use_default_background_color() &&
941 SkColorGetA(textfield_->background_color()) != 0xFF);
942 GetRenderText()->set_cursor_visible(is_drop_cursor_visible_ || 929 GetRenderText()->set_cursor_visible(is_drop_cursor_visible_ ||
943 (is_cursor_visible_ && !model_->HasSelection())); 930 (is_cursor_visible_ && !model_->HasSelection()));
944 GetRenderText()->set_cursor_color(
945 textfield_->use_default_cursor_color() ?
946 kDefaultCursorColor :
947 textfield_->cursor_color());
948 // Draw the text, cursor, and selection. 931 // Draw the text, cursor, and selection.
949 GetRenderText()->Draw(canvas); 932 GetRenderText()->Draw(canvas);
950 933
951 // Draw placeholder text if needed. 934 // Draw placeholder text if needed.
952 if (model_->GetText().empty() && 935 if (model_->GetText().empty() &&
953 !textfield_->placeholder_text().empty()) { 936 !textfield_->placeholder_text().empty()) {
954 canvas->DrawStringInt( 937 canvas->DrawStringInt(
955 textfield_->placeholder_text(), 938 textfield_->placeholder_text(),
956 GetRenderText()->GetFont(), 939 GetRenderText()->GetFont(),
957 textfield_->placeholder_text_color(), 940 textfield_->placeholder_text_color(),
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 // Filter out all control characters, including tab and new line characters, 1248 // Filter out all control characters, including tab and new line characters,
1266 // and all characters with Alt modifier. But we need to allow characters with 1249 // and all characters with Alt modifier. But we need to allow characters with
1267 // AltGr modifier. 1250 // AltGr modifier.
1268 // On Windows AltGr is represented by Alt+Ctrl, and on Linux it's a different 1251 // On Windows AltGr is represented by Alt+Ctrl, and on Linux it's a different
1269 // flag that we don't care about. 1252 // flag that we don't care about.
1270 return ((ch >= 0x20 && ch < 0x7F) || ch > 0x9F) && 1253 return ((ch >= 0x20 && ch < 0x7F) || ch > 0x9F) &&
1271 (flags & ~(ui::EF_SHIFT_DOWN | ui::EF_CAPS_LOCK_DOWN)) != ui::EF_ALT_DOWN; 1254 (flags & ~(ui::EF_SHIFT_DOWN | ui::EF_CAPS_LOCK_DOWN)) != ui::EF_ALT_DOWN;
1272 } 1255 }
1273 1256
1274 } // namespace views 1257 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698