| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "views/controls/textfield/textfield_views_model.h" | 5 #include "views/controls/textfield/textfield_views_model.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/i18n/break_iterator.h" | 9 #include "base/i18n/break_iterator.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 } | 424 } |
| 425 } | 425 } |
| 426 | 426 |
| 427 void TextfieldViewsModel::MoveCursorToPreviousWord(bool select) { | 427 void TextfieldViewsModel::MoveCursorToPreviousWord(bool select) { |
| 428 if (HasCompositionText()) | 428 if (HasCompositionText()) |
| 429 ConfirmCompositionText(); | 429 ConfirmCompositionText(); |
| 430 // Notes: We always iterate words from the begining. | 430 // Notes: We always iterate words from the begining. |
| 431 // This is probably fast enough for our usage, but we may | 431 // This is probably fast enough for our usage, but we may |
| 432 // want to modify WordIterator so that it can start from the | 432 // want to modify WordIterator so that it can start from the |
| 433 // middle of string and advance backwards. | 433 // middle of string and advance backwards. |
| 434 base::i18n::BreakIterator iter(&text_, base::i18n::BreakIterator::BREAK_WORD); | 434 base::i18n::BreakIterator iter(text_, base::i18n::BreakIterator::BREAK_WORD); |
| 435 bool success = iter.Init(); | 435 bool success = iter.Init(); |
| 436 DCHECK(success); | 436 DCHECK(success); |
| 437 if (!success) | 437 if (!success) |
| 438 return; | 438 return; |
| 439 int last = 0; | 439 int last = 0; |
| 440 while (iter.Advance()) { | 440 while (iter.Advance()) { |
| 441 if (iter.IsWord()) { | 441 if (iter.IsWord()) { |
| 442 size_t begin = iter.pos() - iter.GetString().length(); | 442 size_t begin = iter.pos() - iter.GetString().length(); |
| 443 if (begin == cursor_pos_) { | 443 if (begin == cursor_pos_) { |
| 444 // The cursor is at the beginning of a word. | 444 // The cursor is at the beginning of a word. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 456 } | 456 } |
| 457 | 457 |
| 458 cursor_pos_ = last; | 458 cursor_pos_ = last; |
| 459 if (!select) | 459 if (!select) |
| 460 ClearSelection(); | 460 ClearSelection(); |
| 461 } | 461 } |
| 462 | 462 |
| 463 void TextfieldViewsModel::MoveCursorToNextWord(bool select) { | 463 void TextfieldViewsModel::MoveCursorToNextWord(bool select) { |
| 464 if (HasCompositionText()) | 464 if (HasCompositionText()) |
| 465 ConfirmCompositionText(); | 465 ConfirmCompositionText(); |
| 466 base::i18n::BreakIterator iter(&text_, base::i18n::BreakIterator::BREAK_WORD); | 466 base::i18n::BreakIterator iter(text_, base::i18n::BreakIterator::BREAK_WORD); |
| 467 bool success = iter.Init(); | 467 bool success = iter.Init(); |
| 468 DCHECK(success); | 468 DCHECK(success); |
| 469 if (!success) | 469 if (!success) |
| 470 return; | 470 return; |
| 471 size_t pos = 0; | 471 size_t pos = 0; |
| 472 while (iter.Advance()) { | 472 while (iter.Advance()) { |
| 473 pos = iter.pos(); | 473 pos = iter.pos(); |
| 474 if (iter.IsWord() && pos > cursor_pos_) { | 474 if (iter.IsWord() && pos > cursor_pos_) { |
| 475 break; | 475 break; |
| 476 } | 476 } |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 891 text_.erase(delete_from, delete_to - delete_from); | 891 text_.erase(delete_from, delete_to - delete_from); |
| 892 if (!new_text.empty()) | 892 if (!new_text.empty()) |
| 893 text_.insert(new_text_insert_at, new_text); | 893 text_.insert(new_text_insert_at, new_text); |
| 894 cursor_pos_ = new_cursor_pos; | 894 cursor_pos_ = new_cursor_pos; |
| 895 ClearSelection(); | 895 ClearSelection(); |
| 896 // TODO(oshima): mac selects the text that is just undone (but gtk doesn't). | 896 // TODO(oshima): mac selects the text that is just undone (but gtk doesn't). |
| 897 // This looks fine feature and we may want to do the same. | 897 // This looks fine feature and we may want to do the same. |
| 898 } | 898 } |
| 899 | 899 |
| 900 } // namespace views | 900 } // namespace views |
| OLD | NEW |