| Index: ui/message_center/views/bounded_label.cc
|
| ===================================================================
|
| --- ui/message_center/views/bounded_label.cc (revision 188662)
|
| +++ ui/message_center/views/bounded_label.cc (working copy)
|
| @@ -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
|
|
|