Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Unified Diff: ui/views/controls/label.cc

Issue 23228004: Prepare to use gfx::RenderText in views::Label. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Revert Label implementation changes. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/controls/label.h ('k') | ui/views/controls/label_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/controls/label.cc
diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc
index 368f1d8e3dfc09da438d2e9eb3a851520235ff3b..a3177beed2114a3b0f905ac21b39752a2e3b6326 100644
--- a/ui/views/controls/label.cc
+++ b/ui/views/controls/label.cc
@@ -68,7 +68,7 @@ void Label::SetText(const base::string16& text) {
void Label::SetTextInternal(const base::string16& text) {
text_ = text;
- if (is_obscured_) {
+ if (obscured_) {
size_t obscured_text_length =
static_cast<size_t>(gfx::UTF16IndexToOffset(text_, 0, text_.length()));
layout_text_.assign(obscured_text_length, kPasswordReplacementChar);
@@ -104,6 +104,15 @@ void Label::SetBackgroundColor(SkColor color) {
RecalculateColors();
}
+void Label::SetShadows(const gfx::ShadowValues& shadows) {
+ shadows_ = shadows;
+ text_size_valid_ = false;
+}
+
+void Label::SetSubpixelRenderingEnabled(bool subpixel_rendering_enabled) {
+ subpixel_rendering_enabled_ = subpixel_rendering_enabled;
+}
+
void Label::SetHorizontalAlignment(gfx::HorizontalAlignment alignment) {
// If the UI layout is right-to-left, flip the alignment direction.
if (base::i18n::IsRTL() &&
@@ -122,7 +131,7 @@ gfx::HorizontalAlignment Label::GetHorizontalAlignment() const {
return horizontal_alignment_;
const base::i18n::TextDirection dir =
- base::i18n::GetFirstStrongCharacterDirection(layout_text());
+ base::i18n::GetFirstStrongCharacterDirection(layout_text_);
return dir == base::i18n::RIGHT_TO_LEFT ? gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT;
}
@@ -138,8 +147,8 @@ void Label::SetLineHeight(int height) {
void Label::SetMultiLine(bool multi_line) {
DCHECK(!multi_line || (elide_behavior_ == gfx::ELIDE_TAIL ||
elide_behavior_ == gfx::NO_ELIDE));
- if (multi_line != is_multi_line_) {
- is_multi_line_ = multi_line;
+ if (multi_line != multi_line_) {
+ multi_line_ = multi_line;
ResetCachedSize();
PreferredSizeChanged();
SchedulePaint();
@@ -147,8 +156,8 @@ void Label::SetMultiLine(bool multi_line) {
}
void Label::SetObscured(bool obscured) {
- if (obscured != is_obscured_) {
- is_obscured_ = obscured;
+ if (obscured != obscured_) {
+ obscured_ = obscured;
SetTextInternal(text_);
}
}
@@ -163,8 +172,8 @@ void Label::SetAllowCharacterBreak(bool allow_character_break) {
}
void Label::SetElideBehavior(gfx::ElideBehavior elide_behavior) {
- DCHECK(!is_multi_line_ || (elide_behavior_ == gfx::ELIDE_TAIL ||
- elide_behavior_ == gfx::NO_ELIDE));
+ DCHECK(!multi_line_ || (elide_behavior_ == gfx::ELIDE_TAIL ||
+ elide_behavior_ == gfx::NO_ELIDE));
if (elide_behavior != elide_behavior_) {
elide_behavior_ = elide_behavior;
ResetCachedSize();
@@ -178,10 +187,10 @@ void Label::SetTooltipText(const base::string16& tooltip_text) {
}
void Label::SizeToFit(int max_width) {
- DCHECK(is_multi_line_);
+ DCHECK(multi_line_);
std::vector<base::string16> lines;
- base::SplitString(layout_text(), '\n', &lines);
+ base::SplitString(layout_text_, '\n', &lines);
int label_width = 0;
for (std::vector<base::string16>::const_iterator iter = lines.begin();
@@ -198,6 +207,10 @@ void Label::SizeToFit(int max_width) {
SizeToPreferredSize();
}
+const base::string16& Label::GetLayoutTextForTesting() const {
+ return layout_text_;
+}
+
gfx::Insets Label::GetInsets() const {
gfx::Insets insets = View::GetInsets();
if (focusable()) {
@@ -241,7 +254,7 @@ gfx::Size Label::GetMinimumSize() const {
}
int Label::GetHeightForWidth(int w) const {
- if (!is_multi_line_)
+ if (!multi_line_)
return View::GetHeightForWidth(w);
w = std::max(0, w - GetInsets().width());
@@ -257,7 +270,7 @@ int Label::GetHeightForWidth(int w) const {
int h = font_list_.GetHeight();
const int flags = ComputeDrawStringFlags();
gfx::Canvas::SizeStringInt(
- layout_text(), font_list_, &w, &h, line_height_, flags);
+ 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();
@@ -268,18 +281,10 @@ const char* Label::GetClassName() const {
}
View* Label::GetTooltipHandlerForPoint(const gfx::Point& point) {
- // Bail out if the label does not contain the point.
- // Note that HitTestPoint() cannot be used here as it uses
- // Label::HitTestRect() to determine if the point hits the label; and
- // Label::HitTestRect() always fails. Instead, default HitTestRect()
- // implementation should be used.
- if (!View::HitTestRect(gfx::Rect(point, gfx::Size(1, 1))))
- return NULL;
-
if (tooltip_text_.empty() && !ShouldShowDefaultTooltip())
return NULL;
- return this;
+ return HitTestPoint(point) ? this : NULL;
}
bool Label::CanProcessEventsWithinSubtree() const {
@@ -287,30 +292,26 @@ bool Label::CanProcessEventsWithinSubtree() const {
return false;
}
-bool Label::GetTooltipText(const gfx::Point& p, base::string16* tooltip) const {
- DCHECK(tooltip);
+void Label::GetAccessibleState(ui::AXViewState* state) {
+ state->role = ui::AX_ROLE_STATIC_TEXT;
+ state->AddStateFlag(ui::AX_STATE_READ_ONLY);
+ state->name = layout_text_;
+}
- // If a tooltip has been explicitly set, use it.
+bool Label::GetTooltipText(const gfx::Point& p, base::string16* tooltip) const {
if (!tooltip_text_.empty()) {
tooltip->assign(tooltip_text_);
return true;
}
- // Show the full text if the text does not fit.
if (ShouldShowDefaultTooltip()) {
- *tooltip = layout_text();
+ *tooltip = layout_text_;
return true;
}
return false;
}
-void Label::GetAccessibleState(ui::AXViewState* state) {
- state->role = ui::AX_ROLE_STATIC_TEXT;
- state->AddStateFlag(ui::AX_STATE_READ_ONLY);
- state->name = layout_text();
-}
-
void Label::PaintText(gfx::Canvas* canvas,
const base::string16& text,
const gfx::Rect& text_bounds,
@@ -336,16 +337,16 @@ gfx::Size Label::GetTextSize() const {
// while adding NO_ELLIPSIS to the flags works on Windows for forcing
// SizeStringInt() to calculate the desired width, it doesn't seem to work
// on Linux.
- int w = is_multi_line_ ?
+ int w = multi_line_ ?
GetAvailableRect().width() : std::numeric_limits<int>::max();
int h = font_list_.GetHeight();
// For single-line strings, ignore the available width and calculate how
// wide the text wants to be.
int flags = ComputeDrawStringFlags();
- if (!is_multi_line_)
+ if (!multi_line_)
flags |= gfx::Canvas::NO_ELLIPSIS;
gfx::Canvas::SizeStringInt(
- layout_text(), font_list_, &w, &h, line_height_, flags);
+ layout_text_, font_list_, &w, &h, line_height_, flags);
text_size_.SetSize(w, h);
const gfx::Insets shadow_margin = -gfx::ShadowValue::GetMargin(shadows_);
text_size_.Enlarge(shadow_margin.width(), shadow_margin.height());
@@ -356,7 +357,7 @@ gfx::Size Label::GetTextSize() const {
}
void Label::OnBoundsChanged(const gfx::Rect& previous_bounds) {
- text_size_valid_ &= !is_multi_line_;
+ text_size_valid_ &= !multi_line_;
}
void Label::OnPaint(gfx::Canvas* canvas) {
@@ -385,12 +386,11 @@ void Label::Init(const base::string16& text, const gfx::FontList& font_list) {
UpdateColorsFromTheme(ui::NativeTheme::instance());
horizontal_alignment_ = gfx::ALIGN_CENTER;
line_height_ = 0;
- is_multi_line_ = false;
- is_obscured_ = false;
+ multi_line_ = false;
+ obscured_ = false;
allow_character_break_ = false;
elide_behavior_ = gfx::ELIDE_TAIL;
collapse_when_hidden_ = false;
- directionality_mode_ = gfx::DIRECTIONALITY_FROM_UI;
cached_heights_.resize(kCachedSizeLimit);
ResetCachedSize();
@@ -439,18 +439,12 @@ int Label::ComputeDrawStringFlags() const {
if (SkColorGetA(background_color_) != 0xFF || !subpixel_rendering_enabled_)
flags |= gfx::Canvas::NO_SUBPIXEL_RENDERING;
- if (directionality_mode_ == gfx::DIRECTIONALITY_FORCE_LTR) {
- flags |= gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
- } else if (directionality_mode_ == gfx::DIRECTIONALITY_FORCE_RTL) {
+ base::i18n::TextDirection direction =
+ base::i18n::GetFirstStrongCharacterDirection(layout_text_);
+ if (direction == base::i18n::RIGHT_TO_LEFT)
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)
- flags |= gfx::Canvas::FORCE_RTL_DIRECTIONALITY;
- else
- flags |= gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
- }
+ else
+ flags |= gfx::Canvas::FORCE_LTR_DIRECTIONALITY;
switch (GetHorizontalAlignment()) {
case gfx::ALIGN_LEFT:
@@ -467,7 +461,7 @@ int Label::ComputeDrawStringFlags() const {
break;
}
- if (!is_multi_line_)
+ if (!multi_line_)
return flags;
flags |= gfx::Canvas::MULTI_LINE;
@@ -498,17 +492,17 @@ void Label::CalculateDrawStringParams(base::string16* paint_text,
const bool forbid_ellipsis = elide_behavior_ == gfx::NO_ELIDE ||
elide_behavior_ == gfx::FADE_TAIL;
- if (is_multi_line_ || forbid_ellipsis) {
- *paint_text = layout_text();
+ if (multi_line_ || forbid_ellipsis) {
+ *paint_text = layout_text_;
} else {
- *paint_text = gfx::ElideText(layout_text(), font_list_,
+ *paint_text = gfx::ElideText(layout_text_, font_list_,
GetAvailableRect().width(), elide_behavior_);
}
*text_bounds = GetTextBounds();
*flags = ComputeDrawStringFlags();
// TODO(msw): Elide multi-line text with ElideRectangleText instead.
- if (!is_multi_line_ || forbid_ellipsis)
+ if (!multi_line_ || forbid_ellipsis)
*flags |= gfx::Canvas::NO_ELLIPSIS;
}
@@ -536,9 +530,10 @@ void Label::ResetCachedSize() {
}
bool Label::ShouldShowDefaultTooltip() const {
- return !is_multi_line_ && !is_obscured_ &&
- gfx::GetStringWidth(layout_text(), font_list_) >
- GetAvailableRect().width();
+ const gfx::Size text_size = GetTextSize();
+ const gfx::Size size = GetContentsBounds().size();
+ return !obscured() && (text_size.width() > size.width() ||
+ text_size.height() > size.height());
}
} // namespace views
« no previous file with comments | « ui/views/controls/label.h ('k') | ui/views/controls/label_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698