android: move handles into GraphicSelectionCanvasElement
Change-Id: Ib372b4fac35ae77bf06c65913b142ae3e80b0eb5
This commit is contained in:
committed by
Miklos Vajna
parent
0bc8e678a1
commit
aa5a78cf8b
@@ -13,6 +13,9 @@ import android.graphics.Paint;
|
|||||||
import android.graphics.PointF;
|
import android.graphics.PointF;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
|
|
||||||
|
import org.libreoffice.LOKitShell;
|
||||||
|
import org.mozilla.gecko.gfx.LayerView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is responsible to draw and reposition the selection
|
* This class is responsible to draw and reposition the selection
|
||||||
* rectangle.
|
* rectangle.
|
||||||
@@ -25,25 +28,72 @@ public class GraphicSelectionCanvasElement {
|
|||||||
private DragType mType = DragType.NONE;
|
private DragType mType = DragType.NONE;
|
||||||
private PointF mStartDragPosition;
|
private PointF mStartDragPosition;
|
||||||
|
|
||||||
|
private GraphicSelectionHandleCanvasElement mHandles[] = new GraphicSelectionHandleCanvasElement[8];
|
||||||
|
private GraphicSelectionHandleCanvasElement mDragHandle = null;
|
||||||
|
|
||||||
public GraphicSelectionCanvasElement(Paint graphicSelectionPaint) {
|
public GraphicSelectionCanvasElement(Paint graphicSelectionPaint) {
|
||||||
mGraphicSelectionPaint = graphicSelectionPaint;
|
mGraphicSelectionPaint = graphicSelectionPaint;
|
||||||
|
|
||||||
|
mHandles[0] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
||||||
|
mHandles[1] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
||||||
|
mHandles[2] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
||||||
|
mHandles[3] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
||||||
|
mHandles[4] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
||||||
|
mHandles[5] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
||||||
|
mHandles[6] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
||||||
|
mHandles[7] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reposition(RectF scaledRectangle) {
|
public void reposition(RectF scaledRectangle) {
|
||||||
mScaledRectangle = scaledRectangle;
|
mScaledRectangle = scaledRectangle;
|
||||||
mDrawRectangle = scaledRectangle;
|
mDrawRectangle = scaledRectangle;
|
||||||
|
|
||||||
|
mHandles[0].reposition(scaledRectangle.left, scaledRectangle.top);
|
||||||
|
mHandles[1].reposition(scaledRectangle.centerX(), scaledRectangle.top);
|
||||||
|
mHandles[2].reposition(scaledRectangle.right, scaledRectangle.top);
|
||||||
|
mHandles[3].reposition(scaledRectangle.left, scaledRectangle.centerY());
|
||||||
|
mHandles[4].reposition(scaledRectangle.right, scaledRectangle.centerY());
|
||||||
|
mHandles[5].reposition(scaledRectangle.left, scaledRectangle.bottom);
|
||||||
|
mHandles[6].reposition(scaledRectangle.centerX(), scaledRectangle.bottom);
|
||||||
|
mHandles[7].reposition(scaledRectangle.right, scaledRectangle.bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean contains(float x, float y) {
|
public boolean contains(float x, float y) {
|
||||||
|
// Check if handle was hit
|
||||||
|
for (GraphicSelectionHandleCanvasElement handle : mHandles) {
|
||||||
|
if (handle.contains(x, y)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
return mScaledRectangle.contains(x, y);
|
return mScaledRectangle.contains(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void draw(Canvas canvas) {
|
public void draw(Canvas canvas) {
|
||||||
canvas.drawRect(mDrawRectangle, mGraphicSelectionPaint);
|
canvas.drawRect(mDrawRectangle, mGraphicSelectionPaint);
|
||||||
|
for (GraphicSelectionHandleCanvasElement handle : mHandles) {
|
||||||
|
if (mType == DragType.MOVE || mType == DragType.EXTEND) {
|
||||||
|
handle.drawSelected(canvas);
|
||||||
|
} else {
|
||||||
|
handle.draw(canvas);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dragStart(DragType type, PointF position) {
|
public void dragStart(PointF position) {
|
||||||
mType = type;
|
mDragHandle = null;
|
||||||
|
mType = DragType.NONE;
|
||||||
|
for (GraphicSelectionHandleCanvasElement handle : mHandles) {
|
||||||
|
if (handle.contains(position.x, position.y)) {
|
||||||
|
mDragHandle = handle;
|
||||||
|
mType = DragType.EXTEND;
|
||||||
|
sendGraphicSelectionStart(handle.mPosition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mDragHandle == null) {
|
||||||
|
mType = DragType.MOVE;
|
||||||
|
sendGraphicSelectionStart(position);
|
||||||
|
}
|
||||||
|
|
||||||
mStartDragPosition = position;
|
mStartDragPosition = position;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,9 +111,40 @@ public class GraphicSelectionCanvasElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dragEnd() {
|
public void dragEnd(PointF position) {
|
||||||
mType = DragType.NONE;
|
PointF point = new PointF();
|
||||||
|
if (mDragHandle != null) {
|
||||||
|
point.x = mDragHandle.mPosition.x;
|
||||||
|
point.y = mDragHandle.mPosition.y;
|
||||||
|
} else {
|
||||||
|
point.x = mStartDragPosition.x;
|
||||||
|
point.y = mStartDragPosition.y;
|
||||||
|
}
|
||||||
|
float deltaX = position.x - mStartDragPosition.x;
|
||||||
|
float deltaY = position.y - mStartDragPosition.y;
|
||||||
|
point.offset(deltaX, deltaY);
|
||||||
|
|
||||||
|
sendGraphicSelectionEnd(point);
|
||||||
|
|
||||||
mDrawRectangle = mScaledRectangle;
|
mDrawRectangle = mScaledRectangle;
|
||||||
|
mDragHandle = null;
|
||||||
|
mType = DragType.NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendGraphicSelectionStart(PointF screenPosition) {
|
||||||
|
LayerView layerView = LOKitShell.getLayerView();
|
||||||
|
if (layerView != null) {
|
||||||
|
PointF documentPoint = layerView.getLayerClient().convertViewPointToLayerPoint(screenPosition);
|
||||||
|
LOKitShell.sendTouchEvent("GraphicSelectionStart", documentPoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendGraphicSelectionEnd(PointF screenPosition) {
|
||||||
|
LayerView layerView = LOKitShell.getLayerView();
|
||||||
|
if (layerView != null) {
|
||||||
|
PointF documentPoint = layerView.getLayerClient().convertViewPointToLayerPoint(screenPosition);
|
||||||
|
LOKitShell.sendTouchEvent("GraphicSelectionEnd", documentPoint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum DragType {
|
public enum DragType {
|
||||||
|
@@ -53,17 +53,11 @@ public class TextCursorView extends View implements View.OnTouchListener {
|
|||||||
|
|
||||||
private GraphicSelectionCanvasElement mGraphicSelection;
|
private GraphicSelectionCanvasElement mGraphicSelection;
|
||||||
|
|
||||||
private PointF mTouchStart = new PointF();
|
|
||||||
private PointF mDeltaPoint = new PointF();
|
|
||||||
|
|
||||||
private boolean mGraphicSelectionVisible;
|
private boolean mGraphicSelectionVisible;
|
||||||
private boolean mGraphicSelectionMove = false;
|
private boolean mGraphicSelectionMove = false;
|
||||||
|
|
||||||
private LayerView mLayerView;
|
private LayerView mLayerView;
|
||||||
|
|
||||||
private GraphicSelectionHandleCanvasElement mHandles[] = new GraphicSelectionHandleCanvasElement[8];
|
|
||||||
private GraphicSelectionHandleCanvasElement mDragHandle = null;
|
|
||||||
|
|
||||||
public TextCursorView(Context context) {
|
public TextCursorView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
initialize();
|
initialize();
|
||||||
@@ -102,15 +96,6 @@ public class TextCursorView extends View implements View.OnTouchListener {
|
|||||||
|
|
||||||
mGraphicSelectionVisible = false;
|
mGraphicSelectionVisible = false;
|
||||||
|
|
||||||
mHandles[0] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
|
||||||
mHandles[1] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
|
||||||
mHandles[2] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
|
||||||
mHandles[3] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
|
||||||
mHandles[4] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
|
||||||
mHandles[5] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
|
||||||
mHandles[6] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
|
||||||
mHandles[7] = new GraphicSelectionHandleCanvasElement(mGraphicSelectionPaint);
|
|
||||||
|
|
||||||
postDelayed(cursorAnimation, CURSOR_BLINK_TIME);
|
postDelayed(cursorAnimation, CURSOR_BLINK_TIME);
|
||||||
|
|
||||||
mInitialized = true;
|
mInitialized = true;
|
||||||
@@ -169,15 +154,6 @@ public class TextCursorView extends View implements View.OnTouchListener {
|
|||||||
RectF scaledGraphicSelection = convertPosition(mGraphicSelection.mRectangle, x, y, zoom);
|
RectF scaledGraphicSelection = convertPosition(mGraphicSelection.mRectangle, x, y, zoom);
|
||||||
mGraphicSelection.reposition(scaledGraphicSelection);
|
mGraphicSelection.reposition(scaledGraphicSelection);
|
||||||
|
|
||||||
mHandles[0].reposition(scaledGraphicSelection.left, scaledGraphicSelection.top);
|
|
||||||
mHandles[1].reposition(scaledGraphicSelection.centerX(), scaledGraphicSelection.top);
|
|
||||||
mHandles[2].reposition(scaledGraphicSelection.right, scaledGraphicSelection.top);
|
|
||||||
mHandles[3].reposition(scaledGraphicSelection.left, scaledGraphicSelection.centerY());
|
|
||||||
mHandles[4].reposition(scaledGraphicSelection.right, scaledGraphicSelection.centerY());
|
|
||||||
mHandles[5].reposition(scaledGraphicSelection.left, scaledGraphicSelection.bottom);
|
|
||||||
mHandles[6].reposition(scaledGraphicSelection.centerX(), scaledGraphicSelection.bottom);
|
|
||||||
mHandles[7].reposition(scaledGraphicSelection.right, scaledGraphicSelection.bottom);
|
|
||||||
|
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,20 +176,6 @@ public class TextCursorView extends View implements View.OnTouchListener {
|
|||||||
}
|
}
|
||||||
if (mGraphicSelectionVisible) {
|
if (mGraphicSelectionVisible) {
|
||||||
mGraphicSelection.draw(canvas);
|
mGraphicSelection.draw(canvas);
|
||||||
|
|
||||||
if (mGraphicSelectionMove) {
|
|
||||||
for (GraphicSelectionHandleCanvasElement handle : mHandles) {
|
|
||||||
if (mDragHandle == handle) {
|
|
||||||
handle.drawSelected(canvas);
|
|
||||||
} else {
|
|
||||||
handle.draw(canvas);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (GraphicSelectionHandleCanvasElement handle : mHandles) {
|
|
||||||
handle.draw(canvas);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,32 +221,30 @@ public class TextCursorView extends View implements View.OnTouchListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouch(View view, MotionEvent event) {
|
public boolean onTouch(View view, MotionEvent event) {
|
||||||
if (mLayerView == null) {
|
|
||||||
mLayerView = LOKitShell.getLayerView();
|
|
||||||
if (mLayerView == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (event.getActionMasked()) {
|
switch (event.getActionMasked()) {
|
||||||
case MotionEvent.ACTION_DOWN: {
|
case MotionEvent.ACTION_DOWN: {
|
||||||
mTouchStart.x = event.getX();
|
|
||||||
mTouchStart.y = event.getY();
|
|
||||||
if (mGraphicSelectionVisible) {
|
if (mGraphicSelectionVisible) {
|
||||||
return checkIfGraphicSelectionWasHit();
|
// Check if inside graphic selection was hit
|
||||||
|
PointF startPosition = new PointF(event.getX(), event.getY());
|
||||||
|
if (mGraphicSelection.contains(startPosition.x, startPosition.y)) {
|
||||||
|
mGraphicSelectionMove = true;
|
||||||
|
mGraphicSelection.dragStart(startPosition);
|
||||||
|
invalidate();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case MotionEvent.ACTION_UP: {
|
case MotionEvent.ACTION_UP: {
|
||||||
if (mGraphicSelectionVisible && mGraphicSelectionMove) {
|
if (mGraphicSelectionVisible && mGraphicSelectionMove) {
|
||||||
mDeltaPoint.x = event.getX() - mTouchStart.x;
|
mGraphicSelectionMove = false;
|
||||||
mDeltaPoint.y = event.getY() - mTouchStart.y;
|
mGraphicSelection.dragEnd(new PointF(event.getX(), event.getY()));
|
||||||
return stopGraphicSelection();
|
invalidate();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case MotionEvent.ACTION_MOVE: {
|
case MotionEvent.ACTION_MOVE: {
|
||||||
if (mGraphicSelectionVisible && mGraphicSelectionMove) {
|
if (mGraphicSelectionVisible && mGraphicSelectionMove) {
|
||||||
mDeltaPoint.x = event.getX() - mTouchStart.x;
|
|
||||||
mDeltaPoint.y = event.getY() - mTouchStart.y;
|
|
||||||
mGraphicSelection.dragging(new PointF(event.getX(), event.getY()));
|
mGraphicSelection.dragging(new PointF(event.getX(), event.getY()));
|
||||||
invalidate();
|
invalidate();
|
||||||
return true;
|
return true;
|
||||||
@@ -293,59 +253,6 @@ public class TextCursorView extends View implements View.OnTouchListener {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkIfGraphicSelectionWasHit() {
|
|
||||||
// Check if handle was hit
|
|
||||||
mDragHandle = null;
|
|
||||||
for (GraphicSelectionHandleCanvasElement handle : mHandles) {
|
|
||||||
if (handle.contains(mTouchStart.x, mTouchStart.y)) {
|
|
||||||
mDragHandle = handle;
|
|
||||||
mGraphicSelectionMove = true;
|
|
||||||
mGraphicSelection.dragStart(GraphicSelectionCanvasElement.DragType.EXTEND, mTouchStart);
|
|
||||||
sendGraphicSelectionStart(handle.mPosition);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Check if inside graphic selection was hit
|
|
||||||
if (mGraphicSelection.contains(mTouchStart.x, mTouchStart.y)) {
|
|
||||||
mGraphicSelectionMove = true;
|
|
||||||
mGraphicSelection.dragStart(GraphicSelectionCanvasElement.DragType.MOVE, mTouchStart);
|
|
||||||
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);
|
|
||||||
|
|
||||||
mGraphicSelection.dragEnd();
|
|
||||||
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: */
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
||||||
|
Reference in New Issue
Block a user