| OLD | NEW |
| 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/label.h" | 5 #include "ui/views/controls/label.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 void Label::SetLineHeight(int height) { | 137 void Label::SetLineHeight(int height) { |
| 138 if (height != line_height_) { | 138 if (height != line_height_) { |
| 139 line_height_ = height; | 139 line_height_ = height; |
| 140 ResetCachedSize(); | 140 ResetCachedSize(); |
| 141 PreferredSizeChanged(); | 141 PreferredSizeChanged(); |
| 142 SchedulePaint(); | 142 SchedulePaint(); |
| 143 } | 143 } |
| 144 } | 144 } |
| 145 | 145 |
| 146 void Label::SetMultiLine(bool multi_line) { | 146 void Label::SetMultiLine(bool multi_line) { |
| 147 DCHECK(!multi_line || (elide_behavior_ != ELIDE_IN_MIDDLE && | 147 DCHECK(!multi_line || (elide_behavior_ == gfx::ELIDE_TAIL || |
| 148 elide_behavior_ != ELIDE_AT_BEGINNING)); | 148 elide_behavior_ == gfx::TRUNCATE)); |
| 149 if (multi_line != is_multi_line_) { | 149 if (multi_line != is_multi_line_) { |
| 150 is_multi_line_ = multi_line; | 150 is_multi_line_ = multi_line; |
| 151 ResetCachedSize(); | 151 ResetCachedSize(); |
| 152 PreferredSizeChanged(); | 152 PreferredSizeChanged(); |
| 153 SchedulePaint(); | 153 SchedulePaint(); |
| 154 } | 154 } |
| 155 } | 155 } |
| 156 | 156 |
| 157 void Label::SetObscured(bool obscured) { | 157 void Label::SetObscured(bool obscured) { |
| 158 if (obscured != is_obscured_) { | 158 if (obscured != is_obscured_) { |
| 159 is_obscured_ = obscured; | 159 is_obscured_ = obscured; |
| 160 SetTextInternal(text_); | 160 SetTextInternal(text_); |
| 161 } | 161 } |
| 162 } | 162 } |
| 163 | 163 |
| 164 void Label::SetAllowCharacterBreak(bool allow_character_break) { | 164 void Label::SetAllowCharacterBreak(bool allow_character_break) { |
| 165 if (allow_character_break != allow_character_break_) { | 165 if (allow_character_break != allow_character_break_) { |
| 166 allow_character_break_ = allow_character_break; | 166 allow_character_break_ = allow_character_break; |
| 167 ResetCachedSize(); | 167 ResetCachedSize(); |
| 168 PreferredSizeChanged(); | 168 PreferredSizeChanged(); |
| 169 SchedulePaint(); | 169 SchedulePaint(); |
| 170 } | 170 } |
| 171 } | 171 } |
| 172 | 172 |
| 173 void Label::SetElideBehavior(ElideBehavior elide_behavior) { | 173 void Label::SetElideBehavior(gfx::ElideBehavior elide_behavior) { |
| 174 DCHECK(elide_behavior != ELIDE_IN_MIDDLE || !is_multi_line_); | 174 DCHECK(!is_multi_line_ || (elide_behavior_ == gfx::ELIDE_TAIL || |
| 175 elide_behavior_ == gfx::TRUNCATE)); |
| 175 if (elide_behavior != elide_behavior_) { | 176 if (elide_behavior != elide_behavior_) { |
| 176 elide_behavior_ = elide_behavior; | 177 elide_behavior_ = elide_behavior; |
| 177 ResetCachedSize(); | 178 ResetCachedSize(); |
| 178 PreferredSizeChanged(); | 179 PreferredSizeChanged(); |
| 179 SchedulePaint(); | 180 SchedulePaint(); |
| 180 } | 181 } |
| 181 } | 182 } |
| 182 | 183 |
| 183 void Label::SetTooltipText(const base::string16& tooltip_text) { | 184 void Label::SetTooltipText(const base::string16& tooltip_text) { |
| 184 tooltip_text_ = tooltip_text; | 185 tooltip_text_ = tooltip_text; |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 void Label::GetAccessibleState(ui::AXViewState* state) { | 316 void Label::GetAccessibleState(ui::AXViewState* state) { |
| 316 state->role = ui::AX_ROLE_STATIC_TEXT; | 317 state->role = ui::AX_ROLE_STATIC_TEXT; |
| 317 state->AddStateFlag(ui::AX_STATE_READ_ONLY); | 318 state->AddStateFlag(ui::AX_STATE_READ_ONLY); |
| 318 state->name = layout_text(); | 319 state->name = layout_text(); |
| 319 } | 320 } |
| 320 | 321 |
| 321 void Label::PaintText(gfx::Canvas* canvas, | 322 void Label::PaintText(gfx::Canvas* canvas, |
| 322 const base::string16& text, | 323 const base::string16& text, |
| 323 const gfx::Rect& text_bounds, | 324 const gfx::Rect& text_bounds, |
| 324 int flags) { | 325 int flags) { |
| 325 gfx::ShadowValues shadows; | |
| 326 if (has_shadow_) { | |
| 327 shadows.push_back(gfx::ShadowValue(shadow_offset_, shadow_blur_, | |
| 328 enabled() ? enabled_shadow_color_ : disabled_shadow_color_)); | |
| 329 } | |
| 330 SkColor color = enabled() ? actual_enabled_color_ : actual_disabled_color_; | 326 SkColor color = enabled() ? actual_enabled_color_ : actual_disabled_color_; |
| 331 canvas->DrawStringRectWithShadows(text, font_list_, color, text_bounds, | 327 if (elide_behavior_ == gfx::FADE_TAIL) { |
| 332 line_height_, flags, shadows); | 328 canvas->DrawFadedString(text, font_list_, color, text_bounds, flags); |
| 329 } else { |
| 330 gfx::ShadowValues shadows; |
| 331 if (has_shadow_) { |
| 332 shadows.push_back(gfx::ShadowValue(shadow_offset_, shadow_blur_, |
| 333 enabled() ? enabled_shadow_color_ : disabled_shadow_color_)); |
| 334 } |
| 335 canvas->DrawStringRectWithShadows(text, font_list_, color, text_bounds, |
| 336 line_height_, flags, shadows); |
| 333 | 337 |
| 334 if (SkColorGetA(halo_color_) != SK_AlphaTRANSPARENT) { | 338 if (SkColorGetA(halo_color_) != SK_AlphaTRANSPARENT) { |
| 335 canvas->DrawStringRectWithHalo(text, font_list_, color, halo_color_, | 339 canvas->DrawStringRectWithHalo(text, font_list_, color, halo_color_, |
| 336 text_bounds, flags); | 340 text_bounds, flags); |
| 341 } |
| 337 } | 342 } |
| 338 | 343 |
| 339 if (HasFocus()) { | 344 if (HasFocus()) { |
| 340 gfx::Rect focus_bounds = text_bounds; | 345 gfx::Rect focus_bounds = text_bounds; |
| 341 focus_bounds.Inset(-kFocusBorderPadding, -kFocusBorderPadding); | 346 focus_bounds.Inset(-kFocusBorderPadding, -kFocusBorderPadding); |
| 342 canvas->DrawFocusRect(focus_bounds); | 347 canvas->DrawFocusRect(focus_bounds); |
| 343 } | 348 } |
| 344 } | 349 } |
| 345 | 350 |
| 346 gfx::Size Label::GetTextSize() const { | 351 gfx::Size Label::GetTextSize() const { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 void Label::Init(const base::string16& text, const gfx::FontList& font_list) { | 396 void Label::Init(const base::string16& text, const gfx::FontList& font_list) { |
| 392 font_list_ = font_list; | 397 font_list_ = font_list; |
| 393 enabled_color_set_ = disabled_color_set_ = background_color_set_ = false; | 398 enabled_color_set_ = disabled_color_set_ = background_color_set_ = false; |
| 394 auto_color_readability_ = true; | 399 auto_color_readability_ = true; |
| 395 UpdateColorsFromTheme(ui::NativeTheme::instance()); | 400 UpdateColorsFromTheme(ui::NativeTheme::instance()); |
| 396 horizontal_alignment_ = gfx::ALIGN_CENTER; | 401 horizontal_alignment_ = gfx::ALIGN_CENTER; |
| 397 line_height_ = 0; | 402 line_height_ = 0; |
| 398 is_multi_line_ = false; | 403 is_multi_line_ = false; |
| 399 is_obscured_ = false; | 404 is_obscured_ = false; |
| 400 allow_character_break_ = false; | 405 allow_character_break_ = false; |
| 401 elide_behavior_ = ELIDE_AT_END; | 406 elide_behavior_ = gfx::ELIDE_TAIL; |
| 402 collapse_when_hidden_ = false; | 407 collapse_when_hidden_ = false; |
| 403 directionality_mode_ = USE_UI_DIRECTIONALITY; | 408 directionality_mode_ = USE_UI_DIRECTIONALITY; |
| 404 enabled_shadow_color_ = 0; | 409 enabled_shadow_color_ = 0; |
| 405 disabled_shadow_color_ = 0; | 410 disabled_shadow_color_ = 0; |
| 406 shadow_offset_.SetPoint(1, 1); | 411 shadow_offset_.SetPoint(1, 1); |
| 407 has_shadow_ = false; | 412 has_shadow_ = false; |
| 408 shadow_blur_ = 0; | 413 shadow_blur_ = 0; |
| 409 halo_color_ = SK_ColorTRANSPARENT; | 414 halo_color_ = SK_ColorTRANSPARENT; |
| 410 cached_heights_.resize(kCachedSizeLimit); | 415 cached_heights_.resize(kCachedSizeLimit); |
| 411 ResetCachedSize(); | 416 ResetCachedSize(); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 gfx::Rect bounds(size()); | 509 gfx::Rect bounds(size()); |
| 505 bounds.Inset(GetInsets()); | 510 bounds.Inset(GetInsets()); |
| 506 return bounds; | 511 return bounds; |
| 507 } | 512 } |
| 508 | 513 |
| 509 void Label::CalculateDrawStringParams(base::string16* paint_text, | 514 void Label::CalculateDrawStringParams(base::string16* paint_text, |
| 510 gfx::Rect* text_bounds, | 515 gfx::Rect* text_bounds, |
| 511 int* flags) const { | 516 int* flags) const { |
| 512 DCHECK(paint_text && text_bounds && flags); | 517 DCHECK(paint_text && text_bounds && flags); |
| 513 | 518 |
| 514 // TODO(msw): Use ElideRectangleText to support eliding multi-line text. Once | 519 const bool forbid_ellipsis = elide_behavior_ == gfx::TRUNCATE || |
| 515 // this is done, we can set NO_ELLIPSIS unconditionally at the bottom. | 520 elide_behavior_ == gfx::FADE_TAIL; |
| 516 if (is_multi_line_ || (elide_behavior_ == NO_ELIDE)) { | 521 if (is_multi_line_ || forbid_ellipsis) { |
| 517 *paint_text = layout_text(); | 522 *paint_text = layout_text(); |
| 518 } else if (elide_behavior_ == ELIDE_AT_BEGINNING) { | |
| 519 *paint_text = gfx::ElideText(layout_text(), | |
| 520 font_list_, | |
| 521 GetAvailableRect().width(), | |
| 522 gfx::ELIDE_AT_BEGINNING); | |
| 523 } else if (elide_behavior_ == ELIDE_IN_MIDDLE) { | |
| 524 *paint_text = gfx::ElideText(layout_text(), | |
| 525 font_list_, | |
| 526 GetAvailableRect().width(), | |
| 527 gfx::ELIDE_IN_MIDDLE); | |
| 528 } else if (elide_behavior_ == ELIDE_AT_END) { | |
| 529 *paint_text = gfx::ElideText(layout_text(), | |
| 530 font_list_, | |
| 531 GetAvailableRect().width(), | |
| 532 gfx::ELIDE_AT_END); | |
| 533 } else { | 523 } else { |
| 534 DCHECK_EQ(ELIDE_AS_EMAIL, elide_behavior_); | 524 *paint_text = gfx::ElideText(layout_text(), font_list_, |
| 535 *paint_text = | 525 GetAvailableRect().width(), elide_behavior_); |
| 536 gfx::ElideEmail(layout_text(), font_list_, GetAvailableRect().width()); | |
| 537 } | 526 } |
| 538 | 527 |
| 539 *text_bounds = GetTextBounds(); | 528 *text_bounds = GetTextBounds(); |
| 540 *flags = ComputeDrawStringFlags(); | 529 *flags = ComputeDrawStringFlags(); |
| 541 if (!is_multi_line_ || (elide_behavior_ == NO_ELIDE)) | 530 // TODO(msw): Elide multi-line text with ElideRectangleText instead. |
| 542 *flags |= gfx::Canvas::NO_ELLIPSIS; | 531 if (!is_multi_line_ || forbid_ellipsis) |
| 532 *flags |= gfx::Canvas::NO_ELLIPSIS; |
| 543 } | 533 } |
| 544 | 534 |
| 545 void Label::UpdateColorsFromTheme(const ui::NativeTheme* theme) { | 535 void Label::UpdateColorsFromTheme(const ui::NativeTheme* theme) { |
| 546 if (!enabled_color_set_) { | 536 if (!enabled_color_set_) { |
| 547 requested_enabled_color_ = theme->GetSystemColor( | 537 requested_enabled_color_ = theme->GetSystemColor( |
| 548 ui::NativeTheme::kColorId_LabelEnabledColor); | 538 ui::NativeTheme::kColorId_LabelEnabledColor); |
| 549 } | 539 } |
| 550 if (!disabled_color_set_) { | 540 if (!disabled_color_set_) { |
| 551 requested_disabled_color_ = theme->GetSystemColor( | 541 requested_disabled_color_ = theme->GetSystemColor( |
| 552 ui::NativeTheme::kColorId_LabelDisabledColor); | 542 ui::NativeTheme::kColorId_LabelDisabledColor); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 565 cached_heights_[i] = gfx::Size(); | 555 cached_heights_[i] = gfx::Size(); |
| 566 } | 556 } |
| 567 | 557 |
| 568 bool Label::ShouldShowDefaultTooltip() const { | 558 bool Label::ShouldShowDefaultTooltip() const { |
| 569 return !is_multi_line_ && !is_obscured_ && | 559 return !is_multi_line_ && !is_obscured_ && |
| 570 gfx::GetStringWidth(layout_text(), font_list_) > | 560 gfx::GetStringWidth(layout_text(), font_list_) > |
| 571 GetAvailableRect().width(); | 561 GetAvailableRect().width(); |
| 572 } | 562 } |
| 573 | 563 |
| 574 } // namespace views | 564 } // namespace views |
| OLD | NEW |