package com.beloo.widget.chipslayoutmanager.layouter;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.util.Pair;
import android.view.View;
import java.util.Collections;
class RTLUpLayouter extends AbstractLayouter implements ILayouter {
private static final String TAG = RTLUpLayouter.class.getSimpleName();
private RTLUpLayouter(Builder builder) {
super(builder);
}
public static Builder newBuilder() {
return new Builder();
}
@Override
void onPreLayout() {
int leftOffsetOfRow = -(getCanvasRightBorder() - viewLeft);
viewLeft = rowViews.size() > 0 ? Integer.MAX_VALUE : 0;
for (Pair<Rect, View> rowViewRectPair : rowViews) {
Rect viewRect = rowViewRectPair.first;
viewRect.left = viewRect.left - leftOffsetOfRow;
viewRect.right = viewRect.right - leftOffsetOfRow;
viewLeft = Math.min(viewLeft, viewRect.left);
viewTop = Math.min(viewTop, viewRect.top);
viewBottom = Math.max(viewBottom, viewRect.bottom);
}
}
@Override
void onAfterLayout() {
//go to next row, increase top coordinate, reset left
viewLeft = getCanvasLeftBorder();
viewBottom = viewTop;
}
@Override
boolean isAttachedViewFromNewRow(View view) {
int bottomOfCurrentView = getLayoutManager().getDecoratedBottom(view);
int leftOfCurrentView = getLayoutManager().getDecoratedLeft(view);
return viewTop >= bottomOfCurrentView
&& leftOfCurrentView < viewLeft;
}
@Override
Rect createViewRect(View view) {
int right = viewLeft + getCurrentViewWidth();
int viewTop = viewBottom - getCurrentViewHeight();
Rect viewRect = new Rect(viewLeft, viewTop, right, viewBottom);
viewLeft = viewRect.right;
return viewRect;
}
@Override
boolean isReverseOrder() {
return true;
}
@Override
public void onInterceptAttachView(View view) {
if (viewLeft != getCanvasLeftBorder() && viewLeft + getCurrentViewWidth() > getCanvasRightBorder()) {
viewLeft = getCanvasLeftBorder();
viewBottom = viewTop;
} else {
viewLeft = getLayoutManager().getDecoratedRight(view);
}
viewTop = Math.min(viewTop, getLayoutManager().getDecoratedTop(view));
}
@Override
public int getStartRowBorder() {
return getViewTop();
}
@Override
public int getEndRowBorder() {
return getViewBottom();
}
@Override
public int getRowLength() {
return getCanvasRightBorder() - viewLeft;
}
public static final class Builder extends AbstractLayouter.Builder {
private Builder() {
}
@NonNull
public RTLUpLayouter createLayouter() {
return new RTLUpLayouter(this);
}
}
}