Chromium Code Reviews| Index: ui/views/controls/label.cc |
| diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc |
| index 7145323fa1fc6969a27e38c81245c09a1f02b19f..002971389b56bcbfc691bb34138e29354eebe3ad 100644 |
| --- a/ui/views/controls/label.cc |
| +++ b/ui/views/controls/label.cc |
| @@ -22,12 +22,14 @@ |
| #include "ui/gfx/shadow_value.h" |
| #include "ui/gfx/text_elider.h" |
| #include "ui/gfx/text_utils.h" |
| +#include "ui/gfx/utf16_indexing.h" |
| #include "ui/native_theme/native_theme.h" |
| #include "ui/views/background.h" |
| namespace { |
| const int kCachedSizeLimit = 10; |
| +const base::char16 kPasswordReplacementChar = '*'; |
| } // namespace |
| @@ -62,7 +64,20 @@ void Label::SetFontList(const gfx::FontList& font_list) { |
| void Label::SetText(const base::string16& text) { |
| if (text == text_) |
|
msw
2014/04/03 18:27:48
nit: flip the condition and drop the return statem
Mike West
2014/04/04 07:05:16
Done.
|
| return; |
| + SetTextInternal(text); |
| +} |
| + |
| +void Label::SetTextInternal(const base::string16& text) { |
| text_ = text; |
| + |
| + if (is_obscured_) { |
| + size_t obscured_text_length = |
| + static_cast<size_t>(gfx::UTF16IndexToOffset(text_, 0, text_.length())); |
| + layout_text_.assign(obscured_text_length, kPasswordReplacementChar); |
| + } else { |
| + layout_text_ = text_; |
| + } |
| + |
| ResetCachedSize(); |
| PreferredSizeChanged(); |
| SchedulePaint(); |
| @@ -140,6 +155,13 @@ void Label::SetMultiLine(bool multi_line) { |
| } |
| } |
| +void Label::SetObscured(bool obscured) { |
| + if (obscured != is_obscured_) { |
| + is_obscured_ = obscured; |
| + SetTextInternal(text_); |
| + } |
| +} |
| + |
| void Label::SetAllowCharacterBreak(bool allow_character_break) { |
| if (allow_character_break != allow_character_break_) { |
| allow_character_break_ = allow_character_break; |
| @@ -167,7 +189,7 @@ void Label::SizeToFit(int max_width) { |
| DCHECK(is_multi_line_); |
| std::vector<base::string16> lines; |
| - base::SplitString(text_, '\n', &lines); |
| + base::SplitString(layout_text(), '\n', &lines); |
| int label_width = 0; |
| for (std::vector<base::string16>::const_iterator iter = lines.begin(); |
| @@ -242,7 +264,8 @@ int Label::GetHeightForWidth(int w) { |
| int h = font_list_.GetHeight(); |
| const int flags = ComputeDrawStringFlags(); |
| - gfx::Canvas::SizeStringInt(text_, font_list_, &w, &h, line_height_, flags); |
| + gfx::Canvas::SizeStringInt( |
| + layout_text(), font_list_, &w, &h, line_height_, flags); |
| cached_heights_[cached_heights_cursor_] = gfx::Size(cache_width, h); |
| cached_heights_cursor_ = (cached_heights_cursor_ + 1) % kCachedSizeLimit; |
| return h + GetInsets().height(); |
| @@ -282,7 +305,7 @@ bool Label::GetTooltipText(const gfx::Point& p, base::string16* tooltip) const { |
| // Show the full text if the text does not fit. |
| if (ShouldShowDefaultTooltip()) { |
| - *tooltip = text_; |
| + *tooltip = layout_text(); |
| return true; |
| } |
| @@ -292,7 +315,7 @@ bool Label::GetTooltipText(const gfx::Point& p, base::string16* tooltip) const { |
| void Label::GetAccessibleState(ui::AXViewState* state) { |
| state->role = ui::AX_ROLE_STATIC_TEXT; |
| state->AddStateFlag(ui::AX_STATE_READ_ONLY); |
| - state->name = text_; |
| + state->name = layout_text(); |
| } |
| void Label::PaintText(gfx::Canvas* canvas, |
| @@ -328,7 +351,8 @@ gfx::Size Label::GetTextSize() const { |
| int flags = ComputeDrawStringFlags(); |
| if (!is_multi_line_) |
| flags |= gfx::Canvas::NO_ELLIPSIS; |
| - gfx::Canvas::SizeStringInt(text_, font_list_, &w, &h, line_height_, flags); |
| + gfx::Canvas::SizeStringInt( |
| + layout_text(), font_list_, &w, &h, line_height_, flags); |
| text_size_.SetSize(w, h); |
| text_size_valid_ = true; |
| } |
| @@ -366,6 +390,7 @@ void Label::Init(const base::string16& text, const gfx::FontList& font_list) { |
| horizontal_alignment_ = gfx::ALIGN_CENTER; |
| line_height_ = 0; |
| is_multi_line_ = false; |
| + is_obscured_ = false; |
| allow_character_break_ = false; |
| elide_behavior_ = ELIDE_AT_END; |
| collapse_when_hidden_ = false; |
| @@ -430,7 +455,7 @@ int Label::ComputeDrawStringFlags() const { |
| if (directionality_mode_ == AUTO_DETECT_DIRECTIONALITY) { |
| base::i18n::TextDirection direction = |
| - base::i18n::GetFirstStrongCharacterDirection(text_); |
| + base::i18n::GetFirstStrongCharacterDirection(layout_text()); |
| if (direction == base::i18n::RIGHT_TO_LEFT) |
| flags |= gfx::Canvas::FORCE_RTL_DIRECTIONALITY; |
| else |
| @@ -481,20 +506,26 @@ void Label::CalculateDrawStringParams(base::string16* paint_text, |
| // TODO(msw): Use ElideRectangleText to support eliding multi-line text. Once |
| // this is done, we can set NO_ELLIPSIS unconditionally at the bottom. |
| if (is_multi_line_ || (elide_behavior_ == NO_ELIDE)) { |
| - *paint_text = text_; |
| + *paint_text = layout_text(); |
| } else if (elide_behavior_ == ELIDE_AT_BEGINNING) { |
| - *paint_text = gfx::ElideText(text_, font_list_, GetAvailableRect().width(), |
| + *paint_text = gfx::ElideText(layout_text(), |
| + font_list_, |
| + GetAvailableRect().width(), |
| gfx::ELIDE_AT_BEGINNING); |
| } else if (elide_behavior_ == ELIDE_IN_MIDDLE) { |
| - *paint_text = gfx::ElideText(text_, font_list_, GetAvailableRect().width(), |
| + *paint_text = gfx::ElideText(layout_text(), |
| + font_list_, |
| + GetAvailableRect().width(), |
| gfx::ELIDE_IN_MIDDLE); |
| } else if (elide_behavior_ == ELIDE_AT_END) { |
| - *paint_text = gfx::ElideText(text_, font_list_, GetAvailableRect().width(), |
| + *paint_text = gfx::ElideText(layout_text(), |
| + font_list_, |
| + GetAvailableRect().width(), |
| gfx::ELIDE_AT_END); |
| } else { |
| DCHECK_EQ(ELIDE_AS_EMAIL, elide_behavior_); |
| - *paint_text = gfx::ElideEmail(text_, font_list_, |
| - GetAvailableRect().width()); |
| + *paint_text = |
| + gfx::ElideEmail(layout_text(), font_list_, GetAvailableRect().width()); |
| } |
| *text_bounds = GetTextBounds(); |
| @@ -527,8 +558,9 @@ void Label::ResetCachedSize() { |
| } |
| bool Label::ShouldShowDefaultTooltip() const { |
| - return !is_multi_line_ && |
| - gfx::GetStringWidth(text_, font_list_) > GetAvailableRect().width(); |
| + return !is_multi_line_ && !is_obscured_ && |
| + gfx::GetStringWidth(layout_text(), font_list_) > |
| + GetAvailableRect().width(); |
| } |
| } // namespace views |