Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/browser/renderer_host/input/gesture_text_selector.h" | 5 #include "content/browser/renderer_host/input/gesture_text_selector.h" |
| 6 | 6 |
| 7 #include "ui/events/event_constants.h" | 7 #include "ui/events/event_constants.h" |
| 8 #include "ui/events/gesture_detection/gesture_event_data.h" | 8 #include "ui/events/gesture_detection/gesture_event_data.h" |
| 9 #include "ui/events/gesture_detection/motion_event.h" | 9 #include "ui/events/gesture_detection/motion_event.h" |
| 10 | 10 |
| 11 namespace content { | 11 namespace content { |
| 12 | 12 |
| 13 GestureTextSelector::GestureTextSelector(GestureTextSelectorClient* client) | 13 GestureTextSelector::GestureTextSelector(GestureTextSelectorClient* client) |
| 14 : client_(client), | 14 : client_(client), |
| 15 text_selection_triggered_(false), | 15 text_selection_triggered_(false), |
| 16 secondary_button_pressed_(false), | |
| 16 anchor_x_(0.0f), | 17 anchor_x_(0.0f), |
| 17 anchor_y_(0.0f) { | 18 anchor_y_(0.0f) { |
| 18 } | 19 } |
| 19 | 20 |
| 20 GestureTextSelector::~GestureTextSelector() { | 21 GestureTextSelector::~GestureTextSelector() { |
| 21 } | 22 } |
| 22 | 23 |
| 23 bool GestureTextSelector::OnTouchEvent(const ui::MotionEvent& event) { | 24 bool GestureTextSelector::OnTouchEvent(const ui::MotionEvent& event) { |
| 24 if (event.GetAction() == ui::MotionEvent::ACTION_DOWN) { | 25 if (event.GetAction() == ui::MotionEvent::ACTION_DOWN) { |
| 25 // Only trigger selection on ACTION_DOWN to prevent partial touch or gesture | 26 // Only trigger selection on ACTION_DOWN to prevent partial touch or gesture |
| 26 // sequences from being forwarded. | 27 // sequences from being forwarded. |
| 27 text_selection_triggered_ = ShouldStartTextSelection(event); | 28 text_selection_triggered_ = ShouldStartTextSelection(event); |
| 28 } | 29 } |
| 30 if (text_selection_triggered_ && | |
| 31 event.GetAction() == ui::MotionEvent::ACTION_MOVE) { | |
| 32 secondary_button_pressed_ = | |
| 33 event.GetButtonState() == ui::MotionEvent::BUTTON_SECONDARY; | |
| 34 } | |
| 29 return text_selection_triggered_; | 35 return text_selection_triggered_; |
| 30 } | 36 } |
| 31 | 37 |
| 32 bool GestureTextSelector::OnGestureEvent(const ui::GestureEventData& gesture) { | 38 bool GestureTextSelector::OnGestureEvent(const ui::GestureEventData& gesture) { |
| 33 if (!text_selection_triggered_) | 39 if (!text_selection_triggered_) |
| 34 return false; | 40 return false; |
| 35 | 41 |
| 36 switch (gesture.type()) { | 42 switch (gesture.type()) { |
| 37 case ui::ET_GESTURE_TAP: { | 43 case ui::ET_GESTURE_TAP: { |
| 38 client_->LongPress(gesture.time, gesture.x, gesture.y); | 44 client_->LongPress(gesture.time, gesture.x, gesture.y); |
| 39 break; | 45 break; |
| 40 } | 46 } |
| 41 case ui::ET_GESTURE_SCROLL_BEGIN: { | 47 case ui::ET_GESTURE_SCROLL_BEGIN: { |
| 42 client_->Unselect(); | 48 client_->Unselect(); |
| 43 anchor_x_ = gesture.x; | 49 anchor_x_ = gesture.x; |
| 44 anchor_y_ = gesture.y; | 50 anchor_y_ = gesture.y; |
| 45 break; | 51 break; |
| 46 } | 52 } |
| 47 case ui::ET_GESTURE_SCROLL_UPDATE: { | 53 case ui::ET_GESTURE_SCROLL_UPDATE: { |
| 48 // TODO(changwan): check if we can show handles on ET_GESTURE_SCROLL_END | 54 // TODO(changwan): check if we can show handles on ET_GESTURE_SCROLL_END |
| 49 // instead. Currently it is not possible as ShowSelectionHandles should | 55 // instead. Currently it is not possible as ShowSelectionHandles should |
| 50 // be called before we change the selection. | 56 // be called before we change the selection. |
| 51 client_->ShowSelectionHandlesAutomatically(); | 57 if (secondary_button_pressed_) { |
|
jdduke (slow)
2014/09/23 15:10:48
So, what happens when the user repeatedly presses/
AviD
2014/09/23 16:01:04
Yes, you are right. Triggering a new selection in
| |
| 52 client_->SelectRange(anchor_x_, anchor_y_, gesture.x, gesture.y); | 58 client_->ShowSelectionHandlesAutomatically(); |
| 59 client_->SelectRange(anchor_x_, anchor_y_, gesture.x, gesture.y); | |
| 60 } | |
| 53 break; | 61 break; |
| 54 } | 62 } |
| 55 default: | 63 default: |
| 56 // Suppress all other gestures when we are selecting text. | 64 // Suppress all other gestures when we are selecting text. |
| 57 break; | 65 break; |
| 58 } | 66 } |
| 59 return true; | 67 return true; |
| 60 } | 68 } |
| 61 | 69 |
| 62 // static | 70 // static |
| 63 bool GestureTextSelector::ShouldStartTextSelection( | 71 bool GestureTextSelector::ShouldStartTextSelection( |
| 64 const ui::MotionEvent& event) { | 72 const ui::MotionEvent& event) { |
| 65 DCHECK_GT(event.GetPointerCount(), 0u); | 73 DCHECK_GT(event.GetPointerCount(), 0u); |
| 66 // Currently we are supporting stylus-only cases. | 74 // Currently we are supporting stylus-only cases. |
| 67 const bool is_stylus = | 75 const bool is_stylus = |
| 68 event.GetToolType(0) == ui::MotionEvent::TOOL_TYPE_STYLUS; | 76 event.GetToolType(0) == ui::MotionEvent::TOOL_TYPE_STYLUS; |
| 69 const bool is_only_secondary_button_pressed = | 77 const bool is_only_secondary_button_pressed = |
| 70 event.GetButtonState() == ui::MotionEvent::BUTTON_SECONDARY; | 78 event.GetButtonState() == ui::MotionEvent::BUTTON_SECONDARY; |
| 71 return is_stylus && is_only_secondary_button_pressed; | 79 return is_stylus && is_only_secondary_button_pressed; |
| 72 } | 80 } |
| 73 | 81 |
| 74 } // namespace content | 82 } // namespace content |
| OLD | NEW |