| Index: ui/views/controls/textfield/textfield_views_model.cc
|
| diff --git a/ui/views/controls/textfield/textfield_views_model.cc b/ui/views/controls/textfield/textfield_views_model.cc
|
| index 355fa1ccf48ae54f67d12629f13afd416d2693e3..6179e8fda3d8c7362f9387c7ea292022a914c7de 100644
|
| --- a/ui/views/controls/textfield/textfield_views_model.cc
|
| +++ b/ui/views/controls/textfield/textfield_views_model.cc
|
| @@ -306,18 +306,22 @@
|
| ClearComposition();
|
| }
|
|
|
| -bool TextfieldViewsModel::SetText(const base::string16& new_text) {
|
| +const base::string16& TextfieldViewsModel::GetText() const {
|
| + return render_text_->text();
|
| +}
|
| +
|
| +bool TextfieldViewsModel::SetText(const base::string16& text) {
|
| bool changed = false;
|
| if (HasCompositionText()) {
|
| ConfirmCompositionText();
|
| changed = true;
|
| }
|
| - if (text() != new_text) {
|
| + if (GetText() != text) {
|
| if (changed) // No need to remember composition.
|
| Undo();
|
| size_t old_cursor = GetCursorPosition();
|
| // SetText moves the cursor to the end.
|
| - size_t new_cursor = new_text.length();
|
| + size_t new_cursor = text.length();
|
| SelectAll(false);
|
| // If there is a composition text, don't merge with previous edit.
|
| // Otherwise, force merge the edits.
|
| @@ -325,7 +329,7 @@
|
| changed ? DO_NOT_MERGE : MERGE_WITH_PREVIOUS,
|
| old_cursor,
|
| new_cursor,
|
| - new_text,
|
| + text,
|
| 0U);
|
| render_text_->SetCursorPosition(new_cursor);
|
| }
|
| @@ -333,14 +337,14 @@
|
| return changed;
|
| }
|
|
|
| -void TextfieldViewsModel::Append(const base::string16& new_text) {
|
| +void TextfieldViewsModel::Append(const base::string16& text) {
|
| if (HasCompositionText())
|
| ConfirmCompositionText();
|
| size_t save = GetCursorPosition();
|
| MoveCursor(gfx::LINE_BREAK,
|
| render_text_->GetVisualDirectionOfLogicalEnd(),
|
| false);
|
| - InsertText(new_text);
|
| + InsertText(text);
|
| render_text_->SetCursorPosition(save);
|
| ClearSelection();
|
| }
|
| @@ -355,7 +359,7 @@
|
| DeleteSelection();
|
| return true;
|
| }
|
| - if (text().length() > GetCursorPosition()) {
|
| + if (GetText().length() > GetCursorPosition()) {
|
| size_t cursor_position = GetCursorPosition();
|
| size_t next_grapheme_index = render_text_->IndexOfAdjacentGrapheme(
|
| cursor_position, gfx::CURSOR_FORWARD);
|
| @@ -379,7 +383,8 @@
|
| size_t cursor_position = GetCursorPosition();
|
| if (cursor_position > 0) {
|
| // Delete one code point, which may be two UTF-16 words.
|
| - size_t previous_char = gfx::UTF16OffsetToIndex(text(), cursor_position, -1);
|
| + size_t previous_char =
|
| + gfx::UTF16OffsetToIndex(GetText(), cursor_position, -1);
|
| ExecuteAndRecordDelete(gfx::Range(cursor_position, previous_char), true);
|
| return true;
|
| }
|
| @@ -419,8 +424,8 @@
|
| }
|
|
|
| base::string16 TextfieldViewsModel::GetSelectedText() const {
|
| - return text().substr(render_text_->selection().GetMin(),
|
| - render_text_->selection().length());
|
| + return GetText().substr(render_text_->selection().GetMin(),
|
| + render_text_->selection().length());
|
| }
|
|
|
| void TextfieldViewsModel::SelectRange(const gfx::Range& range) {
|
| @@ -474,7 +479,7 @@
|
| if (HasCompositionText()) // safe guard for release build.
|
| CancelCompositionText();
|
|
|
| - base::string16 old = text();
|
| + base::string16 old = GetText();
|
| size_t old_cursor = GetCursorPosition();
|
| (*current_edit_)->Commit();
|
| (*current_edit_)->Undo(this);
|
| @@ -483,7 +488,7 @@
|
| current_edit_ = edit_history_.end();
|
| else
|
| current_edit_--;
|
| - return old != text() || old_cursor != GetCursorPosition();
|
| + return old != GetText() || old_cursor != GetCursorPosition();
|
| }
|
|
|
| bool TextfieldViewsModel::Redo() {
|
| @@ -497,10 +502,10 @@
|
| current_edit_ = edit_history_.begin();
|
| else
|
| current_edit_ ++;
|
| - base::string16 old = text();
|
| + base::string16 old = GetText();
|
| size_t old_cursor = GetCursorPosition();
|
| (*current_edit_)->Redo(this);
|
| - return old != text() || old_cursor != GetCursorPosition();
|
| + return old != GetText() || old_cursor != GetCursorPosition();
|
| }
|
|
|
| bool TextfieldViewsModel::Cut() {
|
| @@ -553,26 +558,25 @@
|
| }
|
|
|
| void TextfieldViewsModel::DeleteSelectionAndInsertTextAt(
|
| - const base::string16& new_text,
|
| - size_t position) {
|
| + const base::string16& text, size_t position) {
|
| if (HasCompositionText())
|
| CancelCompositionText();
|
| ExecuteAndRecordReplace(DO_NOT_MERGE,
|
| GetCursorPosition(),
|
| - position + new_text.length(),
|
| - new_text,
|
| + position + text.length(),
|
| + text,
|
| position);
|
| }
|
|
|
| base::string16 TextfieldViewsModel::GetTextFromRange(
|
| const gfx::Range& range) const {
|
| - if (range.IsValid() && range.GetMin() < text().length())
|
| - return text().substr(range.GetMin(), range.length());
|
| + if (range.IsValid() && range.GetMin() < GetText().length())
|
| + return GetText().substr(range.GetMin(), range.length());
|
| return base::string16();
|
| }
|
|
|
| void TextfieldViewsModel::GetTextRange(gfx::Range* range) const {
|
| - *range = gfx::Range(0, text().length());
|
| + *range = gfx::Range(0, GetText().length());
|
| }
|
|
|
| void TextfieldViewsModel::SetCompositionText(
|
| @@ -586,7 +590,7 @@
|
| return;
|
|
|
| size_t cursor = GetCursorPosition();
|
| - base::string16 new_text = text();
|
| + base::string16 new_text = GetText();
|
| render_text_->SetText(new_text.insert(cursor, composition.text));
|
| gfx::Range range(cursor, cursor + composition.text.length());
|
| render_text_->SetCompositionRange(range);
|
| @@ -615,10 +619,10 @@
|
| void TextfieldViewsModel::ConfirmCompositionText() {
|
| DCHECK(HasCompositionText());
|
| gfx::Range range = render_text_->GetCompositionRange();
|
| - base::string16 composition = text().substr(range.start(), range.length());
|
| + base::string16 text = GetText().substr(range.start(), range.length());
|
| // TODO(oshima): current behavior on ChromeOS is a bit weird and not
|
| // sure exactly how this should work. Find out and fix if necessary.
|
| - AddOrMergeEditHistory(new InsertEdit(false, composition, range.start()));
|
| + AddOrMergeEditHistory(new InsertEdit(false, text, range.start()));
|
| render_text_->SetCursorPosition(range.end());
|
| ClearComposition();
|
| if (delegate_)
|
| @@ -629,7 +633,7 @@
|
| DCHECK(HasCompositionText());
|
| gfx::Range range = render_text_->GetCompositionRange();
|
| ClearComposition();
|
| - base::string16 new_text = text();
|
| + base::string16 new_text = GetText();
|
| render_text_->SetText(new_text.erase(range.start(), range.length()));
|
| render_text_->SetCursorPosition(range.start());
|
| if (delegate_)
|
| @@ -648,28 +652,23 @@
|
| return !render_text_->GetCompositionRange().is_empty();
|
| }
|
|
|
| -void TextfieldViewsModel::ClearEditHistory() {
|
| - STLDeleteElements(&edit_history_);
|
| - current_edit_ = edit_history_.end();
|
| -}
|
| -
|
| /////////////////////////////////////////////////////////////////
|
| // TextfieldViewsModel: private
|
|
|
| -void TextfieldViewsModel::InsertTextInternal(const base::string16& new_text,
|
| +void TextfieldViewsModel::InsertTextInternal(const base::string16& text,
|
| bool mergeable) {
|
| if (HasCompositionText()) {
|
| CancelCompositionText();
|
| - ExecuteAndRecordInsert(new_text, mergeable);
|
| + ExecuteAndRecordInsert(text, mergeable);
|
| } else if (HasSelection()) {
|
| ExecuteAndRecordReplaceSelection(mergeable ? MERGEABLE : DO_NOT_MERGE,
|
| - new_text);
|
| + text);
|
| } else {
|
| - ExecuteAndRecordInsert(new_text, mergeable);
|
| - }
|
| -}
|
| -
|
| -void TextfieldViewsModel::ReplaceTextInternal(const base::string16& new_text,
|
| + ExecuteAndRecordInsert(text, mergeable);
|
| + }
|
| +}
|
| +
|
| +void TextfieldViewsModel::ReplaceTextInternal(const base::string16& text,
|
| bool mergeable) {
|
| if (HasCompositionText()) {
|
| CancelCompositionText();
|
| @@ -677,7 +676,7 @@
|
| size_t cursor = GetCursorPosition();
|
| const gfx::SelectionModel& model = render_text_->selection_model();
|
| // When there is no selection, the default is to replace the next grapheme
|
| - // with |new_text|. So, need to find the index of next grapheme first.
|
| + // with |text|. So, need to find the index of next grapheme first.
|
| size_t next =
|
| render_text_->IndexOfAdjacentGrapheme(cursor, gfx::CURSOR_FORWARD);
|
| if (next == model.caret_pos())
|
| @@ -686,7 +685,12 @@
|
| render_text_->SelectRange(gfx::Range(next, model.caret_pos()));
|
| }
|
| // Edit history is recorded in InsertText.
|
| - InsertTextInternal(new_text, mergeable);
|
| + InsertTextInternal(text, mergeable);
|
| +}
|
| +
|
| +void TextfieldViewsModel::ClearEditHistory() {
|
| + STLDeleteElements(&edit_history_);
|
| + current_edit_ = edit_history_.end();
|
| }
|
|
|
| void TextfieldViewsModel::ClearRedoHistory() {
|
| @@ -705,9 +709,9 @@
|
| void TextfieldViewsModel::ExecuteAndRecordDelete(gfx::Range range,
|
| bool mergeable) {
|
| size_t old_text_start = range.GetMin();
|
| - const base::string16 old_text = text().substr(old_text_start, range.length());
|
| + const base::string16 text = GetText().substr(old_text_start, range.length());
|
| bool backward = range.is_reversed();
|
| - Edit* edit = new DeleteEdit(mergeable, old_text, old_text_start, backward);
|
| + Edit* edit = new DeleteEdit(mergeable, text, old_text_start, backward);
|
| bool delete_edit = AddOrMergeEditHistory(edit);
|
| edit->Redo(this);
|
| if (delete_edit)
|
| @@ -715,8 +719,7 @@
|
| }
|
|
|
| void TextfieldViewsModel::ExecuteAndRecordReplaceSelection(
|
| - MergeType merge_type,
|
| - const base::string16& new_text) {
|
| + MergeType merge_type, const base::string16& new_text) {
|
| size_t new_text_start = render_text_->selection().GetMin();
|
| size_t new_cursor_pos = new_text_start + new_text.length();
|
| ExecuteAndRecordReplace(merge_type,
|
| @@ -748,9 +751,9 @@
|
| delete edit;
|
| }
|
|
|
| -void TextfieldViewsModel::ExecuteAndRecordInsert(const base::string16& new_text,
|
| +void TextfieldViewsModel::ExecuteAndRecordInsert(const base::string16& text,
|
| bool mergeable) {
|
| - Edit* edit = new InsertEdit(mergeable, new_text, GetCursorPosition());
|
| + Edit* edit = new InsertEdit(mergeable, text, GetCursorPosition());
|
| bool delete_edit = AddOrMergeEditHistory(edit);
|
| edit->Redo(this);
|
| if (delete_edit)
|
| @@ -784,12 +787,12 @@
|
| size_t new_text_insert_at,
|
| size_t new_cursor_pos) {
|
| DCHECK_LE(delete_from, delete_to);
|
| - base::string16 old_text = text();
|
| + base::string16 text = GetText();
|
| ClearComposition();
|
| if (delete_from != delete_to)
|
| - render_text_->SetText(old_text.erase(delete_from, delete_to - delete_from));
|
| + render_text_->SetText(text.erase(delete_from, delete_to - delete_from));
|
| if (!new_text.empty())
|
| - render_text_->SetText(old_text.insert(new_text_insert_at, new_text));
|
| + render_text_->SetText(text.insert(new_text_insert_at, new_text));
|
| render_text_->SetCursorPosition(new_cursor_pos);
|
| // TODO(oshima): mac selects the text that is just undone (but gtk doesn't).
|
| // This looks fine feature and we may want to do the same.
|
|
|