[Libreoffice-commits] core.git: Branch 'feature/tiled-editing' - 2 commits - android/experimental
Tomaž Vajngerl
tomaz.vajngerl at collabora.co.uk
Tue Mar 10 01:34:58 PDT 2015
android/experimental/LOAndroid3/src/java/org/libreoffice/InvalidationHandler.java | 96 ++++------
android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java | 6
android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorLayer.java | 24 ++
android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorView.java | 64 ++++++
4 files changed, 128 insertions(+), 62 deletions(-)
New commits:
commit a8ecb26342674acce377d2ccac9c8fae8d4aa77c
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Tue Mar 10 17:28:26 2015 +0900
android: simplify state tracking, make graphic selection work
Simplify by removing all but one transition state (which disables
handles depending on previous state).
Additionally show/hide/change the graphic selection depending on
the messages we get from LO.
Change-Id: I95d22a58e0a7f3cb034b18034cb816816a48f355
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/InvalidationHandler.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/InvalidationHandler.java
index 5ea89be..0f9b997 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/InvalidationHandler.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/InvalidationHandler.java
@@ -3,7 +3,6 @@ package org.libreoffice;
import android.content.Intent;
import android.graphics.RectF;
import android.net.Uri;
-import android.util.Log;
import org.libreoffice.kit.Document;
import org.mozilla.gecko.TextSelection;
@@ -18,11 +17,9 @@ import java.util.List;
*/
public class InvalidationHandler implements Document.MessageCallback {
private static String LOGTAG = InvalidationHandler.class.getSimpleName();
-
- private TileProvider mTileProvider;
private final TextCursorLayer mTextCursorLayer;
private final TextSelection mTextSelection;
-
+ private TileProvider mTileProvider;
private OverlayState mState;
public InvalidationHandler(LibreOfficeMainActivity mainActivity) {
@@ -161,9 +158,9 @@ public class InvalidationHandler implements Document.MessageCallback {
mTextSelection.positionHandle(TextSelectionHandle.HandleType.MIDDLE, cursorRectangle);
mTextCursorLayer.positionCursor(cursorRectangle);
- if (mState == OverlayState.TRANSITION_TO_CURSOR) {
+ if (mState == OverlayState.TRANSITION || mState == OverlayState.CURSOR) {
changeStateTo(OverlayState.CURSOR);
- };
+ }
}
}
@@ -199,15 +196,16 @@ public class InvalidationHandler implements Document.MessageCallback {
private synchronized void textSelection(String payload) {
if (payload.isEmpty() || payload.equals("EMPTY")) {
if (mState == OverlayState.SELECTION) {
- changeStateTo(OverlayState.TRANSITION_TO_CURSOR);
+ changeStateTo(OverlayState.TRANSITION);
}
mTextCursorLayer.changeSelections(Collections.EMPTY_LIST);
} else {
- if (mState == OverlayState.TRANSITION_TO_SELECTION) {
- changeStateTo(OverlayState.SELECTION);
+ List<RectF> rectangles = convertPayloadToRectangles(payload);
+ if (mState != OverlayState.SELECTION) {
+ changeStateTo(OverlayState.TRANSITION);
}
- List<RectF> rects = convertPayloadToRectangles(payload);
- mTextCursorLayer.changeSelections(rects);
+ changeStateTo(OverlayState.SELECTION);
+ mTextCursorLayer.changeSelections(rectangles);
}
}
@@ -219,21 +217,30 @@ public class InvalidationHandler implements Document.MessageCallback {
private synchronized void cursorVisibility(String payload) {
if (payload.equals("true")) {
mTextCursorLayer.showCursor();
+ mTextSelection.showHandle(TextSelectionHandle.HandleType.MIDDLE);
} else if (payload.equals("false")) {
mTextCursorLayer.hideCursor();
+ mTextSelection.hideHandle(TextSelectionHandle.HandleType.MIDDLE);
}
}
/**
* Handles the graphic selection change message
+ *
* @param payload
*/
private void graphicSelection(String payload) {
if (payload.isEmpty() || payload.equals("EMPTY")) {
- mTextCursorLayer.changeSelections(Collections.EMPTY_LIST);
+ if (mState == OverlayState.GRAPHIC_SELECTION) {
+ changeStateTo(OverlayState.TRANSITION);
+ }
} else {
- List<RectF> rects = convertPayloadToRectangles(payload);
- mTextCursorLayer.changeSelections(rects);
+ RectF rectangle = convertPayloadToRectangle(payload);
+ mTextCursorLayer.changeGraphicSelection(rectangle);
+ if (mState != OverlayState.GRAPHIC_SELECTION) {
+ changeStateTo(OverlayState.TRANSITION);
+ }
+ changeStateTo(OverlayState.GRAPHIC_SELECTION);
}
}
@@ -242,26 +249,20 @@ public class InvalidationHandler implements Document.MessageCallback {
}
private synchronized void changeState(OverlayState previous, OverlayState next) {
- if (isInvalidTransition(previous, next)) {
- return;
- }
-
- Log.i(LOGTAG, "State change: " + previous.name() + " -> " + next.name());
-
mState = next;
switch (next) {
case CURSOR:
handleCursorState(previous);
break;
- case TRANSITION_TO_CURSOR:
- handleTransitionToCursorState(previous);
- break;
case SELECTION:
handleSelectionState(previous);
break;
- case TRANSITION_TO_SELECTION:
- handleTransitionToSelectionState(previous);
+ case GRAPHIC_SELECTION:
+ handleGraphicSelectionState(previous);
+ break;
+ case TRANSITION:
+ handleTransitionState(previous);
break;
case NONE:
handleNoneState(previous);
@@ -273,63 +274,52 @@ public class InvalidationHandler implements Document.MessageCallback {
if (previous == OverlayState.NONE) {
return;
}
+
// Just hide everything
- if (mTileProvider != null) {
- mTileProvider.setTextSelectionReset();
- }
mTextSelection.hideHandle(TextSelectionHandle.HandleType.START);
mTextSelection.hideHandle(TextSelectionHandle.HandleType.END);
mTextSelection.hideHandle(TextSelectionHandle.HandleType.MIDDLE);
mTextCursorLayer.hideSelections();
mTextCursorLayer.hideCursor();
+ mTextCursorLayer.hideGraphicSelection();
LibreOfficeMainActivity.mAppContext.hideSoftKeyboard();
}
- private void handleTransitionToSelectionState(OverlayState previous) {
- if (previous == OverlayState.CURSOR) {
- mTextSelection.hideHandle(TextSelectionHandle.HandleType.MIDDLE);
- }
- }
-
private void handleSelectionState(OverlayState previous) {
- if (previous == OverlayState.TRANSITION_TO_SELECTION) {
- mTextSelection.showHandle(TextSelectionHandle.HandleType.START);
- mTextSelection.showHandle(TextSelectionHandle.HandleType.END);
- mTextCursorLayer.showSelections();
- }
+ mTextSelection.showHandle(TextSelectionHandle.HandleType.START);
+ mTextSelection.showHandle(TextSelectionHandle.HandleType.END);
+ mTextCursorLayer.showSelections();
}
private void handleCursorState(OverlayState previous) {
- if (previous == OverlayState.CURSOR) {
- LibreOfficeMainActivity.mAppContext.showSoftKeyboard();
- } else if (previous == OverlayState.TRANSITION_TO_CURSOR) {
- LibreOfficeMainActivity.mAppContext.showSoftKeyboard();
+ LibreOfficeMainActivity.mAppContext.showSoftKeyboard();
+ if (previous == OverlayState.TRANSITION) {
mTextSelection.showHandle(TextSelectionHandle.HandleType.MIDDLE);
mTextCursorLayer.showCursor();
}
}
- private void handleTransitionToCursorState(OverlayState previous) {
+ private void handleTransitionState(OverlayState previous) {
if (previous == OverlayState.SELECTION) {
- if (mTileProvider != null) {
- mTileProvider.setTextSelectionReset();
- }
mTextSelection.hideHandle(TextSelectionHandle.HandleType.START);
mTextSelection.hideHandle(TextSelectionHandle.HandleType.END);
mTextCursorLayer.hideSelections();
+ } else if (previous == OverlayState.CURSOR) {
+ mTextSelection.hideHandle(TextSelectionHandle.HandleType.MIDDLE);
+ } else if (previous == OverlayState.GRAPHIC_SELECTION) {
+ mTextCursorLayer.hideGraphicSelection();
}
}
- private boolean isInvalidTransition(OverlayState previous, OverlayState next) {
- return (previous == OverlayState.CURSOR && next == OverlayState.TRANSITION_TO_CURSOR)
- || (previous == OverlayState.SELECTION && next == OverlayState.TRANSITION_TO_SELECTION);
+ private void handleGraphicSelectionState(OverlayState previous) {
+ mTextCursorLayer.showGraphicSelection();
}
public enum OverlayState {
NONE,
+ TRANSITION,
CURSOR,
- TRANSITION_TO_CURSOR,
- SELECTION,
- TRANSITION_TO_SELECTION
+ GRAPHIC_SELECTION,
+ SELECTION
}
}
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
index 252f64e..d3918b2 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/LOKitThread.java
@@ -3,9 +3,7 @@ package org.libreoffice;
import android.graphics.Bitmap;
import android.graphics.PointF;
import android.graphics.RectF;
-import android.util.Log;
import android.view.KeyEvent;
-import android.view.MotionEvent;
import org.mozilla.gecko.TextSelectionHandle;
import org.mozilla.gecko.gfx.CairoImage;
@@ -261,13 +259,13 @@ public class LOKitThread extends Thread {
return;
}
if (touchType.equals("LongPress")) {
- mInvalidationHandler.changeStateTo(InvalidationHandler.OverlayState.TRANSITION_TO_SELECTION);
+ mInvalidationHandler.changeStateTo(InvalidationHandler.OverlayState.TRANSITION);
mTileProvider.mouseButtonDown(documentCoordinate, 1);
mTileProvider.mouseButtonUp(documentCoordinate, 1);
mTileProvider.mouseButtonDown(documentCoordinate, 2);
mTileProvider.mouseButtonUp(documentCoordinate, 2);
} else { // "SingleTap"
- mInvalidationHandler.changeStateTo(InvalidationHandler.OverlayState.TRANSITION_TO_CURSOR);
+ mInvalidationHandler.changeStateTo(InvalidationHandler.OverlayState.TRANSITION);
mTileProvider.mouseButtonDown(documentCoordinate, 1);
mTileProvider.mouseButtonUp(documentCoordinate, 1);
}
commit 480c7a2d5ba952f5656b61e17d91af605952efd3
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Tue Mar 10 17:24:13 2015 +0900
android: add graphic selection to TextCursorLayer{View}
Change-Id: I13d26dd8b38d0b6817f3d0dbcb8a063fef559c2a
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorLayer.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorLayer.java
index ce17c68..a2b1abc 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorLayer.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorLayer.java
@@ -107,4 +107,28 @@ public class TextCursorLayer extends Layer {
}
});
}
+
+ public void showGraphicSelection() {
+ LOKitShell.getMainHandler().post(new Runnable() {
+ public void run() {
+ mCursorView.showGraphicSelection();
+ }
+ });
+ }
+
+ public void hideGraphicSelection() {
+ LOKitShell.getMainHandler().post(new Runnable() {
+ public void run() {
+ mCursorView.hideGraphicSelection();
+ }
+ });
+ }
+
+ public void changeGraphicSelection(final RectF rectangle) {
+ LOKitShell.getMainHandler().post(new Runnable() {
+ public void run() {
+ mCursorView.changeGraphicSelection(rectangle);
+ }
+ });
+ }
}
diff --git a/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorView.java b/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorView.java
index 685e8c3..3c5383b 100644
--- a/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorView.java
+++ b/android/experimental/LOAndroid3/src/java/org/libreoffice/TextCursorView.java
@@ -28,16 +28,22 @@ public class TextCursorView extends View {
private boolean mInitialized = false;
private RectF mCursorPosition = new RectF();
private RectF mCursorScaledPosition = new RectF();
+ private Paint mCursorPaint = new Paint();
private int mCursorAlpha = 0;
+ private boolean mCursorVisible;
private List<RectF> mSelections = new ArrayList<RectF>();
private List<RectF> mScaledSelections = new ArrayList<RectF>();
- private Paint mCursorPaint = new Paint();
private Paint mSelectionPaint = new Paint();
-
- private boolean mCursorVisible;
private boolean mSelectionsVisible;
+ private RectF mGraphicSelection = new RectF();
+ private RectF mGraphicScaledSelection = new RectF();
+ private Paint mGraphicSelectionPaint = new Paint();
+ private Paint mGraphicHandleFillPaint = new Paint();
+ private float mRadius = 20.0f;
+ private boolean mGraphicSelectionVisible;
+
public TextCursorView(Context context) {
super(context);
initialize();
@@ -59,13 +65,20 @@ public class TextCursorView extends View {
mCursorPaint.setColor(Color.BLACK);
mCursorPaint.setAlpha(0xFF);
-
mCursorVisible = false;
mSelectionPaint.setColor(Color.BLUE);
mSelectionPaint.setAlpha(50);
-
mSelectionsVisible = false;
+
+ mGraphicSelectionPaint.setStyle(Paint.Style.STROKE);
+ mGraphicSelectionPaint.setColor(Color.BLACK);
+ mGraphicSelectionPaint.setStrokeWidth(2);
+
+ mGraphicHandleFillPaint.setStyle(Paint.Style.FILL);
+ mGraphicHandleFillPaint.setColor(Color.WHITE);
+ mGraphicSelectionVisible = false;
+
mInitialized = true;
}
}
@@ -78,6 +91,7 @@ public class TextCursorView extends View {
}
mCursorPosition = position;
+
ImmutableViewportMetrics metrics = layerView.getViewportMetrics();
repositionWithViewport(metrics.viewportRectLeft, metrics.viewportRectTop, metrics.zoomFactor);
}
@@ -95,6 +109,19 @@ public class TextCursorView extends View {
repositionWithViewport(metrics.viewportRectLeft, metrics.viewportRectTop, metrics.zoomFactor);
}
+ public void changeGraphicSelection(RectF rectangle) {
+ LayerView layerView = LOKitShell.getLayerView();
+ if (layerView == null) {
+ Log.e(LOGTAG, "Can't position selections because layerView is null");
+ return;
+ }
+
+ mGraphicSelection = rectangle;
+
+ ImmutableViewportMetrics metrics = layerView.getViewportMetrics();
+ repositionWithViewport(metrics.viewportRectLeft, metrics.viewportRectTop, metrics.zoomFactor);
+ }
+
public void repositionWithViewport(float x, float y, float zoom) {
mCursorScaledPosition = RectUtils.scale(mCursorPosition, zoom);
mCursorScaledPosition.offset(-x, -y);
@@ -106,6 +133,9 @@ public class TextCursorView extends View {
scaledSelection.offset(-x, -y);
mScaledSelections.add(scaledSelection);
}
+
+ mGraphicScaledSelection = RectUtils.scale(mGraphicSelection, zoom);
+ mGraphicScaledSelection.offset(-x, -y);
invalidate();
}
@@ -120,6 +150,20 @@ public class TextCursorView extends View {
canvas.drawRect(selection, mSelectionPaint);
}
}
+ if (mGraphicSelectionVisible) {
+ canvas.drawRect(mGraphicScaledSelection, mGraphicSelectionPaint);
+ canvas.drawCircle(mGraphicScaledSelection.left, mGraphicScaledSelection.top, mRadius, mGraphicHandleFillPaint);
+ canvas.drawCircle(mGraphicScaledSelection.left, mGraphicScaledSelection.top, mRadius, mGraphicSelectionPaint);
+
+ canvas.drawCircle(mGraphicScaledSelection.right, mGraphicScaledSelection.top, mRadius, mGraphicHandleFillPaint);
+ canvas.drawCircle(mGraphicScaledSelection.right, mGraphicScaledSelection.top, mRadius, mGraphicSelectionPaint);
+
+ canvas.drawCircle(mGraphicScaledSelection.left, mGraphicScaledSelection.bottom, mRadius, mGraphicHandleFillPaint);
+ canvas.drawCircle(mGraphicScaledSelection.left, mGraphicScaledSelection.bottom, mRadius, mGraphicSelectionPaint);
+
+ canvas.drawCircle(mGraphicScaledSelection.right, mGraphicScaledSelection.bottom, mRadius, mGraphicHandleFillPaint);
+ canvas.drawCircle(mGraphicScaledSelection.right, mGraphicScaledSelection.bottom, mRadius, mGraphicSelectionPaint);
+ }
}
private Runnable cursorAnimation = new Runnable() {
@@ -151,4 +195,14 @@ public class TextCursorView extends View {
mSelectionsVisible = false;
invalidate();
}
+
+ public void showGraphicSelection() {
+ mGraphicSelectionVisible = true;
+ invalidate();
+ }
+
+ public void hideGraphicSelection() {
+ mGraphicSelectionVisible = false;
+ invalidate();
+ }
}
\ No newline at end of file
More information about the Libreoffice-commits
mailing list