| 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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 | 105 |
| 106 void Label::SetShadowOffset(int x, int y) { | 106 void Label::SetShadowOffset(int x, int y) { |
| 107 shadow_offset_.SetPoint(x, y); | 107 shadow_offset_.SetPoint(x, y); |
| 108 } | 108 } |
| 109 | 109 |
| 110 void Label::ClearEmbellishing() { | 110 void Label::ClearEmbellishing() { |
| 111 has_shadow_ = false; | 111 has_shadow_ = false; |
| 112 } | 112 } |
| 113 | 113 |
| 114 void Label::SetHorizontalAlignment(Alignment alignment) { | 114 void Label::SetHorizontalAlignment(Alignment alignment) { |
| 115 // If the View's UI layout is right-to-left and directionality_mode_ is | 115 // TODO(msw): Change Alignment to LEADING/TRAILING? |
| 116 // USE_UI_DIRECTIONALITY, we need to flip the alignment so that the alignment | 116 // TODO(msw): Check (and potentially flip) the alignment when setting text? |
| 117 // settings take into account the text directionality. | 117 // TODO(msw): Check against multi-line label regressions (not RenderText)... |
| 118 if (base::i18n::IsRTL() && (directionality_mode_ == USE_UI_DIRECTIONALITY) && | 118 // If the string's directionality is right-to-left, flip the alignment. |
| 119 (alignment != ALIGN_CENTER)) | 119 if (base::i18n::GetFirstStrongCharacterDirection(text()) == |
| 120 base::i18n::RIGHT_TO_LEFT && |
| 121 alignment != ALIGN_CENTER) { |
| 120 alignment = (alignment == ALIGN_LEFT) ? ALIGN_RIGHT : ALIGN_LEFT; | 122 alignment = (alignment == ALIGN_LEFT) ? ALIGN_RIGHT : ALIGN_LEFT; |
| 123 } |
| 121 if (horiz_alignment_ != alignment) { | 124 if (horiz_alignment_ != alignment) { |
| 122 horiz_alignment_ = alignment; | 125 horiz_alignment_ = alignment; |
| 123 SchedulePaint(); | 126 SchedulePaint(); |
| 124 } | 127 } |
| 125 } | 128 } |
| 126 | 129 |
| 127 void Label::SetMultiLine(bool multi_line) { | 130 void Label::SetMultiLine(bool multi_line) { |
| 128 DCHECK(!multi_line || !elide_in_middle_); | 131 DCHECK(!multi_line || !elide_in_middle_); |
| 129 if (multi_line != is_multi_line_) { | 132 if (multi_line != is_multi_line_) { |
| 130 is_multi_line_ = multi_line; | 133 is_multi_line_ = multi_line; |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 background_color_ = ui::NativeTheme::instance()->GetSystemColor( | 369 background_color_ = ui::NativeTheme::instance()->GetSystemColor( |
| 367 ui::NativeTheme::kColorId_LabelBackgroundColor); | 370 ui::NativeTheme::kColorId_LabelBackgroundColor); |
| 368 auto_color_readability_ = true; | 371 auto_color_readability_ = true; |
| 369 RecalculateColors(); | 372 RecalculateColors(); |
| 370 horiz_alignment_ = ALIGN_CENTER; | 373 horiz_alignment_ = ALIGN_CENTER; |
| 371 is_multi_line_ = false; | 374 is_multi_line_ = false; |
| 372 allow_character_break_ = false; | 375 allow_character_break_ = false; |
| 373 elide_in_middle_ = false; | 376 elide_in_middle_ = false; |
| 374 is_email_ = false; | 377 is_email_ = false; |
| 375 collapse_when_hidden_ = false; | 378 collapse_when_hidden_ = false; |
| 376 directionality_mode_ = USE_UI_DIRECTIONALITY; | |
| 377 paint_as_focused_ = false; | 379 paint_as_focused_ = false; |
| 378 has_focus_border_ = false; | 380 has_focus_border_ = false; |
| 379 enabled_shadow_color_ = 0; | 381 enabled_shadow_color_ = 0; |
| 380 disabled_shadow_color_ = 0; | 382 disabled_shadow_color_ = 0; |
| 381 shadow_offset_.SetPoint(1, 1); | 383 shadow_offset_.SetPoint(1, 1); |
| 382 has_shadow_ = false; | 384 has_shadow_ = false; |
| 383 | 385 |
| 384 SetText(text); | 386 SetText(text); |
| 385 } | 387 } |
| 386 | 388 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 return gfx::Rect(text_origin, text_size); | 439 return gfx::Rect(text_origin, text_size); |
| 438 } | 440 } |
| 439 | 441 |
| 440 int Label::ComputeDrawStringFlags() const { | 442 int Label::ComputeDrawStringFlags() const { |
| 441 int flags = 0; | 443 int flags = 0; |
| 442 | 444 |
| 443 // We can't use subpixel rendering if the background is non-opaque. | 445 // We can't use subpixel rendering if the background is non-opaque. |
| 444 if (SkColorGetA(background_color_) != 0xFF) | 446 if (SkColorGetA(background_color_) != 0xFF) |
| 445 flags |= gfx::Canvas::NO_SUBPIXEL_RENDERING; | 447 flags |= gfx::Canvas::NO_SUBPIXEL_RENDERING; |
| 446 | 448 |
| 447 if (directionality_mode_ == AUTO_DETECT_DIRECTIONALITY) { | |
| 448 base::i18n::TextDirection direction = | |
| 449 base::i18n::GetFirstStrongCharacterDirection(text_); | |
| 450 if (direction == base::i18n::RIGHT_TO_LEFT) | |
| 451 flags |= gfx::Canvas::FORCE_RTL_DIRECTIONALITY; | |
| 452 else | |
| 453 flags |= gfx::Canvas::FORCE_LTR_DIRECTIONALITY; | |
| 454 } | |
| 455 | |
| 456 if (!is_multi_line_) | 449 if (!is_multi_line_) |
| 457 return flags; | 450 return flags; |
| 458 | 451 |
| 459 flags |= gfx::Canvas::MULTI_LINE; | 452 flags |= gfx::Canvas::MULTI_LINE; |
| 460 #if !defined(OS_WIN) | 453 #if !defined(OS_WIN) |
| 461 // Don't elide multiline labels on Linux. | 454 // Don't elide multiline labels on Linux. |
| 462 // Todo(davemoore): Do we depend on eliding multiline text? | 455 // Todo(davemoore): Do we depend on eliding multiline text? |
| 463 // Pango insists on limiting the number of lines to one if text is | 456 // Pango insists on limiting the number of lines to one if text is |
| 464 // elided. You can get around this if you can pass a maximum height | 457 // elided. You can get around this if you can pass a maximum height |
| 465 // but we don't currently have that data when we call the pango code. | 458 // but we don't currently have that data when we call the pango code. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 492 void Label::CalculateDrawStringParams(string16* paint_text, | 485 void Label::CalculateDrawStringParams(string16* paint_text, |
| 493 gfx::Rect* text_bounds, | 486 gfx::Rect* text_bounds, |
| 494 int* flags) const { | 487 int* flags) const { |
| 495 DCHECK(paint_text && text_bounds && flags); | 488 DCHECK(paint_text && text_bounds && flags); |
| 496 | 489 |
| 497 if (!url_.is_empty()) { | 490 if (!url_.is_empty()) { |
| 498 // TODO(jungshik) : Figure out how to get 'intl.accept_languages' | 491 // TODO(jungshik) : Figure out how to get 'intl.accept_languages' |
| 499 // preference and use it when calling ElideUrl. | 492 // preference and use it when calling ElideUrl. |
| 500 *paint_text = | 493 *paint_text = |
| 501 ui::ElideUrl(url_, font_, GetAvailableRect().width(), std::string()); | 494 ui::ElideUrl(url_, font_, GetAvailableRect().width(), std::string()); |
| 502 | 495 // Ensure that URLs have LTR directionality. |
| 503 // An URLs is always treated as an LTR text and therefore we should | 496 // TODO(msw): Check cases like "/\x05d0", "://\x05d0". |
| 504 // explicitly mark it as such if the locale is RTL so that URLs containing | 497 DCHECK_EQ(base::i18n::GetFirstStrongCharacterDirection(*paint_text), |
| 505 // Hebrew or Arabic characters are displayed correctly. | 498 base::i18n::LEFT_TO_RIGHT); |
| 506 // | |
| 507 // Note that we don't check the View's UI layout setting in order to | |
| 508 // determine whether or not to insert the special Unicode formatting | |
| 509 // characters. We use the locale settings because an URL is always treated | |
| 510 // as an LTR string, even if its containing view does not use an RTL UI | |
| 511 // layout. | |
| 512 *paint_text = base::i18n::GetDisplayStringInLTRDirectionality( | |
| 513 *paint_text); | |
| 514 } else if (is_email_) { | 499 } else if (is_email_) { |
| 515 *paint_text = ui::ElideEmail(text_, font_, GetAvailableRect().width()); | 500 *paint_text = ui::ElideEmail(text_, font_, GetAvailableRect().width()); |
| 516 } else if (elide_in_middle_) { | 501 } else if (elide_in_middle_) { |
| 517 *paint_text = ui::ElideText(text_, font_, GetAvailableRect().width(), | 502 *paint_text = ui::ElideText(text_, font_, GetAvailableRect().width(), |
| 518 ui::ELIDE_IN_MIDDLE); | 503 ui::ELIDE_IN_MIDDLE); |
| 519 } else { | 504 } else { |
| 520 *paint_text = text_; | 505 *paint_text = text_; |
| 521 } | 506 } |
| 522 | 507 |
| 523 *text_bounds = GetTextBounds(); | 508 *text_bounds = GetTextBounds(); |
| 524 *flags = ComputeDrawStringFlags(); | 509 *flags = ComputeDrawStringFlags(); |
| 525 } | 510 } |
| 526 | 511 |
| 527 } // namespace views | 512 } // namespace views |
| OLD | NEW |