diff options
author | Gilles Debunne <debunne@google.com> | 2010-06-23 10:30:27 -0700 |
---|---|---|
committer | Gilles Debunne <debunne@google.com> | 2010-07-09 16:20:21 -0700 |
commit | cc3ec6cdb2b892eb29513e72d8b205acbe997b25 (patch) | |
tree | e57aa48666ef30f527898aed11ce4ce1b3110c0f /core/java/android/text/method | |
parent | a6935ab00923edeb5291a24b2363262b7fa37e85 (diff) | |
download | frameworks_base-cc3ec6cdb2b892eb29513e72d8b205acbe997b25.zip frameworks_base-cc3ec6cdb2b892eb29513e72d8b205acbe997b25.tar.gz frameworks_base-cc3ec6cdb2b892eb29513e72d8b205acbe997b25.tar.bz2 |
New cursor controller in TextViews.
Editable TextView now display a cursor controller under the insertion
point so that it can be precisely moved.
Change-Id: Ia2e6ddc57d249647ff6683e10e4226db3df27223
Diffstat (limited to 'core/java/android/text/method')
-rw-r--r-- | core/java/android/text/method/ArrowKeyMovementMethod.java | 76 | ||||
-rw-r--r-- | core/java/android/text/method/Touch.java | 4 |
2 files changed, 64 insertions, 16 deletions
diff --git a/core/java/android/text/method/ArrowKeyMovementMethod.java b/core/java/android/text/method/ArrowKeyMovementMethod.java index 9af42cc..9df63a9 100644 --- a/core/java/android/text/method/ArrowKeyMovementMethod.java +++ b/core/java/android/text/method/ArrowKeyMovementMethod.java @@ -16,23 +16,28 @@ package android.text.method; -import android.util.Log; +import android.text.Layout; +import android.text.NoCopySpan; +import android.text.Selection; +import android.text.Spannable; import android.view.KeyEvent; -import android.graphics.Rect; -import android.text.*; -import android.widget.TextView; +import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; -import android.view.MotionEvent; +import android.widget.TextView; +import android.widget.TextView.CursorController; // XXX this doesn't extend MetaKeyKeyListener because the signatures // don't match. Need to figure that out. Meanwhile the meta keys // won't work in fields that don't take input. -public class -ArrowKeyMovementMethod -implements MovementMethod -{ +public class ArrowKeyMovementMethod implements MovementMethod { + /** + * An optional controller for the cursor. + * Use {@link #setCursorController(CursorController)} to set this field. + */ + protected CursorController mCursorController; + private boolean up(TextView widget, Spannable buffer) { boolean cap = (MetaKeyKeyListener.getMetaState(buffer, KeyEvent.META_SHIFT_ON) == 1) || @@ -226,13 +231,22 @@ implements MovementMethod return false; } - public boolean onTrackballEvent(TextView widget, Spannable text, - MotionEvent event) { + public boolean onTrackballEvent(TextView widget, Spannable text, MotionEvent event) { + if (mCursorController != null) { + mCursorController.hide(); + } return false; } - public boolean onTouchEvent(TextView widget, Spannable buffer, - MotionEvent event) { + public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { + if (mCursorController != null) { + return onTouchEventCursor(widget, buffer, event); + } else { + return onTouchEventStandard(widget, buffer, event); + } + } + + private boolean onTouchEventStandard(TextView widget, Spannable buffer, MotionEvent event) { int initialScrollX = -1, initialScrollY = -1; if (event.getAction() == MotionEvent.ACTION_UP) { initialScrollX = Touch.getInitialScrollX(widget, buffer); @@ -291,13 +305,14 @@ implements MovementMethod (MetaKeyKeyListener.getMetaState(buffer, MetaKeyKeyListener.META_SELECTING) != 0); + if (cap && handled) { // Before selecting, make sure we've moved out of the "slop". // handled will be true, if we're in select mode AND we're // OUT of the slop // Turn long press off while we're selecting. User needs to - // re-tap on the selection to enable longpress + // re-tap on the selection to enable long press widget.cancelLongPress(); // Update selection as we're moving the selection area. @@ -420,6 +435,39 @@ implements MovementMethod return handled; } + private boolean onTouchEventCursor(TextView widget, Spannable buffer, MotionEvent event) { + if (widget.isFocused() && !widget.didTouchFocusSelect()) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_MOVE: + widget.cancelLongPress(); + + // Offset the current touch position (from controller to cursor) + final int x = (int) event.getX() + mCursorController.getOffsetX(); + final int y = (int) event.getY() + mCursorController.getOffsetY(); + int offset = getOffset(x, y, widget); + Selection.setSelection(buffer, offset); + mCursorController.updatePosition(); + return true; + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + mCursorController = null; + return true; + } + } + return false; + } + + /** + * Defines the cursor controller. + * + * When set, this object can be used to handle events, that can be translated in cursor updates. + * @param cursorController A cursor controller implementation + */ + public void setCursorController(CursorController cursorController) { + mCursorController = cursorController; + } + private static class DoubleTapState implements NoCopySpan { long mWhen; } diff --git a/core/java/android/text/method/Touch.java b/core/java/android/text/method/Touch.java index c30db20..3b98fc3 100644 --- a/core/java/android/text/method/Touch.java +++ b/core/java/android/text/method/Touch.java @@ -17,9 +17,9 @@ package android.text.method; import android.text.Layout; +import android.text.Layout.Alignment; import android.text.NoCopySpan; import android.text.Spannable; -import android.text.Layout.Alignment; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.ViewConfiguration; @@ -102,7 +102,7 @@ public class Touch { MotionEvent event) { DragState[] ds; - switch (event.getAction()) { + switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: ds = buffer.getSpans(0, buffer.length(), DragState.class); |