Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: ui/gfx/render_text.cc

Issue 14264004: Re-land: NativeTextfieldViews: Show the drop cursor when dragging text (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 593 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 Rect clip_rect(display_rect()); 604 Rect clip_rect(display_rect());
605 clip_rect.Inset(ShadowValue::GetMargin(text_shadows_)); 605 clip_rect.Inset(ShadowValue::GetMargin(text_shadows_));
606 606
607 canvas->Save(); 607 canvas->Save();
608 canvas->ClipRect(clip_rect); 608 canvas->ClipRect(clip_rect);
609 } 609 }
610 610
611 if (!text().empty()) 611 if (!text().empty())
612 DrawSelection(canvas); 612 DrawSelection(canvas);
613 613
614 DrawCursor(canvas); 614 if (cursor_enabled() && cursor_visible() && focused())
615 DrawCursor(canvas, selection_model_);
615 616
616 if (!text().empty()) 617 if (!text().empty())
617 DrawVisualText(canvas); 618 DrawVisualText(canvas);
618 619
619 if (clip_to_display_rect()) 620 if (clip_to_display_rect())
620 canvas->Restore(); 621 canvas->Restore();
621 } 622 }
622 623
624 void RenderText::DrawCursor(Canvas* canvas, const SelectionModel& position) {
625 // Paint cursor. Replace cursor is drawn as rectangle for now.
626 // TODO(msw): Draw a better cursor with a better indication of association.
627 canvas->FillRect(GetCursorBounds(position, true), cursor_color_);
628 }
629
623 void RenderText::DrawSelectedText(Canvas* canvas) { 630 void RenderText::DrawSelectedText(Canvas* canvas) {
624 EnsureLayout(); 631 EnsureLayout();
625 const std::vector<Rect> sel = GetSubstringBounds(selection()); 632 const std::vector<Rect> sel = GetSubstringBounds(selection());
626 for (size_t i = 0; i < sel.size(); ++i) { 633 for (size_t i = 0; i < sel.size(); ++i) {
627 canvas->Save(); 634 canvas->Save();
628 canvas->ClipRect(sel[i]); 635 canvas->ClipRect(sel[i]);
629 DrawVisualText(canvas); 636 DrawVisualText(canvas);
630 canvas->Restore(); 637 canvas->Restore();
631 } 638 }
632 } 639 }
633 640
634 Rect RenderText::GetCursorBounds(const SelectionModel& caret, 641 Rect RenderText::GetCursorBounds(const SelectionModel& caret,
635 bool insert_mode) { 642 bool insert_mode) {
636 EnsureLayout(); 643 EnsureLayout();
637 644
638 size_t caret_pos = caret.caret_pos(); 645 size_t caret_pos = caret.caret_pos();
646 DCHECK(IsCursorablePosition(caret_pos));
639 // In overtype mode, ignore the affinity and always indicate that we will 647 // In overtype mode, ignore the affinity and always indicate that we will
640 // overtype the next character. 648 // overtype the next character.
641 LogicalCursorDirection caret_affinity = 649 LogicalCursorDirection caret_affinity =
642 insert_mode ? caret.caret_affinity() : CURSOR_FORWARD; 650 insert_mode ? caret.caret_affinity() : CURSOR_FORWARD;
643 int x = 0, width = 1, height = 0; 651 int x = 0, width = 1, height = 0;
644 if (caret_pos == (caret_affinity == CURSOR_BACKWARD ? 0 : text().length())) { 652 if (caret_pos == (caret_affinity == CURSOR_BACKWARD ? 0 : text().length())) {
645 // The caret is attached to the boundary. Always return a 1-dip width caret, 653 // The caret is attached to the boundary. Always return a 1-dip width caret,
646 // since there is nothing to overtype. 654 // since there is nothing to overtype.
647 Size size = GetStringSize(); 655 Size size = GetStringSize();
648 if ((GetTextDirection() == base::i18n::RIGHT_TO_LEFT) == (caret_pos == 0)) 656 if ((GetTextDirection() == base::i18n::RIGHT_TO_LEFT) == (caret_pos == 0))
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 } 964 }
957 965
958 void RenderText::DrawSelection(Canvas* canvas) { 966 void RenderText::DrawSelection(Canvas* canvas) {
959 const SkColor color = focused() ? selection_background_focused_color_ : 967 const SkColor color = focused() ? selection_background_focused_color_ :
960 selection_background_unfocused_color_; 968 selection_background_unfocused_color_;
961 const std::vector<Rect> sel = GetSubstringBounds(selection()); 969 const std::vector<Rect> sel = GetSubstringBounds(selection());
962 for (std::vector<Rect>::const_iterator i = sel.begin(); i < sel.end(); ++i) 970 for (std::vector<Rect>::const_iterator i = sel.begin(); i < sel.end(); ++i)
963 canvas->FillRect(*i, color); 971 canvas->FillRect(*i, color);
964 } 972 }
965 973
966 void RenderText::DrawCursor(Canvas* canvas) {
967 // Paint cursor. Replace cursor is drawn as rectangle for now.
968 // TODO(msw): Draw a better cursor with a better indication of association.
969 if (cursor_enabled() && cursor_visible() && focused()) {
970 canvas->FillRect(GetUpdatedCursorBounds(),
971 insert_mode_ ? cursor_color_ : selection_background_unfocused_color_);
972 }
973 }
974
975 } // namespace gfx 974 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698