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 "ui/touch_selection/touch_selection_controller.h" | 5 #include "ui/touch_selection/touch_selection_controller.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
10 | 10 |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 if ((event_pos - GetStartPosition()).LengthSquared() <= | 167 if ((event_pos - GetStartPosition()).LengthSquared() <= |
168 (event_pos - GetEndPosition()).LengthSquared()) { | 168 (event_pos - GetEndPosition()).LengthSquared()) { |
169 return start_selection_handle_->WillHandleTouchEvent(event); | 169 return start_selection_handle_->WillHandleTouchEvent(event); |
170 } | 170 } |
171 return end_selection_handle_->WillHandleTouchEvent(event); | 171 return end_selection_handle_->WillHandleTouchEvent(event); |
172 } | 172 } |
173 | 173 |
174 return false; | 174 return false; |
175 } | 175 } |
176 | 176 |
177 bool TouchSelectionController::WillHandleTapEvent(const gfx::PointF& location) { | 177 bool TouchSelectionController::WillHandleTapEvent(const gfx::PointF& location, |
| 178 int tap_count) { |
178 if (WillHandleTapOrLongPress(location)) | 179 if (WillHandleTapOrLongPress(location)) |
179 return true; | 180 return true; |
180 | 181 |
181 response_pending_input_event_ = TAP; | 182 if (tap_count > 1) { |
182 if (active_status_ != SELECTION_ACTIVE) | 183 response_pending_input_event_ = REPEATED_TAP; |
183 activate_selection_automatically_ = false; | 184 ShowSelectionHandlesAutomatically(); |
| 185 } else { |
| 186 response_pending_input_event_ = TAP; |
| 187 if (active_status_ != SELECTION_ACTIVE) |
| 188 activate_selection_automatically_ = false; |
| 189 } |
184 ShowInsertionHandleAutomatically(); | 190 ShowInsertionHandleAutomatically(); |
185 if (selection_empty_ && !config_.show_on_tap_for_empty_editable) | 191 if (selection_empty_ && !config_.show_on_tap_for_empty_editable) |
186 DeactivateInsertion(); | 192 DeactivateInsertion(); |
187 ForceNextUpdateIfInactive(); | 193 ForceNextUpdateIfInactive(); |
188 return false; | 194 return false; |
189 } | 195 } |
190 | 196 |
191 bool TouchSelectionController::WillHandleLongPressEvent( | 197 bool TouchSelectionController::WillHandleLongPressEvent( |
192 base::TimeTicks event_time, | 198 base::TimeTicks event_time, |
193 const gfx::PointF& location) { | 199 const gfx::PointF& location) { |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 RectFBetweenSelectionBounds(start_, end_).Contains(location)) { | 427 RectFBetweenSelectionBounds(start_, end_).Contains(location)) { |
422 AllowShowingFromCurrentSelection(); | 428 AllowShowingFromCurrentSelection(); |
423 return true; | 429 return true; |
424 } | 430 } |
425 return false; | 431 return false; |
426 } | 432 } |
427 | 433 |
428 void TouchSelectionController::OnInsertionChanged() { | 434 void TouchSelectionController::OnInsertionChanged() { |
429 DeactivateSelection(); | 435 DeactivateSelection(); |
430 | 436 |
431 if (response_pending_input_event_ == TAP && selection_empty_ && | 437 if ((response_pending_input_event_ == TAP || |
432 !config_.show_on_tap_for_empty_editable) { | 438 response_pending_input_event_ == REPEATED_TAP) && |
| 439 selection_empty_ && !config_.show_on_tap_for_empty_editable) { |
433 HideAndDisallowShowingAutomatically(); | 440 HideAndDisallowShowingAutomatically(); |
434 return; | 441 return; |
435 } | 442 } |
436 | 443 |
437 if (!activate_insertion_automatically_) | 444 if (!activate_insertion_automatically_) |
438 return; | 445 return; |
439 | 446 |
440 const bool activated = ActivateInsertionIfNecessary(); | 447 const bool activated = ActivateInsertionIfNecessary(); |
441 | 448 |
442 const TouchHandle::AnimationStyle animation = GetAnimationStyle(!activated); | 449 const TouchHandle::AnimationStyle animation = GetAnimationStyle(!activated); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 } else { | 512 } else { |
506 end_selection_handle_->SetEnabled(true); | 513 end_selection_handle_->SetEnabled(true); |
507 end_selection_handle_->SetOrientation(end_orientation_); | 514 end_selection_handle_->SetOrientation(end_orientation_); |
508 } | 515 } |
509 | 516 |
510 // As a long press received while a selection is already active may trigger | 517 // As a long press received while a selection is already active may trigger |
511 // an entirely new selection, notify the client but avoid sending an | 518 // an entirely new selection, notify the client but avoid sending an |
512 // intervening SELECTION_HANDLES_CLEARED update to avoid unnecessary state | 519 // intervening SELECTION_HANDLES_CLEARED update to avoid unnecessary state |
513 // changes. | 520 // changes. |
514 if (active_status_ == INACTIVE || | 521 if (active_status_ == INACTIVE || |
515 response_pending_input_event_ == LONG_PRESS) { | 522 response_pending_input_event_ == LONG_PRESS || |
| 523 response_pending_input_event_ == REPEATED_TAP) { |
516 if (active_status_ == SELECTION_ACTIVE) { | 524 if (active_status_ == SELECTION_ACTIVE) { |
517 // The active selection session finishes with the start of the new one. | 525 // The active selection session finishes with the start of the new one. |
518 LogSelectionEnd(); | 526 LogSelectionEnd(); |
519 } | 527 } |
520 active_status_ = SELECTION_ACTIVE; | 528 active_status_ = SELECTION_ACTIVE; |
521 selection_handle_dragged_ = false; | 529 selection_handle_dragged_ = false; |
522 selection_start_time_ = base::TimeTicks::Now(); | 530 selection_start_time_ = base::TimeTicks::Now(); |
523 response_pending_input_event_ = INPUT_EVENT_TYPE_NONE; | 531 response_pending_input_event_ = INPUT_EVENT_TYPE_NONE; |
524 longpress_drag_selector_.OnSelectionActivated(); | 532 longpress_drag_selector_.OnSelectionActivated(); |
525 return true; | 533 return true; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 base::TimeDelta duration = base::TimeTicks::Now() - selection_start_time_; | 607 base::TimeDelta duration = base::TimeTicks::Now() - selection_start_time_; |
600 UMA_HISTOGRAM_CUSTOM_TIMES("Event.TouchSelection.WasDraggedDuration", | 608 UMA_HISTOGRAM_CUSTOM_TIMES("Event.TouchSelection.WasDraggedDuration", |
601 duration, | 609 duration, |
602 base::TimeDelta::FromMilliseconds(500), | 610 base::TimeDelta::FromMilliseconds(500), |
603 base::TimeDelta::FromSeconds(60), | 611 base::TimeDelta::FromSeconds(60), |
604 60); | 612 60); |
605 } | 613 } |
606 } | 614 } |
607 | 615 |
608 } // namespace ui | 616 } // namespace ui |
OLD | NEW |