diff options
Diffstat (limited to 'ui/message_center/views/bounded_label.cc')
-rw-r--r-- | ui/message_center/views/bounded_label.cc | 157 |
1 files changed, 0 insertions, 157 deletions
diff --git a/ui/message_center/views/bounded_label.cc b/ui/message_center/views/bounded_label.cc deleted file mode 100644 index f9c71b3..0000000 --- a/ui/message_center/views/bounded_label.cc +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/message_center/views/bounded_label.h" - -#include <limits> - -#include "base/string_util.h" -#include "base/utf_string_conversions.h" -#include "ui/base/text/text_elider.h" -#include "ui/gfx/canvas.h" - -namespace message_center { - -BoundedLabel::BoundedLabel(string16 text, size_t max_lines) - : views::Label(text, gfx::Font()) { - Init(max_lines); -} - -BoundedLabel::BoundedLabel(string16 text, gfx::Font font, size_t max_lines) - : views::Label(text, font) { - Init(max_lines); -} - -BoundedLabel::~BoundedLabel() { -} - -void BoundedLabel::SetMaxLines(size_t lines) { - is_preferred_lines_valid_ = false; - is_text_size_valid_ = false; - max_lines_ = lines; -} - -size_t BoundedLabel::GetMaxLines() { - return max_lines_; -} - -size_t BoundedLabel::GetPreferredLines() { - if (!is_preferred_lines_valid_) { - int wrap_width = width() - GetInsets().width(); - int unlimited_lines = std::numeric_limits<size_t>::max(); - preferred_lines_ = SplitLines(wrap_width, unlimited_lines).size(); - is_preferred_lines_valid_ = true; - } - return preferred_lines_; -} - -int BoundedLabel::GetHeightForWidth(int width) { - gfx::Insets insets = GetInsets(); - return GetTextHeightForWidth(width - insets.width()) + insets.height(); -} - -gfx::Size BoundedLabel::GetTextSize() const { - if (!is_text_size_valid_) { - text_size_.set_width(width() - GetInsets().width()); - text_size_.set_height(GetTextHeightForWidth(text_size_.width())); - is_text_size_valid_ = true; - } - return text_size_; -} - -void BoundedLabel::OnBoundsChanged(const gfx::Rect& previous_bounds) { - is_preferred_lines_valid_ = false; - is_text_size_valid_ = false; -} - -void BoundedLabel::PaintText(gfx::Canvas* canvas, - const string16& paint_text, - const gfx::Rect& text_bounds, - int flags) { - gfx::Insets insets = GetInsets(); - gfx::Rect bounds(gfx::Point(insets.left(), insets.top()), GetTextSize()); - string16 text = JoinString(SplitLines(bounds.width(), max_lines_), '\n'); - views::Label::PaintText(canvas, text, bounds, GetTextFlags()); -} - -void BoundedLabel::Init(size_t max_lines) { - SetMultiLine(true); - SetAllowCharacterBreak(true); - SetElideBehavior(views::Label::ELIDE_AT_END); - max_lines_ = max_lines; - is_preferred_lines_valid_ = false; - is_text_size_valid_ = false; -} - -int BoundedLabel::GetTextFlags() const { - int flags = gfx::Canvas::MULTI_LINE | gfx::Canvas::CHARACTER_BREAK; - - // We can't use subpixel rendering if the background is non-opaque. - if (SkColorGetA(background_color()) != 0xFF) - flags |= gfx::Canvas::NO_SUBPIXEL_RENDERING; - - if (directionality_mode() == AUTO_DETECT_DIRECTIONALITY) { - base::i18n::TextDirection direction = - base::i18n::GetFirstStrongCharacterDirection(text()); - if (direction == base::i18n::RIGHT_TO_LEFT) - flags |= gfx::Canvas::FORCE_RTL_DIRECTIONALITY; - else - flags |= gfx::Canvas::FORCE_LTR_DIRECTIONALITY; - } - - switch (horizontal_alignment()) { - case gfx::ALIGN_LEFT: - flags |= gfx::Canvas::TEXT_ALIGN_LEFT; - break; - case gfx::ALIGN_CENTER: - flags |= gfx::Canvas::TEXT_ALIGN_CENTER; - break; - case gfx::ALIGN_RIGHT: - flags |= gfx::Canvas::TEXT_ALIGN_RIGHT; - break; - } - - return flags; -} - -int BoundedLabel::GetTextHeightForWidth(int width) const { - int height = font().GetHeight(); - width = std::max(width, 0); - string16 text = JoinString(SplitLines(width, max_lines_), '\n'); - gfx::Canvas::SizeStringInt(text, font(), &width, &height, GetTextFlags()); - return height; -} - -std::vector<string16> BoundedLabel::SplitLines(int width, - size_t max_lines) const { - // Adjust max_lines so (max_lines + 1) * line_height <= INT_MAX, then use the - // adjusted max_lines to get a max_height of (max_lines + 1) * line_height. - size_t max_height = std::numeric_limits<int>::max(); - size_t line_height = std::max(font().GetHeight(), 2); // At least 2 pixels! - max_lines = std::min(max_lines, max_height / line_height - 1); - max_height = (max_lines + 1) * line_height; - - // Split. Do not use ui::WRAP_LONG_WORDS instead of ui::IGNORE_LONG_WORDS - // below as this may cause ui::ElideRectangleText() to go into an infinite - // loop for small width values. - std::vector<string16> lines; - ui::ElideRectangleText(text(), font(), width, max_height, - ui::IGNORE_LONG_WORDS, &lines); - - // Elide if necessary. - if (lines.size() > max_lines) { - // Add an ellipsis to the last line. If this ellipsis makes the last line - // too wide, that line will be further elided by the ui::ElideText below, - // so for example "ABC" could become "ABC..." here and "AB..." below. - string16 last = lines[max_lines - 1] + UTF8ToUTF16(ui::kEllipsis); - lines.resize(max_lines - 1); - lines.push_back((font().GetStringWidth(last) > width) ? - ui::ElideText(last, font(), width, ui::ELIDE_AT_END) : - last); - } - - return lines; -} - -} // namespace message_center |