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/button/text_button.h" | 5 #include "ui/views/controls/button/text_button.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "grit/ui_resources.h" | 10 #include "grit/ui_resources.h" |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 | 269 |
270 void TextButtonBase::SetMultiLine(bool multi_line) { | 270 void TextButtonBase::SetMultiLine(bool multi_line) { |
271 if (multi_line != multi_line_) { | 271 if (multi_line != multi_line_) { |
272 multi_line_ = multi_line; | 272 multi_line_ = multi_line; |
273 max_text_size_.SetSize(0, 0); | 273 max_text_size_.SetSize(0, 0); |
274 UpdateTextSize(); | 274 UpdateTextSize(); |
275 SchedulePaint(); | 275 SchedulePaint(); |
276 } | 276 } |
277 } | 277 } |
278 | 278 |
279 gfx::Size TextButtonBase::GetPreferredSize() { | 279 gfx::Size TextButtonBase::GetPreferredSize() const { |
280 gfx::Insets insets = GetInsets(); | 280 gfx::Insets insets = GetInsets(); |
281 | 281 |
282 // Use the max size to set the button boundaries. | 282 // Use the max size to set the button boundaries. |
283 // In multiline mode max size can be undefined while | 283 // In multiline mode max size can be undefined while |
284 // width() is 0, so max it out with current text size. | 284 // width() is 0, so max it out with current text size. |
285 gfx::Size prefsize(std::max(max_text_size_.width(), | 285 gfx::Size prefsize(std::max(max_text_size_.width(), |
286 text_size_.width()) + insets.width(), | 286 text_size_.width()) + insets.width(), |
287 std::max(max_text_size_.height(), | 287 std::max(max_text_size_.height(), |
288 text_size_.height()) + insets.height()); | 288 text_size_.height()) + insets.height()); |
289 | 289 |
290 if (max_width_ > 0) | 290 if (max_width_ > 0) |
291 prefsize.set_width(std::min(max_width_, prefsize.width())); | 291 prefsize.set_width(std::min(max_width_, prefsize.width())); |
292 | 292 |
293 prefsize.set_width(std::max(prefsize.width(), min_width_)); | 293 prefsize.set_width(std::max(prefsize.width(), min_width_)); |
294 prefsize.set_height(std::max(prefsize.height(), min_height_)); | 294 prefsize.set_height(std::max(prefsize.height(), min_height_)); |
295 | 295 |
296 return prefsize; | 296 return prefsize; |
297 } | 297 } |
298 | 298 |
299 int TextButtonBase::GetHeightForWidth(int w) { | 299 int TextButtonBase::GetHeightForWidth(int w) const { |
300 if (!multi_line_) | 300 if (!multi_line_) |
301 return View::GetHeightForWidth(w); | 301 return View::GetHeightForWidth(w); |
302 | 302 |
303 if (max_width_ > 0) | 303 if (max_width_ > 0) |
304 w = std::min(max_width_, w); | 304 w = std::min(max_width_, w); |
305 | 305 |
306 gfx::Size text_size; | 306 gfx::Size text_size; |
307 CalculateTextSize(&text_size, w); | 307 CalculateTextSize(&text_size, w); |
308 int height = text_size.height() + GetInsets().height(); | 308 int height = text_size.height() + GetInsets().height(); |
309 | 309 |
(...skipping 30 matching lines...) Expand all Loading... |
340 // Do not store max_text_size in this case. UpdateTextSize will be called | 340 // Do not store max_text_size in this case. UpdateTextSize will be called |
341 // again once width() changes. | 341 // again once width() changes. |
342 if (!multi_line_ || text_width != 0) { | 342 if (!multi_line_ || text_width != 0) { |
343 max_text_size_.SetSize(std::max(max_text_size_.width(), text_size_.width()), | 343 max_text_size_.SetSize(std::max(max_text_size_.width(), text_size_.width()), |
344 std::max(max_text_size_.height(), | 344 std::max(max_text_size_.height(), |
345 text_size_.height())); | 345 text_size_.height())); |
346 PreferredSizeChanged(); | 346 PreferredSizeChanged(); |
347 } | 347 } |
348 } | 348 } |
349 | 349 |
350 void TextButtonBase::CalculateTextSize(gfx::Size* text_size, int max_width) { | 350 void TextButtonBase::CalculateTextSize(gfx::Size* text_size, |
| 351 int max_width) const { |
351 int h = font_list_.GetHeight(); | 352 int h = font_list_.GetHeight(); |
352 int w = multi_line_ ? max_width : 0; | 353 int w = multi_line_ ? max_width : 0; |
353 int flags = ComputeCanvasStringFlags(); | 354 int flags = ComputeCanvasStringFlags(); |
354 if (!multi_line_) | 355 if (!multi_line_) |
355 flags |= gfx::Canvas::NO_ELLIPSIS; | 356 flags |= gfx::Canvas::NO_ELLIPSIS; |
356 | 357 |
357 gfx::Canvas::SizeStringInt(text_, font_list_, &w, &h, 0, flags); | 358 gfx::Canvas::SizeStringInt(text_, font_list_, &w, &h, 0, flags); |
358 text_size->SetSize(w, h); | 359 text_size->SetSize(w, h); |
359 } | 360 } |
360 | 361 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 void TextButtonBase::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) { | 475 void TextButtonBase::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) { |
475 if (mode == PB_NORMAL) { | 476 if (mode == PB_NORMAL) { |
476 OnPaintBackground(canvas); | 477 OnPaintBackground(canvas); |
477 OnPaintBorder(canvas); | 478 OnPaintBorder(canvas); |
478 Painter::PaintFocusPainter(this, canvas, focus_painter_.get()); | 479 Painter::PaintFocusPainter(this, canvas, focus_painter_.get()); |
479 } | 480 } |
480 | 481 |
481 OnPaintText(canvas, mode); | 482 OnPaintText(canvas, mode); |
482 } | 483 } |
483 | 484 |
484 gfx::Size TextButtonBase::GetMinimumSize() { | 485 gfx::Size TextButtonBase::GetMinimumSize() const { |
485 return max_text_size_; | 486 return max_text_size_; |
486 } | 487 } |
487 | 488 |
488 void TextButtonBase::OnEnabledChanged() { | 489 void TextButtonBase::OnEnabledChanged() { |
489 // We should always call UpdateColor() since the state of the button might be | 490 // We should always call UpdateColor() since the state of the button might be |
490 // changed by other functions like CustomButton::SetState(). | 491 // changed by other functions like CustomButton::SetState(). |
491 UpdateColor(); | 492 UpdateColor(); |
492 CustomButton::OnEnabledChanged(); | 493 CustomButton::OnEnabledChanged(); |
493 } | 494 } |
494 | 495 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 has_hover_icon_ = true; | 591 has_hover_icon_ = true; |
591 SchedulePaint(); | 592 SchedulePaint(); |
592 } | 593 } |
593 | 594 |
594 void TextButton::SetPushedIcon(const gfx::ImageSkia& icon) { | 595 void TextButton::SetPushedIcon(const gfx::ImageSkia& icon) { |
595 icon_pushed_ = icon; | 596 icon_pushed_ = icon; |
596 has_pushed_icon_ = true; | 597 has_pushed_icon_ = true; |
597 SchedulePaint(); | 598 SchedulePaint(); |
598 } | 599 } |
599 | 600 |
600 gfx::Size TextButton::GetPreferredSize() { | 601 gfx::Size TextButton::GetPreferredSize() const { |
601 gfx::Size prefsize(TextButtonBase::GetPreferredSize()); | 602 gfx::Size prefsize(TextButtonBase::GetPreferredSize()); |
602 prefsize.Enlarge(icon_.width(), 0); | 603 prefsize.Enlarge(icon_.width(), 0); |
603 prefsize.set_height(std::max(prefsize.height(), icon_.height())); | 604 prefsize.set_height(std::max(prefsize.height(), icon_.height())); |
604 | 605 |
605 // Use the max size to set the button boundaries. | 606 // Use the max size to set the button boundaries. |
606 if (icon_.width() > 0 && !text_.empty()) | 607 if (icon_.width() > 0 && !text_.empty()) |
607 prefsize.Enlarge(icon_text_spacing_, 0); | 608 prefsize.Enlarge(icon_text_spacing_, 0); |
608 | 609 |
609 if (max_width_ > 0) | 610 if (max_width_ > 0) |
610 prefsize.set_width(std::min(max_width_, prefsize.width())); | 611 prefsize.set_width(std::min(max_width_, prefsize.width())); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 if (show_multiple_icon_states_) { | 720 if (show_multiple_icon_states_) { |
720 if (has_hover_icon_ && (state() == STATE_HOVERED)) | 721 if (has_hover_icon_ && (state() == STATE_HOVERED)) |
721 return icon_hover_; | 722 return icon_hover_; |
722 if (has_pushed_icon_ && (state() == STATE_PRESSED)) | 723 if (has_pushed_icon_ && (state() == STATE_PRESSED)) |
723 return icon_pushed_; | 724 return icon_pushed_; |
724 } | 725 } |
725 return icon_; | 726 return icon_; |
726 } | 727 } |
727 | 728 |
728 } // namespace views | 729 } // namespace views |
OLD | NEW |