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

Side by Side Diff: content/public/android/java/src/org/chromium/content/browser/input/SelectionHandleController.java

Issue 335943002: [Android] Composited selection handle rendering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@input_native_handles_final
Patch Set: Fix animation 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2012 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 package org.chromium.content.browser.input;
6
7 import android.view.View;
8
9 import com.google.common.annotations.VisibleForTesting;
10
11 import org.chromium.content.browser.PositionObserver;
12
13 /**
14 * CursorController for selecting a range of text.
15 */
16 public abstract class SelectionHandleController implements CursorController {
17
18 // The following constants match the ones in
19 // third_party/WebKit/public/web/WebTextDirection.h
20 private static final int TEXT_DIRECTION_DEFAULT = 0;
21 private static final int TEXT_DIRECTION_LTR = 1;
22 private static final int TEXT_DIRECTION_RTL = 2;
23
24 /** The cursor controller images, lazily created when shown. */
25 private HandleView mStartHandle, mEndHandle;
26
27 /** Whether handles should show automatically when text is selected. */
28 private boolean mAllowAutomaticShowing = true;
29
30 /** Whether selection anchors are active. */
31 private boolean mIsShowing;
32
33 private View mParent;
34
35 private int mFixedHandleX;
36 private int mFixedHandleY;
37
38 private PositionObserver mPositionObserver;
39
40 public SelectionHandleController(View parent, PositionObserver positionObser ver) {
41 mParent = parent;
42 mPositionObserver = positionObserver;
43 }
44
45 /** Automatically show selection anchors when text is selected. */
46 public void allowAutomaticShowing() {
47 mAllowAutomaticShowing = true;
48 }
49
50 /** Hide selection anchors, and don't automatically show them. */
51 public void hideAndDisallowAutomaticShowing() {
52 hide();
53 mAllowAutomaticShowing = false;
54 }
55
56 @Override
57 public boolean isShowing() {
58 return mIsShowing;
59 }
60
61 @Override
62 public void hide() {
63 if (mIsShowing) {
64 if (mStartHandle != null) mStartHandle.hide();
65 if (mEndHandle != null) mEndHandle.hide();
66 mIsShowing = false;
67 }
68 }
69
70 void cancelFadeOutAnimation() {
71 hide();
72 }
73
74 /**
75 * Updates the selection for a movement of the given handle (which
76 * should be the start handle or end handle) to coordinates x,y.
77 * Note that this will not actually result in the handle moving to (x,y):
78 * selectBetweenCoordinates(x1,y1,x2,y2) will trigger the selection and set the
79 * actual coordinates later via set[Start|End]HandlePosition.
80 */
81 @Override
82 public void updatePosition(HandleView handle, int x, int y) {
83 selectBetweenCoordinates(mFixedHandleX, mFixedHandleY, x, y);
84 }
85
86 @Override
87 public void beforeStartUpdatingPosition(HandleView handle) {
88 HandleView fixedHandle = (handle == mStartHandle) ? mEndHandle : mStartH andle;
89 mFixedHandleX = fixedHandle.getAdjustedPositionX();
90 mFixedHandleY = fixedHandle.getLineAdjustedPositionY();
91 }
92
93 /**
94 * The concrete implementation must trigger a selection between the given
95 * coordinates and (possibly asynchronously) set the actual handle positions
96 * after the selection is made via set[Start|End]HandlePosition.
97 */
98 protected abstract void selectBetweenCoordinates(int x1, int y1, int x2, int y2);
99
100 /**
101 * @return true iff this controller is being used to move the selection star t.
102 */
103 boolean isSelectionStartDragged() {
104 return mStartHandle != null && mStartHandle.isDragging();
105 }
106
107 /**
108 * @return true iff this controller is being used to drag either the selecti on start or end.
109 */
110 public boolean isDragging() {
111 return (mStartHandle != null && mStartHandle.isDragging()) ||
112 (mEndHandle != null && mEndHandle.isDragging());
113 }
114
115 @Override
116 public void onTouchModeChanged(boolean isInTouchMode) {
117 if (!isInTouchMode) {
118 hide();
119 }
120 }
121
122 @Override
123 public void onDetached() {}
124
125 /**
126 * Moves the start handle so that it points at the given coordinates.
127 * @param x The start handle position X in physical pixels.
128 * @param y The start handle position Y in physical pixels.
129 */
130 public void setStartHandlePosition(float x, float y) {
131 mStartHandle.positionAt((int) x, (int) y);
132 }
133
134 /**
135 * Moves the end handle so that it points at the given coordinates.
136 * @param x The end handle position X in physical pixels.
137 * @param y The end handle position Y in physical pixels.
138 */
139 public void setEndHandlePosition(float x, float y) {
140 mEndHandle.positionAt((int) x, (int) y);
141 }
142
143 /**
144 * If the handles are not visible, sets their visibility to View.VISIBLE and begins fading them
145 * in.
146 */
147 public void beginHandleFadeIn() {
148 mStartHandle.beginFadeIn();
149 mEndHandle.beginFadeIn();
150 }
151
152 /**
153 * Sets the start and end handles to the given visibility.
154 */
155 public void setHandleVisibility(int visibility) {
156 mStartHandle.setVisibility(visibility);
157 mEndHandle.setVisibility(visibility);
158 }
159
160 /**
161 * Shows the handles if allowed.
162 *
163 * @param startDir Direction (left/right) of start handle.
164 * @param endDir Direction (left/right) of end handle.
165 */
166 public void onSelectionChanged(int startDir, int endDir) {
167 if (mAllowAutomaticShowing) {
168 showHandles(startDir, endDir);
169 }
170 }
171
172 /**
173 * Sets both start and end position and show the handles.
174 * Note: this method does not trigger a selection, see
175 * selectBetweenCoordinates()
176 *
177 * @param startDir Direction (left/right) of start handle.
178 * @param endDir Direction (left/right) of end handle.
179 */
180 public void showHandles(int startDir, int endDir) {
181 createHandlesIfNeeded(startDir, endDir);
182 showHandlesIfNeeded();
183 }
184
185 @VisibleForTesting
186 public HandleView getStartHandleViewForTest() {
187 return mStartHandle;
188 }
189
190 @VisibleForTesting
191 public HandleView getEndHandleViewForTest() {
192 return mEndHandle;
193 }
194
195 private void createHandlesIfNeeded(int startDir, int endDir) {
196 if (mStartHandle == null) {
197 mStartHandle = new HandleView(this,
198 startDir == TEXT_DIRECTION_RTL ? HandleView.RIGHT : HandleVi ew.LEFT, mParent,
199 mPositionObserver);
200 }
201 if (mEndHandle == null) {
202 mEndHandle = new HandleView(this,
203 endDir == TEXT_DIRECTION_RTL ? HandleView.LEFT : HandleView. RIGHT, mParent,
204 mPositionObserver);
205 }
206 }
207
208 private void showHandlesIfNeeded() {
209 if (!mIsShowing) {
210 mIsShowing = true;
211 mStartHandle.show();
212 mEndHandle.show();
213 setHandleVisibility(HandleView.VISIBLE);
214 }
215 }
216 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698