Index: chrome/browser/ui/views/autofill/decorated_textfield.cc |
diff --git a/chrome/browser/ui/views/autofill/decorated_textfield.cc b/chrome/browser/ui/views/autofill/decorated_textfield.cc |
index 94e8202c7655ffbb8edc403a80d7b34dd58294a8..fa3e816f95fbd7497dd65912d21bc21fb2063b31 100644 |
--- a/chrome/browser/ui/views/autofill/decorated_textfield.cc |
+++ b/chrome/browser/ui/views/autofill/decorated_textfield.cc |
@@ -10,6 +10,7 @@ |
#include "ui/views/background.h" |
#include "ui/views/controls/button/label_button.h" |
#include "ui/views/controls/focusable_border.h" |
+#include "ui/views/controls/textfield/native_textfield_views.h" |
#include "ui/views/controls/textfield/textfield_controller.h" |
namespace { |
@@ -24,28 +25,38 @@ |
// static |
const char DecoratedTextfield::kViewClassName[] = "autofill/DecoratedTextfield"; |
+const int DecoratedTextfield::kMagicInsetNumber = 6; |
+ |
DecoratedTextfield::DecoratedTextfield( |
const base::string16& default_value, |
const base::string16& placeholder, |
views::TextfieldController* controller) |
- : invalid_(false), |
+ : border_(new views::FocusableBorder()), |
+ invalid_(false), |
editable_(true) { |
UpdateBackground(); |
- UpdateBorder(); |
+ |
+ set_border(border_); |
+ // Removes the border from |native_wrapper_|. |
+ RemoveBorder(); |
set_placeholder_text(placeholder); |
SetText(default_value); |
SetController(controller); |
+ SetHorizontalMargins(0, 0); |
} |
DecoratedTextfield::~DecoratedTextfield() {} |
void DecoratedTextfield::SetInvalid(bool invalid) { |
- if (invalid_ == invalid) |
+ invalid_ = invalid; |
+ if (!editable_) |
return; |
- invalid_ = invalid; |
- UpdateBorder(); |
+ if (invalid) |
+ border_->SetColor(kWarningColor); |
+ else |
+ border_->UseDefaultColor(); |
SchedulePaint(); |
} |
@@ -54,7 +65,14 @@ |
return; |
editable_ = editable; |
- UpdateBorder(); |
+ if (editable) { |
+ SetInvalid(invalid_); |
+ UseDefaultBackgroundColor(); |
+ } else { |
+ border_->SetColor(SK_ColorTRANSPARENT); |
+ SetBackgroundColor(SK_ColorTRANSPARENT); |
+ } |
+ |
UpdateBackground(); |
SetEnabled(editable); |
IconChanged(); |
@@ -93,7 +111,10 @@ |
} |
base::string16 DecoratedTextfield::GetPlaceholderText() const { |
- return editable_ ? views::Textfield::GetPlaceholderText() : base::string16(); |
+ if (!editable_) |
+ return base::string16(); |
+ |
+ return views::Textfield::GetPlaceholderText(); |
} |
const char* DecoratedTextfield::GetClassName() const { |
@@ -104,14 +125,25 @@ |
views::View* handler = views::Textfield::GetEventHandlerForRect(rect); |
if (handler->GetClassName() == TooltipIcon::kViewClassName) |
return handler; |
- return this; |
+ return textfield_view_; |
+} |
+ |
+void DecoratedTextfield::OnFocus() { |
+ views::Textfield::OnFocus(); |
+ SchedulePaint(); |
+} |
+ |
+void DecoratedTextfield::OnBlur() { |
+ views::Textfield::OnBlur(); |
+ SchedulePaint(); |
} |
gfx::Size DecoratedTextfield::GetPreferredSize() { |
- static const int height = |
- views::LabelButton(NULL, base::string16()).GetPreferredSize().height(); |
- const gfx::Size size = views::Textfield::GetPreferredSize(); |
- return gfx::Size(size.width(), std::max(size.height(), height)); |
+ int w = views::Textfield::GetPreferredSize().width(); |
+ views::LabelButton button(NULL, base::string16()); |
+ button.SetStyle(views::Button::STYLE_BUTTON); |
+ int h = button.GetPreferredSize().height(); |
+ return gfx::Size(w, h - kMagicInsetNumber); |
} |
void DecoratedTextfield::Layout() { |
@@ -125,45 +157,29 @@ |
bounds.right() - icon_size.width() - kTextfieldIconPadding; |
// Vertically centered. |
int y = bounds.y() + (bounds.height() - icon_size.height()) / 2; |
- icon_view_->SetBounds(x, y, icon_size.width(), icon_size.height()); |
+ icon_view_->SetBounds(x, |
+ y, |
+ icon_size.width(), |
+ icon_size.height()); |
} |
} |
void DecoratedTextfield::UpdateBackground() { |
- if (editable_) |
- UseDefaultBackgroundColor(); |
- else |
- SetBackgroundColor(SK_ColorTRANSPARENT); |
set_background( |
views::Background::CreateSolidBackground(GetBackgroundColor())); |
} |
-void DecoratedTextfield::UpdateBorder() { |
- views::FocusableBorder* border = new views::FocusableBorder(); |
- if (invalid_) |
- border->SetColor(kWarningColor); |
- else if (!editable_) |
- border->SetColor(SK_ColorTRANSPARENT); |
- |
- const gfx::Insets insets = GetInsets(); |
- int left = icon_view_ ? |
- icon_view_->GetPreferredSize().width() + 2 * kTextfieldIconPadding : 0; |
- int right = 0; |
- if (base::i18n::IsRTL()) |
- std::swap(left, right); |
- border->SetInsets(insets.top(), insets.left() + left, insets.bottom(), |
- insets.right() + right); |
- set_border(border); |
-} |
- |
void DecoratedTextfield::IconChanged() { |
// Don't show the icon if nothing else is showing. |
- const bool visible = editable_ || !text().empty(); |
- if (icon_view_->visible() == visible) |
- return; |
+ icon_view_->SetVisible(editable_ || !text().empty()); |
- icon_view_->SetVisible(visible); |
- UpdateBorder(); |
+ int icon_space = icon_view_ ? |
+ icon_view_->GetPreferredSize().width() + 2 * kTextfieldIconPadding : 0; |
+ |
+ bool is_rtl = base::i18n::IsRTL(); |
+ SetHorizontalMargins(is_rtl ? icon_space : 0, is_rtl ? 0 : icon_space); |
+ |
+ Layout(); |
SchedulePaint(); |
} |