summaryrefslogtreecommitdiff
path: root/core/java/android/widget/TextView.java
diff options
context:
space:
mode:
authorAdam Powell <adamp@google.com>2010-10-04 23:16:00 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2010-10-04 23:16:00 -0700
commit41170a1a05830e6c9ec631d73043ccf1878dc0f9 (patch)
treea8f44af77cee78954c1424681e56afeaafce7248 /core/java/android/widget/TextView.java
parenta785a59c831256f274627f8f8eb77f9d54508916 (diff)
parentabcbb1a1989e8c6adec607b3964dc187f5526e66 (diff)
am abcbb1a1: Fix bug 3061544 and some clipping errors.
Merge commit 'abcbb1a1989e8c6adec607b3964dc187f5526e66' into gingerbread-plus-aosp * commit 'abcbb1a1989e8c6adec607b3964dc187f5526e66': Fix bug 3061544 and some clipping errors.
Diffstat (limited to 'core/java/android/widget/TextView.java')
-rw-r--r--core/java/android/widget/TextView.java75
1 files changed, 59 insertions, 16 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 535047819ce5..8d8d0afc95ed 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -93,6 +93,7 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewDebug;
import android.view.ViewGroup.LayoutParams;
+import android.view.ViewParent;
import android.view.ViewRoot;
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityEvent;
@@ -192,7 +193,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private static int PRIORITY = 100;
- private final int[] mTempCoords = new int[2];
+ final int[] mTempCoords = new int[2];
+ Rect mTempRect;
private ColorStateList mTextColor;
private int mCurTextColor;
@@ -7651,6 +7653,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private float mOffsetY;
private float mHotspotX;
private float mHotspotY;
+ private int mLastParentX;
+ private int mLastParentY;
public HandleView(CursorController controller, Drawable handle) {
super(TextView.this.mContext);
@@ -7660,8 +7664,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
com.android.internal.R.attr.textSelectHandleWindowStyle);
mContainer.setSplitTouchEnabled(true);
mContainer.setClippingEnabled(false);
- mHotspotX = mDrawable.getIntrinsicWidth() * 0.5f;
- mHotspotY = -mDrawable.getIntrinsicHeight() * 0.2f;
+
+ final int handleWidth = mDrawable.getIntrinsicWidth();
+ final int handleHeight = mDrawable.getIntrinsicHeight();
+ mHotspotX = handleWidth * 0.5f;
+ mHotspotY = -handleHeight * 0.2f;
}
@Override
@@ -7671,7 +7678,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
public void show() {
- if (!isPositionInBounds()) {
+ if (!isPositionVisible()) {
hide();
return;
}
@@ -7692,7 +7699,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return mContainer.isShowing();
}
- private boolean isPositionInBounds() {
+ private boolean isPositionVisible() {
+ // Always show a dragging handle.
+ if (mIsDragging) {
+ return true;
+ }
+
final int extendedPaddingTop = getExtendedPaddingTop();
final int extendedPaddingBottom = getExtendedPaddingBottom();
final int compoundPaddingLeft = getCompoundPaddingLeft();
@@ -7704,28 +7716,55 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final int top = 0;
final int bottom = hostView.getHeight();
- final int clipLeft = left + compoundPaddingLeft;
- final int clipTop = top + extendedPaddingTop;
- final int clipRight = right - compoundPaddingRight;
- final int clipBottom = bottom - extendedPaddingBottom;
+ if (mTempRect == null) {
+ mTempRect = new Rect();
+ }
+ final Rect clip = mTempRect;
+ clip.left = left + compoundPaddingLeft;
+ clip.top = top + extendedPaddingTop;
+ clip.right = right - compoundPaddingRight;
+ clip.bottom = bottom - extendedPaddingBottom;
+
+ final ViewParent parent = hostView.getParent();
+ if (parent == null || !parent.getChildVisibleRect(hostView, clip, null)) {
+ return false;
+ }
- return mPositionX + mHotspotX >= clipLeft && mPositionX + mHotspotX <= clipRight &&
- mPositionY + mHotspotY >= clipTop && mPositionY + mHotspotY <= clipBottom;
+ final int[] coords = mTempCoords;
+ hostView.getLocationInWindow(coords);
+ final int posX = coords[0] + mPositionX + (int) mHotspotX;
+ final int posY = coords[1] + mPositionY;
+
+ return posX >= clip.left && posX <= clip.right &&
+ posY >= clip.top && posY + mHotspotY <= clip.bottom;
}
private void moveTo(int x, int y) {
mPositionX = x - TextView.this.mScrollX;
mPositionY = y - TextView.this.mScrollY;
- if (isPositionInBounds()) {
+ if (isPositionVisible()) {
+ int[] coords = null;
if (mContainer.isShowing()){
- final int[] coords = mTempCoords;
+ coords = mTempCoords;
TextView.this.getLocationInWindow(coords);
- coords[0] += mPositionX;
- coords[1] += mPositionY;
- mContainer.update(coords[0], coords[1], mRight - mLeft, mBottom - mTop);
+ mContainer.update(coords[0] + mPositionX, coords[1] + mPositionY,
+ mRight - mLeft, mBottom - mTop);
} else {
show();
}
+
+ if (mIsDragging) {
+ if (coords == null) {
+ coords = mTempCoords;
+ TextView.this.getLocationInWindow(coords);
+ }
+ if (coords[0] != mLastParentX || coords[1] != mLastParentY) {
+ mOffsetX += coords[0] - mLastParentX;
+ mOffsetY += coords[1] - mLastParentY;
+ mLastParentX = coords[0];
+ mLastParentY = coords[1];
+ }
+ }
} else {
hide();
}
@@ -7752,6 +7791,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final float rawY = ev.getRawY();
mOffsetX = rawX - mPositionX;
mOffsetY = rawY - mPositionY;
+ final int[] coords = mTempCoords;
+ TextView.this.getLocationInWindow(coords);
+ mLastParentX = coords[0];
+ mLastParentY = coords[1];
mIsDragging = true;
break;
}