aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/widgets/FlowLayout.java
diff options
context:
space:
mode:
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/widgets/FlowLayout.java')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/widgets/FlowLayout.java135
1 files changed, 135 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/FlowLayout.java b/WordPress/src/main/java/org/wordpress/android/widgets/FlowLayout.java
new file mode 100644
index 000000000..c0b80cf73
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/widgets/FlowLayout.java
@@ -0,0 +1,135 @@
+/*
+ * Sample FlowLayout wrote by Romain Guy: http://www.parleys.com/play/514892280364bc17fc56c0e2/chapter38/about
+ * Fixed and tweaked since
+ */
+
+package org.wordpress.android.widgets;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import org.wordpress.android.R;
+
+public class FlowLayout extends ViewGroup {
+ private int mHorizontalSpacing;
+ private int mVerticalSpacing;
+ private Paint mPaint;
+
+ public FlowLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FlowLayout);
+ try {
+ mHorizontalSpacing = a.getDimensionPixelSize(R.styleable.FlowLayout_horizontalSpacing, 0);
+ mVerticalSpacing = a.getDimensionPixelSize(R.styleable.FlowLayout_verticalSpacing, 0);
+ } finally {
+ a.recycle();
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int widthSize = MeasureSpec.getSize(widthMeasureSpec) - getPaddingRight() - getPaddingLeft();
+ int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+
+ boolean growHeight = widthMode != MeasureSpec.UNSPECIFIED;
+
+ int width = 0;
+ int height = getPaddingTop();
+
+ int currentWidth = getPaddingLeft();
+ int currentHeight = 0;
+
+ boolean newLine = false;
+ int spacing = 0;
+
+ final int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ View child = getChildAt(i);
+ measureChild(child, widthMeasureSpec, heightMeasureSpec);
+
+ LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ spacing = mHorizontalSpacing;
+ if (lp.horizontalSpacing >= 0) {
+ spacing = lp.horizontalSpacing;
+ }
+
+ if (growHeight && currentWidth + child.getMeasuredWidth() > widthSize) {
+ height += currentHeight + mVerticalSpacing;
+ currentHeight = 0;
+ width = Math.max(width, currentWidth - spacing);
+ currentWidth = getPaddingLeft();
+ newLine = true;
+ } else {
+ newLine = false;
+ }
+
+ lp.x = currentWidth;
+ lp.y = height;
+
+ currentWidth += child.getMeasuredWidth() + spacing;
+ currentHeight = Math.max(currentHeight, child.getMeasuredHeight());
+ }
+
+ if (!newLine) {
+ width = Math.max(width, currentWidth - spacing);
+ }
+ width += getPaddingRight();
+ height += currentHeight + getPaddingBottom();
+
+ setMeasuredDimension(resolveSize(width, widthMeasureSpec), resolveSize(height, heightMeasureSpec));
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ final int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ View child = getChildAt(i);
+ LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ child.layout(lp.x, lp.y, lp.x + child.getMeasuredWidth(), lp.y + child.getMeasuredHeight());
+ }
+ }
+
+ @Override
+ protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
+ return p instanceof LayoutParams;
+ }
+
+ @Override
+ protected LayoutParams generateDefaultLayoutParams() {
+ return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+ }
+
+ @Override
+ public LayoutParams generateLayoutParams(AttributeSet attrs) {
+ return new LayoutParams(getContext(), attrs);
+ }
+
+ @Override
+ protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
+ return new LayoutParams(p.width, p.height);
+ }
+
+ public static class LayoutParams extends ViewGroup.MarginLayoutParams {
+ int x;
+ int y;
+
+ public int horizontalSpacing;
+
+ public LayoutParams(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FlowLayout_LayoutParams);
+ try {
+ horizontalSpacing = a.getDimensionPixelSize(R.styleable.FlowLayout_LayoutParams_layout_horizontalSpacing, -1);
+ } finally {
+ a.recycle();
+ }
+ }
+
+ public LayoutParams(int w, int h) {
+ super(w, h);
+ }
+ }
+}