| 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 (alignment != gfx::ALIGN_CENTER)) { | 114 (alignment != gfx::ALIGN_CENTER)) { |
| 115 alignment = (alignment == gfx::ALIGN_LEFT) ? | 115 alignment = (alignment == gfx::ALIGN_LEFT) ? |
| 116 gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT; | 116 gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT; |
| 117 } | 117 } |
| 118 if (horizontal_alignment_ != alignment) { | 118 if (horizontal_alignment_ != alignment) { |
| 119 horizontal_alignment_ = alignment; | 119 horizontal_alignment_ = alignment; |
| 120 SchedulePaint(); | 120 SchedulePaint(); |
| 121 } | 121 } |
| 122 } | 122 } |
| 123 | 123 |
| 124 void Label::SetLineHeight(int height) { |
| 125 if (height != line_height_) { |
| 126 line_height_ = height; |
| 127 ResetCachedSize(); |
| 128 PreferredSizeChanged(); |
| 129 SchedulePaint(); |
| 130 } |
| 131 } |
| 132 |
| 124 void Label::SetMultiLine(bool multi_line) { | 133 void Label::SetMultiLine(bool multi_line) { |
| 125 DCHECK(!multi_line || elide_behavior_ != ELIDE_IN_MIDDLE); | 134 DCHECK(!multi_line || elide_behavior_ != ELIDE_IN_MIDDLE); |
| 126 if (multi_line != is_multi_line_) { | 135 if (multi_line != is_multi_line_) { |
| 127 is_multi_line_ = multi_line; | 136 is_multi_line_ = multi_line; |
| 128 ResetCachedSize(); | 137 ResetCachedSize(); |
| 129 PreferredSizeChanged(); | 138 PreferredSizeChanged(); |
| 130 SchedulePaint(); | 139 SchedulePaint(); |
| 131 } | 140 } |
| 132 } | 141 } |
| 133 | 142 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 | 228 |
| 220 for (size_t i = 0; i < cached_heights_.size(); ++i) { | 229 for (size_t i = 0; i < cached_heights_.size(); ++i) { |
| 221 const gfx::Size& s = cached_heights_[i]; | 230 const gfx::Size& s = cached_heights_[i]; |
| 222 if (s.width() == w) | 231 if (s.width() == w) |
| 223 return s.height() + GetInsets().height(); | 232 return s.height() + GetInsets().height(); |
| 224 } | 233 } |
| 225 | 234 |
| 226 int cache_width = w; | 235 int cache_width = w; |
| 227 | 236 |
| 228 int h = font_.GetHeight(); | 237 int h = font_.GetHeight(); |
| 229 gfx::Canvas::SizeStringInt(text_, font_, &w, &h, ComputeDrawStringFlags()); | 238 const int flags = ComputeDrawStringFlags(); |
| 239 gfx::Canvas::SizeStringInt(text_, font_, &w, &h, line_height_, flags); |
| 230 cached_heights_[cached_heights_cursor_] = gfx::Size(cache_width, h); | 240 cached_heights_[cached_heights_cursor_] = gfx::Size(cache_width, h); |
| 231 cached_heights_cursor_ = (cached_heights_cursor_ + 1) % kCachedSizeLimit; | 241 cached_heights_cursor_ = (cached_heights_cursor_ + 1) % kCachedSizeLimit; |
| 232 return h + GetInsets().height(); | 242 return h + GetInsets().height(); |
| 233 } | 243 } |
| 234 | 244 |
| 235 std::string Label::GetClassName() const { | 245 std::string Label::GetClassName() const { |
| 236 return kViewClassName; | 246 return kViewClassName; |
| 237 } | 247 } |
| 238 | 248 |
| 239 bool Label::HitTestRect(const gfx::Rect& rect) const { | 249 bool Label::HitTestRect(const gfx::Rect& rect) const { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 267 void Label::PaintText(gfx::Canvas* canvas, | 277 void Label::PaintText(gfx::Canvas* canvas, |
| 268 const string16& text, | 278 const string16& text, |
| 269 const gfx::Rect& text_bounds, | 279 const gfx::Rect& text_bounds, |
| 270 int flags) { | 280 int flags) { |
| 271 gfx::ShadowValues shadows; | 281 gfx::ShadowValues shadows; |
| 272 if (has_shadow_) | 282 if (has_shadow_) |
| 273 shadows.push_back(gfx::ShadowValue(shadow_offset_, 0, | 283 shadows.push_back(gfx::ShadowValue(shadow_offset_, 0, |
| 274 enabled() ? enabled_shadow_color_ : disabled_shadow_color_)); | 284 enabled() ? enabled_shadow_color_ : disabled_shadow_color_)); |
| 275 canvas->DrawStringWithShadows(text, font_, | 285 canvas->DrawStringWithShadows(text, font_, |
| 276 enabled() ? actual_enabled_color_ : actual_disabled_color_, | 286 enabled() ? actual_enabled_color_ : actual_disabled_color_, |
| 277 text_bounds, flags, shadows); | 287 text_bounds, line_height_, flags, shadows); |
| 278 | 288 |
| 279 if (HasFocus()) { | 289 if (HasFocus()) { |
| 280 gfx::Rect focus_bounds = text_bounds; | 290 gfx::Rect focus_bounds = text_bounds; |
| 281 focus_bounds.Inset(-kFocusBorderPadding, -kFocusBorderPadding); | 291 focus_bounds.Inset(-kFocusBorderPadding, -kFocusBorderPadding); |
| 282 canvas->DrawFocusRect(focus_bounds); | 292 canvas->DrawFocusRect(focus_bounds); |
| 283 } | 293 } |
| 284 } | 294 } |
| 285 | 295 |
| 286 gfx::Size Label::GetTextSize() const { | 296 gfx::Size Label::GetTextSize() const { |
| 287 if (!text_size_valid_) { | 297 if (!text_size_valid_) { |
| 288 // For single-line strings, we supply the largest possible width, because | 298 // For single-line strings, we supply the largest possible width, because |
| 289 // while adding NO_ELLIPSIS to the flags works on Windows for forcing | 299 // while adding NO_ELLIPSIS to the flags works on Windows for forcing |
| 290 // SizeStringInt() to calculate the desired width, it doesn't seem to work | 300 // SizeStringInt() to calculate the desired width, it doesn't seem to work |
| 291 // on Linux. | 301 // on Linux. |
| 292 int w = is_multi_line_ ? | 302 int w = is_multi_line_ ? |
| 293 GetAvailableRect().width() : std::numeric_limits<int>::max(); | 303 GetAvailableRect().width() : std::numeric_limits<int>::max(); |
| 294 int h = font_.GetHeight(); | 304 int h = font_.GetHeight(); |
| 295 // For single-line strings, ignore the available width and calculate how | 305 // For single-line strings, ignore the available width and calculate how |
| 296 // wide the text wants to be. | 306 // wide the text wants to be. |
| 297 int flags = ComputeDrawStringFlags(); | 307 int flags = ComputeDrawStringFlags(); |
| 298 if (!is_multi_line_) | 308 if (!is_multi_line_) |
| 299 flags |= gfx::Canvas::NO_ELLIPSIS; | 309 flags |= gfx::Canvas::NO_ELLIPSIS; |
| 300 gfx::Canvas::SizeStringInt(text_, font_, &w, &h, flags); | 310 gfx::Canvas::SizeStringInt(text_, font_, &w, &h, line_height_, flags); |
| 301 text_size_.SetSize(w, h); | 311 text_size_.SetSize(w, h); |
| 302 text_size_valid_ = true; | 312 text_size_valid_ = true; |
| 303 } | 313 } |
| 304 | 314 |
| 305 return text_size_; | 315 return text_size_; |
| 306 } | 316 } |
| 307 | 317 |
| 308 void Label::OnBoundsChanged(const gfx::Rect& previous_bounds) { | 318 void Label::OnBoundsChanged(const gfx::Rect& previous_bounds) { |
| 309 text_size_valid_ &= !is_multi_line_; | 319 text_size_valid_ &= !is_multi_line_; |
| 310 } | 320 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 331 gfx::Font Label::GetDefaultFont() { | 341 gfx::Font Label::GetDefaultFont() { |
| 332 return ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont); | 342 return ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont); |
| 333 } | 343 } |
| 334 | 344 |
| 335 void Label::Init(const string16& text, const gfx::Font& font) { | 345 void Label::Init(const string16& text, const gfx::Font& font) { |
| 336 font_ = font; | 346 font_ = font; |
| 337 enabled_color_set_ = disabled_color_set_ = background_color_set_ = false; | 347 enabled_color_set_ = disabled_color_set_ = background_color_set_ = false; |
| 338 auto_color_readability_ = true; | 348 auto_color_readability_ = true; |
| 339 UpdateColorsFromTheme(ui::NativeTheme::instance()); | 349 UpdateColorsFromTheme(ui::NativeTheme::instance()); |
| 340 horizontal_alignment_ = gfx::ALIGN_CENTER; | 350 horizontal_alignment_ = gfx::ALIGN_CENTER; |
| 351 line_height_ = 0; |
| 341 is_multi_line_ = false; | 352 is_multi_line_ = false; |
| 342 allow_character_break_ = false; | 353 allow_character_break_ = false; |
| 343 elide_behavior_ = NO_ELIDE; | 354 elide_behavior_ = NO_ELIDE; |
| 344 collapse_when_hidden_ = false; | 355 collapse_when_hidden_ = false; |
| 345 directionality_mode_ = USE_UI_DIRECTIONALITY; | 356 directionality_mode_ = USE_UI_DIRECTIONALITY; |
| 346 has_focus_border_ = false; | 357 has_focus_border_ = false; |
| 347 enabled_shadow_color_ = 0; | 358 enabled_shadow_color_ = 0; |
| 348 disabled_shadow_color_ = 0; | 359 disabled_shadow_color_ = 0; |
| 349 shadow_offset_.SetPoint(1, 1); | 360 shadow_offset_.SetPoint(1, 1); |
| 350 has_shadow_ = false; | 361 has_shadow_ = false; |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 } | 497 } |
| 487 | 498 |
| 488 void Label::ResetCachedSize() { | 499 void Label::ResetCachedSize() { |
| 489 text_size_valid_ = false; | 500 text_size_valid_ = false; |
| 490 cached_heights_cursor_ = 0; | 501 cached_heights_cursor_ = 0; |
| 491 for (int i = 0; i < kCachedSizeLimit; ++i) | 502 for (int i = 0; i < kCachedSizeLimit; ++i) |
| 492 cached_heights_[i] = gfx::Size(); | 503 cached_heights_[i] = gfx::Size(); |
| 493 } | 504 } |
| 494 | 505 |
| 495 } // namespace views | 506 } // namespace views |
| OLD | NEW |