summaryrefslogtreecommitdiff
path: root/android
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2015-03-18 18:12:02 +0900
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-03-23 09:19:03 +0100
commit892d6813ada104bad9fece1c3d2270a510bc31cc (patch)
treeab0e82588787281887a8ed23d9c21cb53ca8be82 /android
parenta2675cb3778cc086ed82ad6375dba4b11b7c7911 (diff)
android: Hit test for handles, show resize rect
Change-Id: Ibf9f98968fd9007be6dc5481d1652923ecb98b89
Diffstat (limited to 'android')
-rw-r--r--android/experimental/LOAndroid3/src/java/org/libreoffice/DrawElementHandle.java33
-rw-r--r--android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorView.java107
2 files changed, 110 insertions, 30 deletions
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/DrawElementHandle.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/DrawElementHandle.java
index 1af0724a424f..7968b31aca21 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/DrawElementHandle.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/DrawElementHandle.java
@@ -12,28 +12,57 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
+import android.graphics.RectF;
+import org.mozilla.gecko.gfx.RectUtils;
+
+/**
+ * This class is responsible to draw the selection handles, track the handle
+ * position and perform a hit test to determine if the selection handle was
+ * touched.
+ */
public class DrawElementHandle {
public PointF mPosition = new PointF();
private float mRadius = 20.0f;
private Paint mGraphicHandleFillPaint = new Paint();
private Paint mGraphicSelectionPaint = new Paint();
+ private Paint mGraphicHandleSelectedFillPaint = new Paint();
+ private RectF mHitRect = new RectF();
public DrawElementHandle(Paint graphicSelectionPaint) {
mGraphicSelectionPaint = graphicSelectionPaint;
mGraphicHandleFillPaint.setStyle(Paint.Style.FILL);
mGraphicHandleFillPaint.setColor(Color.WHITE);
+
+ mGraphicHandleSelectedFillPaint.setStyle(Paint.Style.FILL);
+ mGraphicHandleSelectedFillPaint.setColor(Color.BLACK);
}
public void draw(Canvas canvas) {
- canvas.drawCircle(mPosition.x, mPosition.y, mRadius, mGraphicHandleFillPaint);
- canvas.drawCircle(mPosition.x, mPosition.y, mRadius, mGraphicSelectionPaint);
+ drawFilledCircle(canvas, mPosition.x, mPosition.y, mRadius, mGraphicSelectionPaint, mGraphicHandleFillPaint);
+ }
+
+ public void drawSelected(Canvas canvas) {
+ drawFilledCircle(canvas, mPosition.x, mPosition.y, mRadius, mGraphicSelectionPaint, mGraphicHandleSelectedFillPaint);
+ }
+
+ private void drawFilledCircle(Canvas canvas, float x, float y, float radius, Paint strokePaint, Paint fillPaint) {
+ canvas.drawCircle(x, y, radius, fillPaint);
+ canvas.drawCircle(x, y, radius, strokePaint);
}
public void reposition(float x, float y) {
mPosition.x = x;
mPosition.y = y;
+ mHitRect.left = mPosition.x - mRadius * 2;
+ mHitRect.right = mPosition.x + mRadius * 2;
+ mHitRect.top = mPosition.y - mRadius * 2;
+ mHitRect.bottom = mPosition.y + mRadius * 2;
+ }
+
+ public boolean contains(float x, float y) {
+ return mHitRect.contains(x, y);
}
}
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorView.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorView.java
index c9ecabb6255f..26eb215a4f47 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorView.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorView.java
@@ -52,7 +52,6 @@ public class TextCursorView extends View implements View.OnTouchListener {
private RectF mGraphicScaledSelection = new RectF();
private Paint mGraphicSelectionPaint = new Paint();
-
private boolean mGraphicSelectionVisible;
private PointF mTouchStart = new PointF();
private PointF mDeltaPoint = new PointF();
@@ -60,6 +59,7 @@ public class TextCursorView extends View implements View.OnTouchListener {
private LayerView mLayerView;
private DrawElementHandle mHandles[] = new DrawElementHandle[8];
+ private DrawElementHandle mDragHandle = null;
public TextCursorView(Context context) {
super(context);
@@ -189,16 +189,31 @@ public class TextCursorView extends View implements View.OnTouchListener {
}
}
if (mGraphicSelectionVisible) {
- canvas.drawRect(mGraphicScaledSelection, mGraphicSelectionPaint);
+ if (mGraphicSelectionMove) {
+ for (DrawElementHandle handle : mHandles) {
+ if (mDragHandle == handle) {
+ handle.drawSelected(canvas);
+ } else {
+ handle.draw(canvas);
+ }
+ }
- for (DrawElementHandle handle : mHandles) {
- handle.draw(canvas);
- }
+ RectF selectionRect = new RectF(mGraphicScaledSelection);
+ if (mDragHandle != null) {
+ PointF dragPosition = new PointF(mDragHandle.mPosition.x, mDragHandle.mPosition.y);
+ dragPosition.offset(mDeltaPoint.x, mDeltaPoint.y);
+ selectionRect.union(dragPosition.x, dragPosition.y);
+ canvas.drawRect(selectionRect, mGraphicSelectionPaint);
+ } else {
+ selectionRect.offset(mDeltaPoint.x, mDeltaPoint.y);
+ canvas.drawRect(selectionRect, mGraphicSelectionPaint);
+ }
+ } else {
+ canvas.drawRect(mGraphicScaledSelection, mGraphicSelectionPaint);
- if (mGraphicSelectionMove) {
- RectF one = new RectF(mGraphicScaledSelection);
- one.offset(mDeltaPoint.x, mDeltaPoint.y);
- canvas.drawRect(one, mGraphicSelectionPaint);
+ for (DrawElementHandle handle : mHandles) {
+ handle.draw(canvas);
+ }
}
}
}
@@ -256,31 +271,19 @@ public class TextCursorView extends View implements View.OnTouchListener {
case MotionEvent.ACTION_DOWN: {
mTouchStart.x = event.getX();
mTouchStart.y = event.getY();
- if (mGraphicSelectionVisible && mGraphicScaledSelection.contains(mTouchStart.x, mTouchStart.y)) {
- mGraphicSelectionMove = true;
- PointF documentPoint = mLayerView.getLayerClient().convertViewPointToLayerPoint(mTouchStart);
- Log.i(LOGTAG, "Down: " + documentPoint);
- LOKitShell.sendTouchEvent("GraphicSelectionStart", documentPoint);
- return true;
+ if (mGraphicSelectionVisible) {
+ return checkIfGraphicSelectionWasHit();
}
}
case MotionEvent.ACTION_UP: {
- if (mGraphicSelectionMove) {
- mGraphicSelectionMove = false;
- mTouchStart.offset(mDeltaPoint.x, mDeltaPoint.y);
- PointF documentPoint = mLayerView.getLayerClient().convertViewPointToLayerPoint(mTouchStart);
- Log.i(LOGTAG, "Up: " + documentPoint);
- LOKitShell.sendTouchEvent("GraphicSelectionEnd", documentPoint);
- mTouchStart.x = 0.0f;
- mTouchStart.y = 0.0f;
- mDeltaPoint.x = 0.0f;
- mDeltaPoint.y = 0.0f;
- invalidate();
- return true;
+ if (mGraphicSelectionVisible && mGraphicSelectionMove) {
+ mDeltaPoint.x = event.getX() - mTouchStart.x;
+ mDeltaPoint.y = event.getY() - mTouchStart.y;
+ return stopGraphicSelection();
}
}
case MotionEvent.ACTION_MOVE: {
- if (mGraphicSelectionMove) {
+ if (mGraphicSelectionVisible && mGraphicSelectionMove) {
mDeltaPoint.x = event.getX() - mTouchStart.x;
mDeltaPoint.y = event.getY() - mTouchStart.y;
invalidate();
@@ -290,6 +293,54 @@ public class TextCursorView extends View implements View.OnTouchListener {
}
return false;
}
+
+ private boolean checkIfGraphicSelectionWasHit() {
+ // Check if handle was hit
+ mDragHandle = null;
+ for (DrawElementHandle handle : mHandles) {
+ if (handle.contains(mTouchStart.x, mTouchStart.y)) {
+ mDragHandle = handle;
+ mGraphicSelectionMove = true;
+ sendGraphicSelectionStart(handle.mPosition);
+ return true;
+ }
+ }
+ // Check if inside graphic selection was hit
+ if (mGraphicScaledSelection.contains(mTouchStart.x, mTouchStart.y)) {
+ mGraphicSelectionMove = true;
+ sendGraphicSelectionStart(mTouchStart);
+ return true;
+ }
+ return false;
+ }
+
+ private boolean stopGraphicSelection() {
+ mGraphicSelectionMove = false;
+ PointF point = new PointF();
+ if (mDragHandle != null) {
+ point.x = mDragHandle.mPosition.x;
+ point.y = mDragHandle.mPosition.y;
+ } else {
+ point.x = mTouchStart.x;
+ point.y = mTouchStart.y;
+ }
+ point.offset(mDeltaPoint.x, mDeltaPoint.y);
+ sendGraphicSelectionEnd(point);
+ invalidate();
+ return true;
+ }
+
+ private void sendGraphicSelectionStart(PointF screenPosition) {
+ PointF documentPoint = mLayerView.getLayerClient().convertViewPointToLayerPoint(screenPosition);
+ Log.i(LOGTAG, "Selection Start P: " + documentPoint + " : " + mGraphicSelection);
+ LOKitShell.sendTouchEvent("GraphicSelectionStart", documentPoint);
+ }
+
+ private void sendGraphicSelectionEnd(PointF screenPosition) {
+ PointF documentPoint = mLayerView.getLayerClient().convertViewPointToLayerPoint(screenPosition);
+ Log.i(LOGTAG, "Selection End P: " + documentPoint + " : " + mGraphicSelection);
+ LOKitShell.sendTouchEvent("GraphicSelectionEnd", documentPoint);
+ }
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */