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 d5bec8b33248d549600280d137186bbcf8557850..297ea1978cb84132388d102cbef5833fa8ade271 100644 |
--- a/ui/views/controls/textfield/textfield_model.cc |
+++ b/ui/views/controls/textfield/textfield_model.cc |
@@ -527,6 +527,36 @@ bool TextfieldModel::Paste() { |
return true; |
} |
+bool TextfieldModel::Transpose() { |
+ if (HasCompositionText() || HasSelection()) |
+ return false; |
+ |
+ size_t cur = GetCursorPosition(); |
+ size_t next = render_text_->IndexOfAdjacentGrapheme(cur, gfx::CURSOR_FORWARD); |
+ size_t prev = |
+ render_text_->IndexOfAdjacentGrapheme(cur, gfx::CURSOR_BACKWARD); |
+ |
+ // At the end of the line, the last two characters should be transposed. |
+ if (cur == text().length()) { |
+ DCHECK_EQ(cur, next); |
+ cur = prev; |
+ prev = render_text_->IndexOfAdjacentGrapheme(prev, gfx::CURSOR_BACKWARD); |
+ } |
+ |
+ // This happens at the beginning of the line or when the line has less than |
+ // two graphemes. |
+ if (gfx::UTF16IndexToOffset(text(), prev, next) != 2) |
+ return false; |
+ |
+ SelectRange(gfx::Range(prev, next)); |
+ base::string16 text = GetSelectedText(); |
+ base::string16 transposed_text = |
+ text.substr(cur - prev) + text.substr(0, cur - prev); |
+ |
+ InsertTextInternal(transposed_text, false); |
+ return true; |
+} |
+ |
bool TextfieldModel::HasSelection() const { |
return !render_text_->selection().is_empty(); |
} |