OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_SELECTION_CONTROLLER_H_ | |
6 #define CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_SELECTION_CONTROLLER_H_ | |
7 | |
8 #include "cc/output/viewport_selection_bound.h" | |
9 #include "content/browser/renderer_host/input/selection_event_type.h" | |
10 #include "content/browser/renderer_host/input/touch_handle.h" | |
11 #include "content/common/content_export.h" | |
12 #include "ui/gfx/geometry/point_f.h" | |
13 #include "ui/gfx/geometry/rect_f.h" | |
14 | |
15 namespace blink { | |
16 class WebInputEvent; | |
17 } | |
18 | |
19 namespace ui { | |
20 class MotionEvent; | |
21 } | |
22 | |
23 namespace content { | |
24 | |
25 // Interface through which |TouchSelectionController| issues selection-related | |
26 // commands, notifications and requests. | |
27 class CONTENT_EXPORT TouchSelectionControllerClient { | |
28 public: | |
29 virtual ~TouchSelectionControllerClient() {} | |
30 | |
31 virtual bool SupportsAnimation() const = 0; | |
32 virtual void SetNeedsAnimate() = 0; | |
33 virtual void MoveCaret(const gfx::PointF& position) = 0; | |
34 virtual void MoveRangeSelectionExtent(const gfx::PointF& extent) = 0; | |
35 virtual void SelectBetweenCoordinates(const gfx::PointF& base, | |
36 const gfx::PointF& extent) = 0; | |
37 virtual void OnSelectionEvent(SelectionEventType event, | |
38 const gfx::PointF& position) = 0; | |
39 virtual scoped_ptr<TouchHandleDrawable> CreateDrawable() = 0; | |
40 }; | |
41 | |
42 // Controller for manipulating text selection via touch input. | |
43 class CONTENT_EXPORT TouchSelectionController : public TouchHandleClient { | |
44 public: | |
45 TouchSelectionController(TouchSelectionControllerClient* client, | |
46 base::TimeDelta tap_timeout, | |
47 float tap_slop); | |
48 ~TouchSelectionController() override; | |
49 | |
50 // To be called when the selection bounds have changed. | |
51 // Note that such updates will trigger handle updates only if preceded | |
52 // by an appropriate call to allow automatic showing. | |
53 void OnSelectionBoundsChanged(const cc::ViewportSelectionBound& start, | |
54 const cc::ViewportSelectionBound& end); | |
55 | |
56 // Allows touch-dragging of the handle. | |
57 // Returns true iff the event was consumed, in which case the caller should | |
58 // cease further handling of the event. | |
59 bool WillHandleTouchEvent(const ui::MotionEvent& event); | |
60 | |
61 // To be called before forwarding a tap event. This allows automatically | |
62 // showing the insertion handle from subsequent bounds changes. | |
63 void OnTapEvent(); | |
64 | |
65 // To be called before forwarding a longpress event. This allows automatically | |
66 // showing the selection or insertion handles from subsequent bounds changes. | |
67 void OnLongPressEvent(); | |
68 | |
69 // Allow showing the selection handles from the most recent selection bounds | |
70 // update (if valid), or a future valid bounds update. | |
71 void AllowShowingFromCurrentSelection(); | |
72 | |
73 // Hide the handles and suppress bounds updates until the next explicit | |
74 // showing allowance. | |
75 void HideAndDisallowShowingAutomatically(); | |
76 | |
77 // Override the handle visibility according to |hidden|. | |
78 void SetTemporarilyHidden(bool hidden); | |
79 | |
80 // To be called when the editability of the focused region changes. | |
81 void OnSelectionEditable(bool editable); | |
82 | |
83 // To be called when the contents of the focused region changes. | |
84 void OnSelectionEmpty(bool empty); | |
85 | |
86 // Ticks an active animation, as requested to the client by |SetNeedsAnimate|. | |
87 // Returns true if an animation is active and requires further ticking. | |
88 bool Animate(base::TimeTicks animate_time); | |
89 | |
90 private: | |
91 enum InputEventType { TAP, LONG_PRESS, INPUT_EVENT_TYPE_NONE }; | |
92 | |
93 // TouchHandleClient implementation. | |
94 void OnHandleDragBegin(const TouchHandle& handle) override; | |
95 void OnHandleDragUpdate(const TouchHandle& handle, | |
96 const gfx::PointF& new_position) override; | |
97 void OnHandleDragEnd(const TouchHandle& handle) override; | |
98 void OnHandleTapped(const TouchHandle& handle) override; | |
99 void SetNeedsAnimate() override; | |
100 scoped_ptr<TouchHandleDrawable> CreateDrawable() override; | |
101 base::TimeDelta GetTapTimeout() const override; | |
102 float GetTapSlop() const override; | |
103 | |
104 void ShowInsertionHandleAutomatically(); | |
105 void ShowSelectionHandlesAutomatically(); | |
106 | |
107 void OnInsertionChanged(); | |
108 void OnSelectionChanged(); | |
109 | |
110 void ActivateInsertion(); | |
111 void DeactivateInsertion(); | |
112 void ActivateSelection(); | |
113 void DeactivateSelection(); | |
114 void ResetCachedValuesIfInactive(); | |
115 | |
116 const gfx::PointF& GetStartPosition() const; | |
117 const gfx::PointF& GetEndPosition() const; | |
118 gfx::Vector2dF GetStartLineOffset() const; | |
119 gfx::Vector2dF GetEndLineOffset() const; | |
120 bool GetStartVisible() const; | |
121 bool GetEndVisible() const; | |
122 TouchHandle::AnimationStyle GetAnimationStyle(bool was_active) const; | |
123 | |
124 TouchSelectionControllerClient* const client_; | |
125 const base::TimeDelta tap_timeout_; | |
126 const float tap_slop_; | |
127 | |
128 InputEventType response_pending_input_event_; | |
129 | |
130 cc::ViewportSelectionBound start_; | |
131 cc::ViewportSelectionBound end_; | |
132 TouchHandleOrientation start_orientation_; | |
133 TouchHandleOrientation end_orientation_; | |
134 | |
135 scoped_ptr<TouchHandle> insertion_handle_; | |
136 bool is_insertion_active_; | |
137 bool activate_insertion_automatically_; | |
138 | |
139 scoped_ptr<TouchHandle> start_selection_handle_; | |
140 scoped_ptr<TouchHandle> end_selection_handle_; | |
141 bool is_selection_active_; | |
142 bool activate_selection_automatically_; | |
143 | |
144 bool selection_empty_; | |
145 bool selection_editable_; | |
146 | |
147 bool temporarily_hidden_; | |
148 | |
149 DISALLOW_COPY_AND_ASSIGN(TouchSelectionController); | |
150 }; | |
151 | |
152 } // namespace content | |
153 | |
154 #endif // CONTENT_BROWSER_RENDERER_HOST_INPUT_TOUCH_SELECTION_CONTROLLER_H_ | |
OLD | NEW |