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

Unified Diff: ui/views/controls/textfield/textfield_views_model.cc

Issue 135863002: Reland Merge NativeTextfieldViews into views::Textfield. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Handle Ctrl-Shift-Delete and Backspace on Linux, like on ChromeOS. Created 6 years, 11 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 side-by-side diff with in-line comments
Download patch
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.
« no previous file with comments | « ui/views/controls/textfield/textfield_views_model.h ('k') | ui/views/controls/textfield/textfield_views_model_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698