| 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 6179e8fda3d8c7362f9387c7ea292022a914c7de..355fa1ccf48ae54f67d12629f13afd416d2693e3 100644
|
| --- a/ui/views/controls/textfield/textfield_views_model.cc
|
| +++ b/ui/views/controls/textfield/textfield_views_model.cc
|
| @@ -306,22 +306,18 @@ TextfieldViewsModel::~TextfieldViewsModel() {
|
| ClearComposition();
|
| }
|
|
|
| -const base::string16& TextfieldViewsModel::GetText() const {
|
| - return render_text_->text();
|
| -}
|
| -
|
| -bool TextfieldViewsModel::SetText(const base::string16& text) {
|
| +bool TextfieldViewsModel::SetText(const base::string16& new_text) {
|
| bool changed = false;
|
| if (HasCompositionText()) {
|
| ConfirmCompositionText();
|
| changed = true;
|
| }
|
| - if (GetText() != text) {
|
| + if (text() != new_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 = text.length();
|
| + size_t new_cursor = new_text.length();
|
| SelectAll(false);
|
| // If there is a composition text, don't merge with previous edit.
|
| // Otherwise, force merge the edits.
|
| @@ -329,7 +325,7 @@ bool TextfieldViewsModel::SetText(const base::string16& text) {
|
| changed ? DO_NOT_MERGE : MERGE_WITH_PREVIOUS,
|
| old_cursor,
|
| new_cursor,
|
| - text,
|
| + new_text,
|
| 0U);
|
| render_text_->SetCursorPosition(new_cursor);
|
| }
|
| @@ -337,14 +333,14 @@ bool TextfieldViewsModel::SetText(const base::string16& text) {
|
| return changed;
|
| }
|
|
|
| -void TextfieldViewsModel::Append(const base::string16& text) {
|
| +void TextfieldViewsModel::Append(const base::string16& new_text) {
|
| if (HasCompositionText())
|
| ConfirmCompositionText();
|
| size_t save = GetCursorPosition();
|
| MoveCursor(gfx::LINE_BREAK,
|
| render_text_->GetVisualDirectionOfLogicalEnd(),
|
| false);
|
| - InsertText(text);
|
| + InsertText(new_text);
|
| render_text_->SetCursorPosition(save);
|
| ClearSelection();
|
| }
|
| @@ -359,7 +355,7 @@ bool TextfieldViewsModel::Delete() {
|
| DeleteSelection();
|
| return true;
|
| }
|
| - if (GetText().length() > GetCursorPosition()) {
|
| + if (text().length() > GetCursorPosition()) {
|
| size_t cursor_position = GetCursorPosition();
|
| size_t next_grapheme_index = render_text_->IndexOfAdjacentGrapheme(
|
| cursor_position, gfx::CURSOR_FORWARD);
|
| @@ -383,8 +379,7 @@ bool TextfieldViewsModel::Backspace() {
|
| 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(GetText(), cursor_position, -1);
|
| + size_t previous_char = gfx::UTF16OffsetToIndex(text(), cursor_position, -1);
|
| ExecuteAndRecordDelete(gfx::Range(cursor_position, previous_char), true);
|
| return true;
|
| }
|
| @@ -424,8 +419,8 @@ bool TextfieldViewsModel::MoveCursorTo(const gfx::Point& point, bool select) {
|
| }
|
|
|
| base::string16 TextfieldViewsModel::GetSelectedText() const {
|
| - return GetText().substr(render_text_->selection().GetMin(),
|
| - render_text_->selection().length());
|
| + return text().substr(render_text_->selection().GetMin(),
|
| + render_text_->selection().length());
|
| }
|
|
|
| void TextfieldViewsModel::SelectRange(const gfx::Range& range) {
|
| @@ -479,7 +474,7 @@ bool TextfieldViewsModel::Undo() {
|
| if (HasCompositionText()) // safe guard for release build.
|
| CancelCompositionText();
|
|
|
| - base::string16 old = GetText();
|
| + base::string16 old = text();
|
| size_t old_cursor = GetCursorPosition();
|
| (*current_edit_)->Commit();
|
| (*current_edit_)->Undo(this);
|
| @@ -488,7 +483,7 @@ bool TextfieldViewsModel::Undo() {
|
| current_edit_ = edit_history_.end();
|
| else
|
| current_edit_--;
|
| - return old != GetText() || old_cursor != GetCursorPosition();
|
| + return old != text() || old_cursor != GetCursorPosition();
|
| }
|
|
|
| bool TextfieldViewsModel::Redo() {
|
| @@ -502,10 +497,10 @@ bool TextfieldViewsModel::Redo() {
|
| current_edit_ = edit_history_.begin();
|
| else
|
| current_edit_ ++;
|
| - base::string16 old = GetText();
|
| + base::string16 old = text();
|
| size_t old_cursor = GetCursorPosition();
|
| (*current_edit_)->Redo(this);
|
| - return old != GetText() || old_cursor != GetCursorPosition();
|
| + return old != text() || old_cursor != GetCursorPosition();
|
| }
|
|
|
| bool TextfieldViewsModel::Cut() {
|
| @@ -558,25 +553,26 @@ void TextfieldViewsModel::DeleteSelection() {
|
| }
|
|
|
| void TextfieldViewsModel::DeleteSelectionAndInsertTextAt(
|
| - const base::string16& text, size_t position) {
|
| + const base::string16& new_text,
|
| + size_t position) {
|
| if (HasCompositionText())
|
| CancelCompositionText();
|
| ExecuteAndRecordReplace(DO_NOT_MERGE,
|
| GetCursorPosition(),
|
| - position + text.length(),
|
| - text,
|
| + position + new_text.length(),
|
| + new_text,
|
| position);
|
| }
|
|
|
| base::string16 TextfieldViewsModel::GetTextFromRange(
|
| const gfx::Range& range) const {
|
| - if (range.IsValid() && range.GetMin() < GetText().length())
|
| - return GetText().substr(range.GetMin(), range.length());
|
| + if (range.IsValid() && range.GetMin() < text().length())
|
| + return text().substr(range.GetMin(), range.length());
|
| return base::string16();
|
| }
|
|
|
| void TextfieldViewsModel::GetTextRange(gfx::Range* range) const {
|
| - *range = gfx::Range(0, GetText().length());
|
| + *range = gfx::Range(0, text().length());
|
| }
|
|
|
| void TextfieldViewsModel::SetCompositionText(
|
| @@ -590,7 +586,7 @@ void TextfieldViewsModel::SetCompositionText(
|
| return;
|
|
|
| size_t cursor = GetCursorPosition();
|
| - base::string16 new_text = GetText();
|
| + base::string16 new_text = text();
|
| render_text_->SetText(new_text.insert(cursor, composition.text));
|
| gfx::Range range(cursor, cursor + composition.text.length());
|
| render_text_->SetCompositionRange(range);
|
| @@ -619,10 +615,10 @@ void TextfieldViewsModel::SetCompositionText(
|
| void TextfieldViewsModel::ConfirmCompositionText() {
|
| DCHECK(HasCompositionText());
|
| gfx::Range range = render_text_->GetCompositionRange();
|
| - base::string16 text = GetText().substr(range.start(), range.length());
|
| + base::string16 composition = text().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, text, range.start()));
|
| + AddOrMergeEditHistory(new InsertEdit(false, composition, range.start()));
|
| render_text_->SetCursorPosition(range.end());
|
| ClearComposition();
|
| if (delegate_)
|
| @@ -633,7 +629,7 @@ void TextfieldViewsModel::CancelCompositionText() {
|
| DCHECK(HasCompositionText());
|
| gfx::Range range = render_text_->GetCompositionRange();
|
| ClearComposition();
|
| - base::string16 new_text = GetText();
|
| + base::string16 new_text = text();
|
| render_text_->SetText(new_text.erase(range.start(), range.length()));
|
| render_text_->SetCursorPosition(range.start());
|
| if (delegate_)
|
| @@ -652,23 +648,28 @@ bool TextfieldViewsModel::HasCompositionText() const {
|
| 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& text,
|
| +void TextfieldViewsModel::InsertTextInternal(const base::string16& new_text,
|
| bool mergeable) {
|
| if (HasCompositionText()) {
|
| CancelCompositionText();
|
| - ExecuteAndRecordInsert(text, mergeable);
|
| + ExecuteAndRecordInsert(new_text, mergeable);
|
| } else if (HasSelection()) {
|
| ExecuteAndRecordReplaceSelection(mergeable ? MERGEABLE : DO_NOT_MERGE,
|
| - text);
|
| + new_text);
|
| } else {
|
| - ExecuteAndRecordInsert(text, mergeable);
|
| + ExecuteAndRecordInsert(new_text, mergeable);
|
| }
|
| }
|
|
|
| -void TextfieldViewsModel::ReplaceTextInternal(const base::string16& text,
|
| +void TextfieldViewsModel::ReplaceTextInternal(const base::string16& new_text,
|
| bool mergeable) {
|
| if (HasCompositionText()) {
|
| CancelCompositionText();
|
| @@ -676,7 +677,7 @@ void TextfieldViewsModel::ReplaceTextInternal(const base::string16& text,
|
| 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 |text|. So, need to find the index of next grapheme first.
|
| + // with |new_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())
|
| @@ -685,12 +686,7 @@ void TextfieldViewsModel::ReplaceTextInternal(const base::string16& text,
|
| render_text_->SelectRange(gfx::Range(next, model.caret_pos()));
|
| }
|
| // Edit history is recorded in InsertText.
|
| - InsertTextInternal(text, mergeable);
|
| -}
|
| -
|
| -void TextfieldViewsModel::ClearEditHistory() {
|
| - STLDeleteElements(&edit_history_);
|
| - current_edit_ = edit_history_.end();
|
| + InsertTextInternal(new_text, mergeable);
|
| }
|
|
|
| void TextfieldViewsModel::ClearRedoHistory() {
|
| @@ -709,9 +705,9 @@ void TextfieldViewsModel::ClearRedoHistory() {
|
| void TextfieldViewsModel::ExecuteAndRecordDelete(gfx::Range range,
|
| bool mergeable) {
|
| size_t old_text_start = range.GetMin();
|
| - const base::string16 text = GetText().substr(old_text_start, range.length());
|
| + const base::string16 old_text = text().substr(old_text_start, range.length());
|
| bool backward = range.is_reversed();
|
| - Edit* edit = new DeleteEdit(mergeable, text, old_text_start, backward);
|
| + Edit* edit = new DeleteEdit(mergeable, old_text, old_text_start, backward);
|
| bool delete_edit = AddOrMergeEditHistory(edit);
|
| edit->Redo(this);
|
| if (delete_edit)
|
| @@ -719,7 +715,8 @@ void TextfieldViewsModel::ExecuteAndRecordDelete(gfx::Range range,
|
| }
|
|
|
| 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,
|
| @@ -751,9 +748,9 @@ void TextfieldViewsModel::ExecuteAndRecordReplace(
|
| delete edit;
|
| }
|
|
|
| -void TextfieldViewsModel::ExecuteAndRecordInsert(const base::string16& text,
|
| +void TextfieldViewsModel::ExecuteAndRecordInsert(const base::string16& new_text,
|
| bool mergeable) {
|
| - Edit* edit = new InsertEdit(mergeable, text, GetCursorPosition());
|
| + Edit* edit = new InsertEdit(mergeable, new_text, GetCursorPosition());
|
| bool delete_edit = AddOrMergeEditHistory(edit);
|
| edit->Redo(this);
|
| if (delete_edit)
|
| @@ -787,12 +784,12 @@ void TextfieldViewsModel::ModifyText(size_t delete_from,
|
| size_t new_text_insert_at,
|
| size_t new_cursor_pos) {
|
| DCHECK_LE(delete_from, delete_to);
|
| - base::string16 text = GetText();
|
| + base::string16 old_text = text();
|
| ClearComposition();
|
| if (delete_from != delete_to)
|
| - render_text_->SetText(text.erase(delete_from, delete_to - delete_from));
|
| + render_text_->SetText(old_text.erase(delete_from, delete_to - delete_from));
|
| if (!new_text.empty())
|
| - render_text_->SetText(text.insert(new_text_insert_at, new_text));
|
| + render_text_->SetText(old_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.
|
|
|