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

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

Issue 2119813002: views::Textfield: Implement yank editing command. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments. Created 4 years, 5 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_model.cc
diff --git a/ui/views/controls/textfield/textfield_model.cc b/ui/views/controls/textfield/textfield_model.cc
index 7c6d5917f209fdcfbc0b5bb6c1c71ad1622e0044..6330495b4b6dc1e55be0a79fda714a6c1bc37d40 100644
--- a/ui/views/controls/textfield/textfield_model.cc
+++ b/ui/views/controls/textfield/textfield_model.cc
@@ -15,6 +15,7 @@
#include "ui/base/clipboard/scoped_clipboard_writer.h"
#include "ui/gfx/range/range.h"
#include "ui/gfx/utf16_indexing.h"
+#include "ui/views/views_delegate.h"
namespace views {
@@ -263,6 +264,17 @@ gfx::Range GetFirstEmphasizedRange(const ui::CompositionText& composition) {
return gfx::Range::InvalidRange();
}
+// Helper functions to get/set the kill buffer.
+const base::string16& GetKillBuffer() {
+ DCHECK(ViewsDelegate::GetInstance());
+ return ViewsDelegate::GetInstance()->kill_buffer();
+}
+
+void SetKillBuffer(const base::string16& kill_buffer) {
+ if(ViewsDelegate::GetInstance())
tapted 2016/07/20 06:32:21 nit: space after `if`
karandeepb 2016/07/20 07:51:30 Done. Forgot to run git cl format!
+ ViewsDelegate::GetInstance()->set_kill_buffer(kill_buffer);
+}
+
} // namespace
using internal::Edit;
@@ -325,13 +337,15 @@ void TextfieldModel::Append(const base::string16& new_text) {
ClearSelection();
}
-bool TextfieldModel::Delete() {
+bool TextfieldModel::Delete(bool add_to_kill_buffer) {
if (HasCompositionText()) {
// No undo/redo for composition text.
CancelCompositionText();
return true;
}
if (HasSelection()) {
+ if (add_to_kill_buffer)
+ SetKillBuffer(GetSelectedText());
DeleteSelection();
return true;
}
@@ -339,20 +353,24 @@ bool TextfieldModel::Delete() {
size_t cursor_position = GetCursorPosition();
size_t next_grapheme_index = render_text_->IndexOfAdjacentGrapheme(
cursor_position, gfx::CURSOR_FORWARD);
- ExecuteAndRecordDelete(gfx::Range(cursor_position, next_grapheme_index),
- true);
+ gfx::Range range_to_delete(cursor_position, next_grapheme_index);
+ if (add_to_kill_buffer)
+ SetKillBuffer(GetTextFromRange(range_to_delete));
+ ExecuteAndRecordDelete(range_to_delete, true);
return true;
}
return false;
}
-bool TextfieldModel::Backspace() {
+bool TextfieldModel::Backspace(bool add_to_kill_buffer) {
if (HasCompositionText()) {
// No undo/redo for composition text.
CancelCompositionText();
return true;
}
if (HasSelection()) {
+ if (add_to_kill_buffer)
+ SetKillBuffer(GetSelectedText());
DeleteSelection();
return true;
}
@@ -360,7 +378,10 @@ bool TextfieldModel::Backspace() {
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);
- ExecuteAndRecordDelete(gfx::Range(cursor_position, previous_char), true);
+ gfx::Range range_to_delete(cursor_position, previous_char);
+ if (add_to_kill_buffer)
+ SetKillBuffer(GetTextFromRange(range_to_delete));
+ ExecuteAndRecordDelete(range_to_delete, true);
return true;
}
return false;
@@ -557,6 +578,18 @@ bool TextfieldModel::Transpose() {
return true;
}
+bool TextfieldModel::Yank() {
+ if(!ViewsDelegate::GetInstance())
tapted 2016/07/20 06:32:21 nit: space after `if` (but also can this be reache
karandeepb 2016/07/20 07:51:30 The ViewsDelegate is initialized in ChromeBrowserM
+ return false;
+
+ const base::string16& kill_buffer = GetKillBuffer();
+ if (!kill_buffer.empty() || HasSelection()) {
+ InsertTextInternal(kill_buffer, false);
+ return true;
+ }
+ return false;
+}
+
bool TextfieldModel::HasSelection() const {
return !render_text_->selection().is_empty();
}

Powered by Google App Engine
This is Rietveld 408576698