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/gfx/render_text.h" | 5 #include "ui/gfx/render_text.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/i18n/break_iterator.h" | 9 #include "base/i18n/break_iterator.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
657 Rect RenderText::GetCursorBounds(const SelectionModel& caret, | 657 Rect RenderText::GetCursorBounds(const SelectionModel& caret, |
658 bool insert_mode) { | 658 bool insert_mode) { |
659 EnsureLayout(); | 659 EnsureLayout(); |
660 | 660 |
661 size_t caret_pos = caret.caret_pos(); | 661 size_t caret_pos = caret.caret_pos(); |
662 DCHECK(IsCursorablePosition(caret_pos)); | 662 DCHECK(IsCursorablePosition(caret_pos)); |
663 // In overtype mode, ignore the affinity and always indicate that we will | 663 // In overtype mode, ignore the affinity and always indicate that we will |
664 // overtype the next character. | 664 // overtype the next character. |
665 LogicalCursorDirection caret_affinity = | 665 LogicalCursorDirection caret_affinity = |
666 insert_mode ? caret.caret_affinity() : CURSOR_FORWARD; | 666 insert_mode ? caret.caret_affinity() : CURSOR_FORWARD; |
667 int x = 0, width = 1, height = 0; | 667 int x = 0, width = 1; |
| 668 Size size = GetStringSize(); |
668 if (caret_pos == (caret_affinity == CURSOR_BACKWARD ? 0 : text().length())) { | 669 if (caret_pos == (caret_affinity == CURSOR_BACKWARD ? 0 : text().length())) { |
669 // The caret is attached to the boundary. Always return a 1-dip width caret, | 670 // The caret is attached to the boundary. Always return a 1-dip width caret, |
670 // since there is nothing to overtype. | 671 // since there is nothing to overtype. |
671 Size size = GetStringSize(); | |
672 if ((GetTextDirection() == base::i18n::RIGHT_TO_LEFT) == (caret_pos == 0)) | 672 if ((GetTextDirection() == base::i18n::RIGHT_TO_LEFT) == (caret_pos == 0)) |
673 x = size.width(); | 673 x = size.width(); |
674 height = size.height(); | |
675 } else { | 674 } else { |
676 size_t grapheme_start = (caret_affinity == CURSOR_FORWARD) ? | 675 size_t grapheme_start = (caret_affinity == CURSOR_FORWARD) ? |
677 caret_pos : IndexOfAdjacentGrapheme(caret_pos, CURSOR_BACKWARD); | 676 caret_pos : IndexOfAdjacentGrapheme(caret_pos, CURSOR_BACKWARD); |
678 ui::Range xspan; | 677 ui::Range xspan(GetGlyphBounds(grapheme_start)); |
679 GetGlyphBounds(grapheme_start, &xspan, &height); | |
680 if (insert_mode) { | 678 if (insert_mode) { |
681 x = (caret_affinity == CURSOR_BACKWARD) ? xspan.end() : xspan.start(); | 679 x = (caret_affinity == CURSOR_BACKWARD) ? xspan.end() : xspan.start(); |
682 } else { // overtype mode | 680 } else { // overtype mode |
683 x = xspan.GetMin(); | 681 x = xspan.GetMin(); |
684 width = xspan.length(); | 682 width = xspan.length(); |
685 } | 683 } |
686 } | 684 } |
687 height = std::min(height, display_rect().height()); | 685 return Rect(ToViewPoint(Point(x, 0)), Size(width, size.height())); |
688 int y = (display_rect().height() - height) / 2; | |
689 return Rect(ToViewPoint(Point(x, y)), Size(width, height)); | |
690 } | 686 } |
691 | 687 |
692 const Rect& RenderText::GetUpdatedCursorBounds() { | 688 const Rect& RenderText::GetUpdatedCursorBounds() { |
693 UpdateCachedBoundsAndOffset(); | 689 UpdateCachedBoundsAndOffset(); |
694 return cursor_bounds_; | 690 return cursor_bounds_; |
695 } | 691 } |
696 | 692 |
697 size_t RenderText::IndexOfAdjacentGrapheme(size_t index, | 693 size_t RenderText::IndexOfAdjacentGrapheme(size_t index, |
698 LogicalCursorDirection direction) { | 694 LogicalCursorDirection direction) { |
699 if (index > text().length()) | 695 if (index > text().length()) |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
978 void RenderText::DrawSelection(Canvas* canvas) { | 974 void RenderText::DrawSelection(Canvas* canvas) { |
979 const SkColor color = focused() ? | 975 const SkColor color = focused() ? |
980 selection_background_focused_color_ : | 976 selection_background_focused_color_ : |
981 selection_background_unfocused_color_; | 977 selection_background_unfocused_color_; |
982 const std::vector<Rect> sel = GetSubstringBounds(selection()); | 978 const std::vector<Rect> sel = GetSubstringBounds(selection()); |
983 for (std::vector<Rect>::const_iterator i = sel.begin(); i < sel.end(); ++i) | 979 for (std::vector<Rect>::const_iterator i = sel.begin(); i < sel.end(); ++i) |
984 canvas->FillRect(*i, color); | 980 canvas->FillRect(*i, color); |
985 } | 981 } |
986 | 982 |
987 } // namespace gfx | 983 } // namespace gfx |
OLD | NEW |