| Index: ui/views/controls/textfield/textfield.cc
|
| diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc
|
| index 1f940c5e476d76a626c87e4a09caa5b0d229b7c8..ea2a29aa89fec7a4c5d5b8aa545a4bfca1126253 100644
|
| --- a/ui/views/controls/textfield/textfield.cc
|
| +++ b/ui/views/controls/textfield/textfield.cc
|
| @@ -61,6 +61,18 @@ namespace views {
|
|
|
| namespace {
|
|
|
| +#if defined(OS_MACOSX)
|
| +const gfx::SelectionBehavior kLineSelectionBehavior = gfx::SELECTION_EXTEND;
|
| +const gfx::SelectionBehavior kWordSelectionBehavior = gfx::SELECTION_CARET;
|
| +const gfx::SelectionBehavior kMoveParagraphSelectionBehavior =
|
| + gfx::SELECTION_CARET;
|
| +#else
|
| +const gfx::SelectionBehavior kLineSelectionBehavior = gfx::SELECTION_RETAIN;
|
| +const gfx::SelectionBehavior kWordSelectionBehavior = gfx::SELECTION_RETAIN;
|
| +const gfx::SelectionBehavior kMoveParagraphSelectionBehavior =
|
| + gfx::SELECTION_RETAIN;
|
| +#endif
|
| +
|
| // Default placeholder text color.
|
| const SkColor kDefaultPlaceholderTextColor = SK_ColorLTGRAY;
|
|
|
| @@ -1468,6 +1480,8 @@ bool Textfield::IsTextEditCommandEnabled(ui::TextEditCommand command) const {
|
| case ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION:
|
| case ui::TextEditCommand::MOVE_TO_END_OF_PARAGRAPH:
|
| case ui::TextEditCommand::MOVE_TO_END_OF_PARAGRAPH_AND_MODIFY_SELECTION:
|
| + case ui::TextEditCommand::MOVE_PARAGRAPH_FORWARD_AND_MODIFY_SELECTION:
|
| + case ui::TextEditCommand::MOVE_PARAGRAPH_BACKWARD_AND_MODIFY_SELECTION:
|
| case ui::TextEditCommand::MOVE_WORD_BACKWARD:
|
| case ui::TextEditCommand::MOVE_WORD_BACKWARD_AND_MODIFY_SELECTION:
|
| case ui::TextEditCommand::MOVE_WORD_FORWARD:
|
| @@ -1504,6 +1518,13 @@ bool Textfield::IsTextEditCommandEnabled(ui::TextEditCommand command) const {
|
| case ui::TextEditCommand::MOVE_PAGE_UP_AND_MODIFY_SELECTION:
|
| case ui::TextEditCommand::MOVE_UP:
|
| case ui::TextEditCommand::MOVE_UP_AND_MODIFY_SELECTION:
|
| +// On Mac, the textfield should respond to Up/Down arrows keys and
|
| +// PageUp/PageDown.
|
| +#if defined(OS_MACOSX)
|
| + return true;
|
| +#else
|
| + return false;
|
| +#endif
|
| case ui::TextEditCommand::INSERT_TEXT:
|
| case ui::TextEditCommand::SET_MARK:
|
| case ui::TextEditCommand::UNSELECT:
|
| @@ -1588,91 +1609,118 @@ void Textfield::ExecuteTextEditCommand(ui::TextEditCommand command) {
|
| break;
|
| case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE:
|
| case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_PARAGRAPH:
|
| - model_->MoveCursor(gfx::LINE_BREAK, begin, true);
|
| + model_->MoveCursor(gfx::LINE_BREAK, begin, gfx::SELECTION_RETAIN);
|
| text_changed = cursor_changed = model_->Backspace(add_to_kill_buffer);
|
| break;
|
| case ui::TextEditCommand::DELETE_TO_END_OF_LINE:
|
| case ui::TextEditCommand::DELETE_TO_END_OF_PARAGRAPH:
|
| - model_->MoveCursor(gfx::LINE_BREAK, end, true);
|
| + model_->MoveCursor(gfx::LINE_BREAK, end, gfx::SELECTION_RETAIN);
|
| text_changed = cursor_changed = model_->Delete(add_to_kill_buffer);
|
| break;
|
| case ui::TextEditCommand::DELETE_WORD_BACKWARD:
|
| - model_->MoveCursor(gfx::WORD_BREAK, begin, true);
|
| + model_->MoveCursor(gfx::WORD_BREAK, begin, gfx::SELECTION_RETAIN);
|
| text_changed = cursor_changed = model_->Backspace(add_to_kill_buffer);
|
| break;
|
| case ui::TextEditCommand::DELETE_WORD_FORWARD:
|
| - model_->MoveCursor(gfx::WORD_BREAK, end, true);
|
| + model_->MoveCursor(gfx::WORD_BREAK, end, gfx::SELECTION_RETAIN);
|
| text_changed = cursor_changed = model_->Delete(add_to_kill_buffer);
|
| break;
|
| case ui::TextEditCommand::MOVE_BACKWARD:
|
| - model_->MoveCursor(gfx::CHARACTER_BREAK, begin, false);
|
| + model_->MoveCursor(gfx::CHARACTER_BREAK, begin, gfx::SELECTION_NONE);
|
| break;
|
| case ui::TextEditCommand::MOVE_BACKWARD_AND_MODIFY_SELECTION:
|
| - model_->MoveCursor(gfx::CHARACTER_BREAK, begin, true);
|
| + model_->MoveCursor(gfx::CHARACTER_BREAK, begin, gfx::SELECTION_RETAIN);
|
| break;
|
| case ui::TextEditCommand::MOVE_FORWARD:
|
| - model_->MoveCursor(gfx::CHARACTER_BREAK, end, false);
|
| + model_->MoveCursor(gfx::CHARACTER_BREAK, end, gfx::SELECTION_NONE);
|
| break;
|
| case ui::TextEditCommand::MOVE_FORWARD_AND_MODIFY_SELECTION:
|
| - model_->MoveCursor(gfx::CHARACTER_BREAK, end, true);
|
| + model_->MoveCursor(gfx::CHARACTER_BREAK, end, gfx::SELECTION_RETAIN);
|
| break;
|
| case ui::TextEditCommand::MOVE_LEFT:
|
| - model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, false);
|
| + model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT,
|
| + gfx::SELECTION_NONE);
|
| break;
|
| case ui::TextEditCommand::MOVE_LEFT_AND_MODIFY_SELECTION:
|
| - model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT, true);
|
| + model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_LEFT,
|
| + gfx::SELECTION_RETAIN);
|
| break;
|
| case ui::TextEditCommand::MOVE_RIGHT:
|
| - model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, false);
|
| + model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT,
|
| + gfx::SELECTION_NONE);
|
| break;
|
| case ui::TextEditCommand::MOVE_RIGHT_AND_MODIFY_SELECTION:
|
| - model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT, true);
|
| + model_->MoveCursor(gfx::CHARACTER_BREAK, gfx::CURSOR_RIGHT,
|
| + gfx::SELECTION_RETAIN);
|
| break;
|
| case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_DOCUMENT:
|
| case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE:
|
| case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_PARAGRAPH:
|
| - model_->MoveCursor(gfx::LINE_BREAK, begin, false);
|
| + case ui::TextEditCommand::MOVE_UP:
|
| + case ui::TextEditCommand::MOVE_PAGE_UP:
|
| + model_->MoveCursor(gfx::LINE_BREAK, begin, gfx::SELECTION_NONE);
|
| break;
|
| case ui::TextEditCommand::
|
| MOVE_TO_BEGINNING_OF_DOCUMENT_AND_MODIFY_SELECTION:
|
| case ui::TextEditCommand::MOVE_TO_BEGINNING_OF_LINE_AND_MODIFY_SELECTION:
|
| case ui::TextEditCommand::
|
| MOVE_TO_BEGINNING_OF_PARAGRAPH_AND_MODIFY_SELECTION:
|
| - model_->MoveCursor(gfx::LINE_BREAK, begin, true);
|
| + model_->MoveCursor(gfx::LINE_BREAK, begin, kLineSelectionBehavior);
|
| + break;
|
| + case ui::TextEditCommand::MOVE_PAGE_UP_AND_MODIFY_SELECTION:
|
| + case ui::TextEditCommand::MOVE_UP_AND_MODIFY_SELECTION:
|
| + model_->MoveCursor(gfx::LINE_BREAK, begin, gfx::SELECTION_RETAIN);
|
| break;
|
| case ui::TextEditCommand::MOVE_TO_END_OF_DOCUMENT:
|
| case ui::TextEditCommand::MOVE_TO_END_OF_LINE:
|
| case ui::TextEditCommand::MOVE_TO_END_OF_PARAGRAPH:
|
| - model_->MoveCursor(gfx::LINE_BREAK, end, false);
|
| + case ui::TextEditCommand::MOVE_DOWN:
|
| + case ui::TextEditCommand::MOVE_PAGE_DOWN:
|
| + model_->MoveCursor(gfx::LINE_BREAK, end, gfx::SELECTION_NONE);
|
| break;
|
| case ui::TextEditCommand::MOVE_TO_END_OF_DOCUMENT_AND_MODIFY_SELECTION:
|
| case ui::TextEditCommand::MOVE_TO_END_OF_LINE_AND_MODIFY_SELECTION:
|
| case ui::TextEditCommand::MOVE_TO_END_OF_PARAGRAPH_AND_MODIFY_SELECTION:
|
| - model_->MoveCursor(gfx::LINE_BREAK, end, true);
|
| + model_->MoveCursor(gfx::LINE_BREAK, end, kLineSelectionBehavior);
|
| + break;
|
| + case ui::TextEditCommand::MOVE_PAGE_DOWN_AND_MODIFY_SELECTION:
|
| + case ui::TextEditCommand::MOVE_DOWN_AND_MODIFY_SELECTION:
|
| + model_->MoveCursor(gfx::LINE_BREAK, end, gfx::SELECTION_RETAIN);
|
| + break;
|
| + case ui::TextEditCommand::MOVE_PARAGRAPH_BACKWARD_AND_MODIFY_SELECTION:
|
| + model_->MoveCursor(gfx::LINE_BREAK, begin,
|
| + kMoveParagraphSelectionBehavior);
|
| + break;
|
| + case ui::TextEditCommand::MOVE_PARAGRAPH_FORWARD_AND_MODIFY_SELECTION:
|
| + model_->MoveCursor(gfx::LINE_BREAK, end, kMoveParagraphSelectionBehavior);
|
| break;
|
| case ui::TextEditCommand::MOVE_WORD_BACKWARD:
|
| - model_->MoveCursor(gfx::WORD_BREAK, begin, false);
|
| + model_->MoveCursor(gfx::WORD_BREAK, begin, gfx::SELECTION_NONE);
|
| break;
|
| case ui::TextEditCommand::MOVE_WORD_BACKWARD_AND_MODIFY_SELECTION:
|
| - model_->MoveCursor(gfx::WORD_BREAK, begin, true);
|
| + model_->MoveCursor(gfx::WORD_BREAK, begin, kWordSelectionBehavior);
|
| break;
|
| case ui::TextEditCommand::MOVE_WORD_FORWARD:
|
| - model_->MoveCursor(gfx::WORD_BREAK, end, false);
|
| + model_->MoveCursor(gfx::WORD_BREAK, end, gfx::SELECTION_NONE);
|
| break;
|
| case ui::TextEditCommand::MOVE_WORD_FORWARD_AND_MODIFY_SELECTION:
|
| - model_->MoveCursor(gfx::WORD_BREAK, end, true);
|
| + model_->MoveCursor(gfx::WORD_BREAK, end, kWordSelectionBehavior);
|
| break;
|
| case ui::TextEditCommand::MOVE_WORD_LEFT:
|
| - model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, false);
|
| + model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT,
|
| + gfx::SELECTION_NONE);
|
| break;
|
| case ui::TextEditCommand::MOVE_WORD_LEFT_AND_MODIFY_SELECTION:
|
| - model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT, true);
|
| + model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_LEFT,
|
| + kWordSelectionBehavior);
|
| break;
|
| case ui::TextEditCommand::MOVE_WORD_RIGHT:
|
| - model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, false);
|
| + model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT,
|
| + gfx::SELECTION_NONE);
|
| break;
|
| case ui::TextEditCommand::MOVE_WORD_RIGHT_AND_MODIFY_SELECTION:
|
| - model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT, true);
|
| + model_->MoveCursor(gfx::WORD_BREAK, gfx::CURSOR_RIGHT,
|
| + kWordSelectionBehavior);
|
| break;
|
| case ui::TextEditCommand::UNDO:
|
| text_changed = cursor_changed = model_->Undo();
|
| @@ -1698,14 +1746,6 @@ void Textfield::ExecuteTextEditCommand(ui::TextEditCommand command) {
|
| case ui::TextEditCommand::YANK:
|
| text_changed = cursor_changed = model_->Yank();
|
| break;
|
| - case ui::TextEditCommand::MOVE_DOWN:
|
| - case ui::TextEditCommand::MOVE_DOWN_AND_MODIFY_SELECTION:
|
| - case ui::TextEditCommand::MOVE_PAGE_DOWN:
|
| - case ui::TextEditCommand::MOVE_PAGE_DOWN_AND_MODIFY_SELECTION:
|
| - case ui::TextEditCommand::MOVE_PAGE_UP:
|
| - case ui::TextEditCommand::MOVE_PAGE_UP_AND_MODIFY_SELECTION:
|
| - case ui::TextEditCommand::MOVE_UP:
|
| - case ui::TextEditCommand::MOVE_UP_AND_MODIFY_SELECTION:
|
| case ui::TextEditCommand::INSERT_TEXT:
|
| case ui::TextEditCommand::SET_MARK:
|
| case ui::TextEditCommand::UNSELECT:
|
| @@ -1817,10 +1857,12 @@ void Textfield::SelectThroughLastDragLocation() {
|
| const bool drags_to_end = PlatformStyle::kTextfieldDragVerticallyDragsToEnd;
|
| if (drags_to_end && last_drag_location_.y() < 0) {
|
| model_->MoveCursor(gfx::BreakType::LINE_BREAK,
|
| - gfx::VisualCursorDirection::CURSOR_LEFT, true);
|
| + gfx::VisualCursorDirection::CURSOR_LEFT,
|
| + gfx::SELECTION_RETAIN);
|
| } else if (drags_to_end && last_drag_location_.y() > height()) {
|
| model_->MoveCursor(gfx::BreakType::LINE_BREAK,
|
| - gfx::VisualCursorDirection::CURSOR_RIGHT, true);
|
| + gfx::VisualCursorDirection::CURSOR_RIGHT,
|
| + gfx::SELECTION_RETAIN);
|
| } else {
|
| model_->MoveCursorTo(last_drag_location_, true);
|
| }
|
|
|