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

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

Issue 407993003: Fix gesture handling for Views textfields (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed tests Created 6 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
« no previous file with comments | « ui/views/controls/textfield/textfield.h ('k') | ui/views/controls/textfield/textfield_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/controls/textfield/textfield.cc
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc
index 9407f2d46311a5567321d21b8ffbbbadb03663d1..86d9a81dc61193785a9574a11acbebb7580358ad 100644
--- a/ui/views/controls/textfield/textfield.cc
+++ b/ui/views/controls/textfield/textfield.cc
@@ -271,6 +271,8 @@ Textfield::Textfield()
drop_cursor_visible_(false),
initiating_drag_(false),
aggregated_clicks_(0),
+ drag_start_display_offset_(0),
+ touch_handles_hidden_due_to_scroll_(false),
weak_ptr_factory_(this) {
set_context_menu_controller(this);
set_drag_controller(this);
@@ -340,6 +342,12 @@ void Textfield::SelectAll(bool reversed) {
UpdateAfterChange(false, true);
}
+void Textfield::SelectWordAt(const gfx::Point& point) {
+ model_->MoveCursorTo(point, false);
+ model_->SelectWord();
+ UpdateAfterChange(false, true);
+}
+
void Textfield::ClearSelection() {
model_->ClearSelection();
UpdateAfterChange(false, true);
@@ -583,9 +591,7 @@ bool Textfield::OnMousePressed(const ui::MouseEvent& event) {
MoveCursorTo(event.location(), event.IsShiftDown());
break;
case 1:
- model_->MoveCursorTo(event.location(), false);
- model_->SelectWord();
- UpdateAfterChange(false, true);
+ SelectWordAt(event.location());
double_click_word_ = GetRenderText()->selection();
break;
case 2:
@@ -693,80 +699,85 @@ ui::TextInputClient* Textfield::GetTextInputClient() {
void Textfield::OnGestureEvent(ui::GestureEvent* event) {
switch (event->type()) {
case ui::ET_GESTURE_TAP_DOWN:
- OnBeforeUserAction();
RequestFocus();
ShowImeIfNeeded();
-
- // We don't deselect if the point is in the selection
- // because TAP_DOWN may turn into a LONG_PRESS.
- if (!GetRenderText()->IsPointInSelection(event->location()))
- MoveCursorTo(event->location(), false);
- OnAfterUserAction();
- event->SetHandled();
- break;
- case ui::ET_GESTURE_SCROLL_UPDATE:
- OnBeforeUserAction();
- MoveCursorTo(event->location(), true);
- OnAfterUserAction();
- event->SetHandled();
- break;
- case ui::ET_GESTURE_SCROLL_END:
- case ui::ET_SCROLL_FLING_START:
- CreateTouchSelectionControllerAndNotifyIt();
event->SetHandled();
break;
case ui::ET_GESTURE_TAP:
if (event->details().tap_count() == 1) {
- CreateTouchSelectionControllerAndNotifyIt();
+ if (!GetRenderText()->IsPointInSelection(event->location())) {
+ OnBeforeUserAction();
+ MoveCursorTo(event->location(), false);
+ OnAfterUserAction();
+ }
+ } else if (event->details().tap_count() == 2) {
+ OnBeforeUserAction();
+ SelectWordAt(event->location());
+ OnAfterUserAction();
} else {
- DestroyTouchSelection();
OnBeforeUserAction();
SelectAll(false);
OnAfterUserAction();
- event->SetHandled();
}
+ CreateTouchSelectionControllerAndNotifyIt();
#if defined(OS_WIN)
if (!read_only())
base::win::DisplayVirtualKeyboard();
#endif
+ event->SetHandled();
break;
case ui::ET_GESTURE_LONG_PRESS:
- // If long press happens outside selection, select word and show context
- // menu (If touch selection is enabled, context menu is shown by the
- // |touch_selection_controller_|, hence we mark the event handled.
- // Otherwise, the regular context menu will be shown by views).
- // If long press happens in selected text and touch drag drop is enabled,
- // we will turn off touch selection (if one exists) and let views do drag
- // drop.
if (!GetRenderText()->IsPointInSelection(event->location())) {
+ // If long-press happens outside selection, select word and try to
+ // activate touch selection.
OnBeforeUserAction();
- model_->SelectWord();
- touch_selection_controller_.reset(
- ui::TouchSelectionController::create(this));
- UpdateAfterChange(false, true);
+ SelectWordAt(event->location());
OnAfterUserAction();
+ CreateTouchSelectionControllerAndNotifyIt();
+ // If touch selection activated successfully, mark event as handled so
+ // that the regular context menu is not shown.
if (touch_selection_controller_)
event->SetHandled();
- } else if (switches::IsTouchDragDropEnabled()) {
- initiating_drag_ = true;
- DestroyTouchSelection();
} else {
- if (!touch_selection_controller_)
- CreateTouchSelectionControllerAndNotifyIt();
- if (touch_selection_controller_)
- event->SetHandled();
+ // If long-press happens on the selection, deactivate touch selection
+ // and try to initiate drag-drop. If drag-drop is not enabled, context
+ // menu will be shown. Event is not marked as handled to let Views
+ // handle drag-drop or context menu.
+ DestroyTouchSelection();
+ initiating_drag_ = switches::IsTouchDragDropEnabled();
}
- return;
+ break;
case ui::ET_GESTURE_LONG_TAP:
- if (!touch_selection_controller_)
- CreateTouchSelectionControllerAndNotifyIt();
-
// If touch selection is enabled, the context menu on long tap will be
// shown by the |touch_selection_controller_|, hence we mark the event
- // handled so views does not try to show context menu on it.
+ // handled so Views does not try to show context menu on it.
if (touch_selection_controller_)
event->SetHandled();
break;
+ case ui::ET_GESTURE_SCROLL_BEGIN:
+ touch_handles_hidden_due_to_scroll_ = touch_selection_controller_ != NULL;
+ DestroyTouchSelection();
+ drag_start_location_ = event->location();
+ drag_start_display_offset_ =
+ GetRenderText()->GetUpdatedDisplayOffset().x();
+ event->SetHandled();
+ break;
+ case ui::ET_GESTURE_SCROLL_UPDATE: {
+ int new_offset = drag_start_display_offset_ + event->location().x() -
+ drag_start_location_.x();
+ GetRenderText()->SetDisplayOffset(new_offset);
+ SchedulePaint();
+ event->SetHandled();
+ break;
+ }
+ case ui::ET_GESTURE_SCROLL_END:
+ case ui::ET_SCROLL_FLING_START:
+ if (touch_handles_hidden_due_to_scroll_) {
+ CreateTouchSelectionControllerAndNotifyIt();
+ touch_handles_hidden_due_to_scroll_ = false;
+ }
+ event->SetHandled();
+ break;
default:
return;
}
« no previous file with comments | « ui/views/controls/textfield/textfield.h ('k') | ui/views/controls/textfield/textfield_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698