Index: ui/views/controls/label.cc |
diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc |
index e9708a3e1d33c50bbd9486e5d92eb65d74f0aefe..e1e1bcfe1c2d2b5309c2e7daafe9dd9865b965b1 100644 |
--- a/ui/views/controls/label.cc |
+++ b/ui/views/controls/label.cc |
@@ -120,11 +120,9 @@ void Label::ClearEmbellishing() { |
} |
void Label::SetHorizontalAlignment(gfx::HorizontalAlignment alignment) { |
- // If the View's UI layout is right-to-left and directionality_mode_ is |
- // USE_UI_DIRECTIONALITY, we need to flip the alignment so that the alignment |
- // settings take into account the text directionality. |
- if (base::i18n::IsRTL() && (directionality_mode_ == USE_UI_DIRECTIONALITY) && |
- (alignment != gfx::ALIGN_CENTER)) { |
+ // If the UI layout is right-to-left, flip the alignment direction. |
+ if (base::i18n::IsRTL() && |
+ (alignment == gfx::ALIGN_LEFT || alignment == gfx::ALIGN_RIGHT)) { |
alignment = (alignment == gfx::ALIGN_LEFT) ? |
gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT; |
} |
@@ -134,6 +132,15 @@ void Label::SetHorizontalAlignment(gfx::HorizontalAlignment alignment) { |
} |
} |
+gfx::HorizontalAlignment Label::GetHorizontalAlignment() const { |
+ if (horizontal_alignment_ != gfx::ALIGN_TO_HEAD) |
+ return horizontal_alignment_; |
+ |
+ const base::i18n::TextDirection dir = |
+ base::i18n::GetFirstStrongCharacterDirection(layout_text()); |
+ return dir == base::i18n::RIGHT_TO_LEFT ? gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT; |
+} |
+ |
void Label::SetLineHeight(int height) { |
if (height != line_height_) { |
line_height_ = height; |
@@ -405,7 +412,7 @@ void Label::Init(const base::string16& text, const gfx::FontList& font_list) { |
allow_character_break_ = false; |
elide_behavior_ = gfx::ELIDE_TAIL; |
collapse_when_hidden_ = false; |
- directionality_mode_ = USE_UI_DIRECTIONALITY; |
+ directionality_mode_ = gfx::DIRECTIONALITY_FROM_UI; |
enabled_shadow_color_ = 0; |
disabled_shadow_color_ = 0; |
shadow_offset_.SetPoint(1, 1); |
@@ -430,33 +437,27 @@ void Label::RecalculateColors() { |
} |
gfx::Rect Label::GetTextBounds() const { |
- gfx::Rect available_rect(GetAvailableRect()); |
+ gfx::Rect available(GetAvailableRect()); |
gfx::Size text_size(GetTextSize()); |
- text_size.set_width(std::min(available_rect.width(), text_size.width())); |
- |
- gfx::Insets insets = GetInsets(); |
- gfx::Point text_origin(insets.left(), insets.top()); |
- switch (horizontal_alignment_) { |
+ text_size.set_width(std::min(available.width(), text_size.width())); |
+ gfx::Point origin(GetInsets().left(), GetInsets().top()); |
+ switch (GetHorizontalAlignment()) { |
case gfx::ALIGN_LEFT: |
break; |
case gfx::ALIGN_CENTER: |
- // We put any extra margin pixel on the left rather than the right. We |
- // used to do this because measurement on Windows used |
- // GetTextExtentPoint32(), which could report a value one too large on the |
- // right; we now use DrawText(), and who knows if it can also do this. |
- text_origin.Offset((available_rect.width() + 1 - text_size.width()) / 2, |
- 0); |
+ // Put any extra margin pixel on the left to match the legacy behavior |
+ // from the use of GetTextExtentPoint32() on Windows. |
+ origin.Offset((available.width() + 1 - text_size.width()) / 2, 0); |
break; |
case gfx::ALIGN_RIGHT: |
- text_origin.set_x(available_rect.right() - text_size.width()); |
+ origin.set_x(available.right() - text_size.width()); |
break; |
default: |
NOTREACHED(); |
break; |
} |
- text_origin.Offset(0, |
- std::max(0, (available_rect.height() - text_size.height())) / 2); |
- return gfx::Rect(text_origin, text_size); |
+ origin.Offset(0, std::max(0, (available.height() - text_size.height())) / 2); |
+ return gfx::Rect(origin, text_size); |
} |
int Label::ComputeDrawStringFlags() const { |
@@ -466,7 +467,11 @@ int Label::ComputeDrawStringFlags() const { |
if (SkColorGetA(background_color_) != 0xFF) |
flags |= gfx::Canvas::NO_SUBPIXEL_RENDERING; |
- if (directionality_mode_ == AUTO_DETECT_DIRECTIONALITY) { |
+ if (directionality_mode_ == gfx::DIRECTIONALITY_FORCE_LTR) { |
+ flags |= gfx::Canvas::FORCE_LTR_DIRECTIONALITY; |
+ } else if (directionality_mode_ == gfx::DIRECTIONALITY_FORCE_RTL) { |
+ flags |= gfx::Canvas::FORCE_RTL_DIRECTIONALITY; |
+ } else if (directionality_mode_ == gfx::DIRECTIONALITY_FROM_TEXT) { |
base::i18n::TextDirection direction = |
base::i18n::GetFirstStrongCharacterDirection(layout_text()); |
if (direction == base::i18n::RIGHT_TO_LEFT) |
@@ -475,7 +480,7 @@ int Label::ComputeDrawStringFlags() const { |
flags |= gfx::Canvas::FORCE_LTR_DIRECTIONALITY; |
} |
- switch (horizontal_alignment_) { |
+ switch (GetHorizontalAlignment()) { |
case gfx::ALIGN_LEFT: |
flags |= gfx::Canvas::TEXT_ALIGN_LEFT; |
break; |
@@ -485,6 +490,9 @@ int Label::ComputeDrawStringFlags() const { |
case gfx::ALIGN_RIGHT: |
flags |= gfx::Canvas::TEXT_ALIGN_RIGHT; |
break; |
+ default: |
+ NOTREACHED(); |
+ break; |
} |
if (!is_multi_line_) |