From 272a8487f8981d5dcbc8c83ac4cc819c2f0f7c9f Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Thu, 3 Jul 2014 13:42:26 +0000 Subject: [PATCH] scroll bars for the ParseTreeView --- src/ui/android/AndroidManifest.xml | 2 +- .../android/res/layout/alternative_item.xml | 2 +- src/ui/android/res/values/attrs.xml | 6 ++ src/ui/android/res/values/styles.xml | 6 +- .../ui/android/AlternativesActivity.java | 2 +- .../ui/android/ParseTreeView.java | 69 +++++++++++++++---- 6 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 src/ui/android/res/values/attrs.xml diff --git a/src/ui/android/AndroidManifest.xml b/src/ui/android/AndroidManifest.xml index 1327aa12a..f8fa83a49 100644 --- a/src/ui/android/AndroidManifest.xml +++ b/src/ui/android/AndroidManifest.xml @@ -1,7 +1,7 @@ diff --git a/src/ui/android/res/layout/alternative_item.xml b/src/ui/android/res/layout/alternative_item.xml index 40106c989..d88384bba 100644 --- a/src/ui/android/res/layout/alternative_item.xml +++ b/src/ui/android/res/layout/alternative_item.xml @@ -21,7 +21,7 @@ + + + + + diff --git a/src/ui/android/res/values/styles.xml b/src/ui/android/res/values/styles.xml index 6ce89c7ba..c839d30a9 100644 --- a/src/ui/android/res/values/styles.xml +++ b/src/ui/android/res/values/styles.xml @@ -15,6 +15,10 @@ + + - diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/AlternativesActivity.java b/src/ui/android/src/org/grammaticalframework/ui/android/AlternativesActivity.java index 964daf92f..1815fbf54 100644 --- a/src/ui/android/src/org/grammaticalframework/ui/android/AlternativesActivity.java +++ b/src/ui/android/src/org/grammaticalframework/ui/android/AlternativesActivity.java @@ -141,7 +141,7 @@ public class AlternativesActivity extends ListActivity { parseView = new ParseTreeView(this); parseView.setId(R.id.desc_details); RelativeLayout.LayoutParams params = - new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.BELOW, R.id.alternative_desc); ((RelativeLayout) view).addView(parseView, params); } diff --git a/src/ui/android/src/org/grammaticalframework/ui/android/ParseTreeView.java b/src/ui/android/src/org/grammaticalframework/ui/android/ParseTreeView.java index f443ab2eb..75f29f45f 100644 --- a/src/ui/android/src/org/grammaticalframework/ui/android/ParseTreeView.java +++ b/src/ui/android/src/org/grammaticalframework/ui/android/ParseTreeView.java @@ -1,17 +1,15 @@ package org.grammaticalframework.ui.android; -import java.util.HashMap; -import java.util.Map; - import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.Rect; import android.util.AttributeSet; -import android.util.Pair; import android.util.SparseArray; +import android.view.MotionEvent; import android.view.View; + import org.grammaticalframework.pgf.Bracket; @@ -24,20 +22,20 @@ public class ParseTreeView extends View { private Paint paint; private Object[] brackets; + private float lastMotionX; + private float scrollRange; + public ParseTreeView(Context context) { - super(context); - initialize(); + this(context, null); } - + public ParseTreeView(Context context, AttributeSet attrs) { - super(context, attrs); - initialize(); - } - - private void initialize() { + super(context, attrs, R.attr.parseTreeViewStyle); + paint = new Paint(); paint.setTextSize(60); brackets = null; + scrollRange = 0; } public Object[] getBrackets() { @@ -45,7 +43,8 @@ public class ParseTreeView extends View { } public void setBrackets(Object[] brackets) { - this.brackets = brackets; + this.brackets = brackets; + awakenScrollBars(); } static class MeasureResult { @@ -150,12 +149,24 @@ public class ParseTreeView extends View { height = mr.height; } - width += 10; - height += 10; + height += paint.getFontMetrics().descent; int w = getPaddingLeft() + (int) width + getPaddingRight(); int h = getPaddingTop() + (int) height + getPaddingBottom(); + scrollRange = w+80; + + int widthReq = MeasureSpec.getSize(widthMeasureSpec); + if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY || + (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST && w > widthReq)) { + w = widthReq; + } + int heightReq = MeasureSpec.getSize(heightMeasureSpec); + if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY || + (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST && h > heightReq)) { + h = heightReq; + } + setMeasuredDimension(w, h); } @@ -218,4 +229,32 @@ public class ParseTreeView extends View { startX += w + SISTER_SKIP; } } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + switch (ev.getAction()) { + case MotionEvent.ACTION_DOWN: + // Remember where the motion event started + lastMotionX = ev.getX(); + break; + case MotionEvent.ACTION_MOVE: + // Scroll to follow the motion event + float x = ev.getX(); + final int deltaX = (int) (lastMotionX - x); + lastMotionX = x; + final int offset = computeHorizontalScrollOffset() + deltaX; + final int range = computeHorizontalScrollRange() - computeHorizontalScrollExtent(); + if (range > 0 && offset > 0 && offset < range) + scrollTo(offset, 0); + break; + case MotionEvent.ACTION_UP: + break; + } + return true; + } + + @Override + protected int computeHorizontalScrollRange() { + return (int) scrollRange; + } }