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_config_helper.h" | 8 #include "ui/events/gesture_detection/gesture_config_helper.h" |
9 #include "ui/events/gesture_detection/gesture_detector.h" | 9 #include "ui/events/gesture_detection/gesture_detector.h" |
10 #include "ui/events/gesture_detection/motion_event.h" | 10 #include "ui/events/gesture_detection/motion_event.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 new ui::GestureDetector(config, listener, null_double_tap_listener)); | 27 new ui::GestureDetector(config, listener, null_double_tap_listener)); |
28 detector->set_longpress_enabled(false); | 28 detector->set_longpress_enabled(false); |
29 detector->set_showpress_enabled(false); | 29 detector->set_showpress_enabled(false); |
30 | 30 |
31 return detector.Pass(); | 31 return detector.Pass(); |
32 } | 32 } |
33 | 33 |
34 } // namespace | 34 } // namespace |
35 | 35 |
36 GestureTextSelector::GestureTextSelector(GestureTextSelectorClient* client) | 36 GestureTextSelector::GestureTextSelector(GestureTextSelectorClient* client) |
37 : client_(client), text_selection_triggered_(false) { | 37 : client_(client), |
| 38 text_selection_triggered_(false), |
| 39 secondary_button_pressed_(false), |
| 40 anchor_x_(0.0f), |
| 41 anchor_y_(0.0f) { |
38 DCHECK(client); | 42 DCHECK(client); |
39 } | 43 } |
40 | 44 |
41 GestureTextSelector::~GestureTextSelector() { | 45 GestureTextSelector::~GestureTextSelector() { |
42 } | 46 } |
43 | 47 |
44 bool GestureTextSelector::OnTouchEvent(const MotionEvent& event) { | 48 bool GestureTextSelector::OnTouchEvent(const MotionEvent& event) { |
45 if (event.GetAction() == MotionEvent::ACTION_DOWN) { | 49 if (event.GetAction() == MotionEvent::ACTION_DOWN) { |
46 // Only trigger selection on ACTION_DOWN to prevent partial touch or gesture | 50 // Only trigger selection on ACTION_DOWN to prevent partial touch or gesture |
47 // sequences from being forwarded. | 51 // sequences from being forwarded. |
48 text_selection_triggered_ = ShouldStartTextSelection(event); | 52 text_selection_triggered_ = ShouldStartTextSelection(event); |
| 53 secondary_button_pressed_ = |
| 54 event.GetButtonState() == MotionEvent::BUTTON_SECONDARY; |
| 55 anchor_x_ = event.GetX(); |
| 56 anchor_y_ = event.GetY(); |
49 } | 57 } |
50 | 58 |
51 if (!text_selection_triggered_) | 59 if (!text_selection_triggered_) |
52 return false; | 60 return false; |
53 | 61 |
| 62 if (event.GetAction() == MotionEvent::ACTION_MOVE) { |
| 63 secondary_button_pressed_ = |
| 64 event.GetButtonState() == MotionEvent::BUTTON_SECONDARY; |
| 65 if (!secondary_button_pressed_) { |
| 66 anchor_x_ = event.GetX(); |
| 67 anchor_y_ = event.GetY(); |
| 68 } |
| 69 } |
| 70 |
54 if (!gesture_detector_) | 71 if (!gesture_detector_) |
55 gesture_detector_ = CreateGestureDetector(this); | 72 gesture_detector_ = CreateGestureDetector(this); |
56 | 73 |
57 gesture_detector_->OnTouchEvent(event); | 74 gesture_detector_->OnTouchEvent(event); |
58 | 75 |
59 // Always return true, even if |gesture_detector_| technically doesn't | 76 // Always return true, even if |gesture_detector_| technically doesn't |
60 // consume the event, to prevent a partial touch stream from being forwarded. | 77 // consume the event, to prevent a partial touch stream from being forwarded. |
61 return true; | 78 return true; |
62 } | 79 } |
63 | 80 |
64 bool GestureTextSelector::OnSingleTapUp(const MotionEvent& e) { | 81 bool GestureTextSelector::OnSingleTapUp(const MotionEvent& e) { |
65 DCHECK(text_selection_triggered_); | 82 DCHECK(text_selection_triggered_); |
66 client_->LongPress(e.GetEventTime(), e.GetX(), e.GetY()); | 83 client_->LongPress(e.GetEventTime(), e.GetX(), e.GetY()); |
67 return true; | 84 return true; |
68 } | 85 } |
69 | 86 |
70 bool GestureTextSelector::OnScroll(const MotionEvent& e1, | 87 bool GestureTextSelector::OnScroll(const MotionEvent& e1, |
71 const MotionEvent& e2, | 88 const MotionEvent& e2, |
72 float distance_x, | 89 float distance_x, |
73 float distance_y) { | 90 float distance_y) { |
74 DCHECK(text_selection_triggered_); | 91 DCHECK(text_selection_triggered_); |
| 92 |
| 93 // Return if Stylus button is not pressed. |
| 94 if (!secondary_button_pressed_) |
| 95 return true; |
| 96 |
75 // TODO(changwan): check if we can show handles after the scroll finishes | 97 // TODO(changwan): check if we can show handles after the scroll finishes |
76 // instead. Currently it is not possible as ShowSelectionHandles should | 98 // instead. Currently it is not possible as ShowSelectionHandles should |
77 // be called before we change the selection. | 99 // be called before we change the selection. |
78 client_->ShowSelectionHandlesAutomatically(); | 100 client_->ShowSelectionHandlesAutomatically(); |
79 client_->SelectRange(e1.GetX(), e1.GetY(), e2.GetX(), e2.GetY()); | 101 client_->SelectRange(anchor_x_, anchor_y_, e2.GetX(), e2.GetY()); |
80 return true; | 102 return true; |
81 } | 103 } |
82 | 104 |
83 // static | 105 // static |
84 bool GestureTextSelector::ShouldStartTextSelection(const MotionEvent& event) { | 106 bool GestureTextSelector::ShouldStartTextSelection(const MotionEvent& event) { |
85 DCHECK_GT(event.GetPointerCount(), 0u); | 107 DCHECK_GT(event.GetPointerCount(), 0u); |
86 // Currently we are supporting stylus-only cases. | 108 // Currently we are supporting stylus-only cases. |
87 const bool is_stylus = event.GetToolType(0) == MotionEvent::TOOL_TYPE_STYLUS; | 109 const bool is_stylus = event.GetToolType(0) == MotionEvent::TOOL_TYPE_STYLUS; |
88 const bool is_only_secondary_button_pressed = | 110 const bool is_only_secondary_button_pressed = |
89 event.GetButtonState() == MotionEvent::BUTTON_SECONDARY; | 111 event.GetButtonState() == MotionEvent::BUTTON_SECONDARY; |
90 return is_stylus && is_only_secondary_button_pressed; | 112 return is_stylus && is_only_secondary_button_pressed; |
91 } | 113 } |
92 | 114 |
93 } // namespace content | 115 } // namespace content |
OLD | NEW |