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 // This file implements utility functions for eliding and formatting UI text. | 5 // This file implements utility functions for eliding and formatting UI text. |
6 // | 6 // |
7 // Note that several of the functions declared in text_elider.h are implemented | 7 // Note that several of the functions declared in text_elider.h are implemented |
8 // in this file using helper classes in an unnamed namespace. | 8 // in this file using helper classes in an unnamed namespace. |
9 | 9 |
10 #include "ui/gfx/text_elider.h" | 10 #include "ui/gfx/text_elider.h" |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
475 : font_list_(font_list), | 475 : font_list_(font_list), |
476 line_height_(font_list.GetHeight()), | 476 line_height_(font_list.GetHeight()), |
477 available_pixel_width_(available_pixel_width), | 477 available_pixel_width_(available_pixel_width), |
478 available_pixel_height_(available_pixel_height), | 478 available_pixel_height_(available_pixel_height), |
479 wrap_behavior_(wrap_behavior), | 479 wrap_behavior_(wrap_behavior), |
480 current_width_(0), | 480 current_width_(0), |
481 current_height_(0), | 481 current_height_(0), |
482 last_line_ended_in_lf_(false), | 482 last_line_ended_in_lf_(false), |
483 lines_(lines), | 483 lines_(lines), |
484 insufficient_width_(false), | 484 insufficient_width_(false), |
485 insufficient_height_(false) {} | 485 insufficient_height_(false), |
486 max_broken_pixel_width_(0) {} | |
486 | 487 |
487 // Perform deferred initializions following creation. Must be called | 488 // Perform deferred initializions following creation. Must be called |
488 // before any input can be added via AddString(). | 489 // before any input can be added via AddString(). |
489 void Init() { lines_->clear(); } | 490 void Init() { lines_->clear(); } |
490 | 491 |
491 // Add an input string, reformatting to fit the desired dimensions. | 492 // Add an input string, reformatting to fit the desired dimensions. |
492 // AddString() may be called multiple times to concatenate together | 493 // AddString() may be called multiple times to concatenate together |
493 // multiple strings into the region (the current caller doesn't do | 494 // multiple strings into the region (the current caller doesn't do |
494 // this, however). | 495 // this, however). |
495 void AddString(const base::string16& input); | 496 void AddString(const base::string16& input); |
496 | 497 |
497 // Perform any deferred output processing. Must be called after the last | 498 // Perform any deferred output processing. Must be called after the last |
498 // AddString() call has occured. Returns a combination of | 499 // AddString() call has occured. Returns a combination of |
499 // |ReformattingResultFlags| indicating whether the given width or height was | 500 // |ReformattingResultFlags| indicating whether the given width or height was |
500 // insufficient, leading to elision or truncation. | 501 // insufficient, leading to elision or truncation. |
501 int Finalize(); | 502 int Finalize(); |
502 | 503 |
504 // Returns maximum width of those lines which were broken after some words to | |
505 // fit |available_pixel_width_|. | |
506 float GetMaxBrokenPixelWidth() const { return max_broken_pixel_width_; } | |
Alexei Svitkine (slow)
2014/10/06 17:59:58
Nit: This should just be max_broken_pixel_width()
Roman Sorokin (ftl)
2014/10/07 09:21:53
Done.
| |
507 | |
503 private: | 508 private: |
504 // Add a line to the rectangular region at the current position, | 509 // Add a line to the rectangular region at the current position, |
505 // either by itself or by breaking it into words. | 510 // either by itself or by breaking it into words. |
506 void AddLine(const base::string16& line); | 511 void AddLine(const base::string16& line); |
507 | 512 |
508 // Wrap the specified word across multiple lines. | 513 // Wrap the specified word across multiple lines. |
509 int WrapWord(const base::string16& word); | 514 int WrapWord(const base::string16& word); |
510 | 515 |
511 // Add a long word - wrapping, eliding or truncating per the wrap behavior. | 516 // Add a long word - wrapping, eliding or truncating per the wrap behavior. |
512 int AddWordOverflow(const base::string16& word); | 517 int AddWordOverflow(const base::string16& word); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
555 // The output vector of lines. | 560 // The output vector of lines. |
556 std::vector<base::string16>* lines_; | 561 std::vector<base::string16>* lines_; |
557 | 562 |
558 // Indicates whether a word was so long that it had to be truncated or elided | 563 // Indicates whether a word was so long that it had to be truncated or elided |
559 // to fit the available width. | 564 // to fit the available width. |
560 bool insufficient_width_; | 565 bool insufficient_width_; |
561 | 566 |
562 // Indicates whether there were too many lines for the available height. | 567 // Indicates whether there were too many lines for the available height. |
563 bool insufficient_height_; | 568 bool insufficient_height_; |
564 | 569 |
570 // Maximum width of those lines which were broken after some words to | |
571 // fit |available_pixel_width_|. | |
572 float max_broken_pixel_width_; | |
573 | |
565 DISALLOW_COPY_AND_ASSIGN(RectangleText); | 574 DISALLOW_COPY_AND_ASSIGN(RectangleText); |
566 }; | 575 }; |
567 | 576 |
568 void RectangleText::AddString(const base::string16& input) { | 577 void RectangleText::AddString(const base::string16& input) { |
569 base::i18n::BreakIterator lines(input, | 578 base::i18n::BreakIterator lines(input, |
570 base::i18n::BreakIterator::BREAK_NEWLINE); | 579 base::i18n::BreakIterator::BREAK_NEWLINE); |
571 if (lines.Init()) { | 580 if (lines.Init()) { |
572 while (!insufficient_height_ && lines.Advance()) { | 581 while (!insufficient_height_ && lines.Advance()) { |
573 base::string16 line = lines.GetString(); | 582 base::string16 line = lines.GetString(); |
574 // The BREAK_NEWLINE iterator will keep the trailing newline character, | 583 // The BREAK_NEWLINE iterator will keep the trailing newline character, |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
684 | 693 |
685 int RectangleText::AddWord(const base::string16& word) { | 694 int RectangleText::AddWord(const base::string16& word) { |
686 int lines_added = 0; | 695 int lines_added = 0; |
687 base::string16 trimmed; | 696 base::string16 trimmed; |
688 base::TrimWhitespace(word, base::TRIM_TRAILING, &trimmed); | 697 base::TrimWhitespace(word, base::TRIM_TRAILING, &trimmed); |
689 const float trimmed_width = GetStringWidthF(trimmed, font_list_); | 698 const float trimmed_width = GetStringWidthF(trimmed, font_list_); |
690 if (trimmed_width <= available_pixel_width_) { | 699 if (trimmed_width <= available_pixel_width_) { |
691 // Word can be made to fit, no need to fragment it. | 700 // Word can be made to fit, no need to fragment it. |
692 if ((current_width_ + trimmed_width > available_pixel_width_) && NewLine()) | 701 if ((current_width_ + trimmed_width > available_pixel_width_) && NewLine()) |
693 lines_added++; | 702 lines_added++; |
703 max_broken_pixel_width_ = | |
704 std::max(max_broken_pixel_width_, current_width_ + trimmed_width); | |
694 // Append the non-trimmed word, in case more words are added after. | 705 // Append the non-trimmed word, in case more words are added after. |
695 AddToCurrentLine(word); | 706 AddToCurrentLine(word); |
696 } else { | 707 } else { |
697 lines_added = AddWordOverflow(wrap_behavior_ == IGNORE_LONG_WORDS ? | 708 lines_added = AddWordOverflow(wrap_behavior_ == IGNORE_LONG_WORDS ? |
698 trimmed : word); | 709 trimmed : word); |
699 } | 710 } |
700 return lines_added; | 711 return lines_added; |
701 } | 712 } |
702 | 713 |
703 void RectangleText::AddToCurrentLine(const base::string16& text) { | 714 void RectangleText::AddToCurrentLine(const base::string16& text) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
737 rect.Init(); | 748 rect.Init(); |
738 rect.AddString(input); | 749 rect.AddString(input); |
739 return rect.Finalize(); | 750 return rect.Finalize(); |
740 } | 751 } |
741 | 752 |
742 int ElideRectangleText(const base::string16& input, | 753 int ElideRectangleText(const base::string16& input, |
743 const FontList& font_list, | 754 const FontList& font_list, |
744 float available_pixel_width, | 755 float available_pixel_width, |
745 int available_pixel_height, | 756 int available_pixel_height, |
746 WordWrapBehavior wrap_behavior, | 757 WordWrapBehavior wrap_behavior, |
747 std::vector<base::string16>* lines) { | 758 std::vector<base::string16>* lines, |
759 float* max_broken_pixel_width) { | |
748 RectangleText rect(font_list, | 760 RectangleText rect(font_list, |
749 available_pixel_width, | 761 available_pixel_width, |
750 available_pixel_height, | 762 available_pixel_height, |
751 wrap_behavior, | 763 wrap_behavior, |
752 lines); | 764 lines); |
753 rect.Init(); | 765 rect.Init(); |
754 rect.AddString(input); | 766 rect.AddString(input); |
767 if (max_broken_pixel_width) | |
768 *max_broken_pixel_width = rect.GetMaxBrokenPixelWidth(); | |
755 return rect.Finalize(); | 769 return rect.Finalize(); |
756 } | 770 } |
757 | 771 |
758 base::string16 TruncateString(const base::string16& string, | 772 base::string16 TruncateString(const base::string16& string, |
759 size_t length, | 773 size_t length, |
760 BreakType break_type) { | 774 BreakType break_type) { |
761 DCHECK(break_type == CHARACTER_BREAK || break_type == WORD_BREAK); | 775 DCHECK(break_type == CHARACTER_BREAK || break_type == WORD_BREAK); |
762 | 776 |
763 if (string.size() <= length) | 777 if (string.size() <= length) |
764 // String fits, return it. | 778 // String fits, return it. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
815 index = char_iterator.getIndex(); | 829 index = char_iterator.getIndex(); |
816 } else { | 830 } else { |
817 // String has leading whitespace, return the elide string. | 831 // String has leading whitespace, return the elide string. |
818 return kElideString; | 832 return kElideString; |
819 } | 833 } |
820 | 834 |
821 return string.substr(0, index) + kElideString; | 835 return string.substr(0, index) + kElideString; |
822 } | 836 } |
823 | 837 |
824 } // namespace gfx | 838 } // namespace gfx |
OLD | NEW |