package com.beloo.widget.chipslayoutmanager.layouter;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.beloo.widget.chipslayoutmanager.ChipsLayoutManager;
import com.beloo.widget.chipslayoutmanager.anchor.AnchorViewState;
import com.beloo.widget.chipslayoutmanager.gravity.IGravityModifiersFactory;
import com.beloo.widget.chipslayoutmanager.gravity.IRowStrategy;
import com.beloo.widget.chipslayoutmanager.gravity.SkipLastRowStrategy;
import com.beloo.widget.chipslayoutmanager.layouter.breaker.IBreakerFactory;
import com.beloo.widget.chipslayoutmanager.cache.IViewCacheStorage;
import com.beloo.widget.chipslayoutmanager.layouter.criteria.ICriteriaFactory;
import com.beloo.widget.chipslayoutmanager.layouter.placer.IPlacerFactory;
import java.util.ArrayList;
import java.util.List;
public class LayouterFactory {
private ChipsLayoutManager layoutManager;
private IViewCacheStorage cacheStorage;
private List<ILayouterListener> layouterListeners = new ArrayList<>();
private IBreakerFactory breakerFactory;
private ICriteriaFactory criteriaFactory;
private IPlacerFactory placerFactory;
private IGravityModifiersFactory gravityModifiersFactory;
private IRowStrategy rowStrategy;
private ILayouterCreator layouterCreator;
LayouterFactory(ChipsLayoutManager layoutManager,
ILayouterCreator layouterCreator,
IBreakerFactory breakerFactory,
ICriteriaFactory criteriaFactory,
IPlacerFactory placerFactory,
IGravityModifiersFactory gravityModifiersFactory,
IRowStrategy rowStrategy) {
this.layouterCreator = layouterCreator;
this.cacheStorage = layoutManager.getViewPositionsStorage();
this.layoutManager = layoutManager;
this.breakerFactory = breakerFactory;
this.criteriaFactory = criteriaFactory;
this.placerFactory = placerFactory;
this.gravityModifiersFactory = gravityModifiersFactory;
this.rowStrategy = rowStrategy;
}
public void addLayouterListener(@Nullable ILayouterListener layouterListener) {
if (layouterListener != null) {
layouterListeners.add(layouterListener);
}
}
private AbstractLayouter.Builder createBackwardBuilder() {
return layouterCreator.createBackwardBuilder();
}
private AbstractLayouter.Builder createForwardBuilder() {
return layouterCreator.createForwardBuilder();
}
private Rect createOffsetRectForBackwardLayouter(@NonNull AnchorViewState anchorRect) {
return layouterCreator.createOffsetRectForBackwardLayouter(anchorRect);
}
private Rect createOffsetRectForForwardLayouter(AnchorViewState anchorRect) {
return layouterCreator.createOffsetRectForForwardLayouter(anchorRect);
}
private ICanvas createCanvas() {
return layoutManager.getCanvas();
}
@NonNull
private AbstractLayouter.Builder fillBasicBuilder(AbstractLayouter.Builder builder) {
return builder.layoutManager(layoutManager)
.canvas(createCanvas())
.childGravityResolver(layoutManager.getChildGravityResolver())
.cacheStorage(cacheStorage)
.gravityModifiersFactory(gravityModifiersFactory)
.addLayouterListeners(layouterListeners);
}
@Nullable
public final ILayouter getBackwardLayouter(@NonNull AnchorViewState anchorRect) {
return fillBasicBuilder(createBackwardBuilder())
.offsetRect(createOffsetRectForBackwardLayouter(anchorRect))
.breaker(breakerFactory.createBackwardRowBreaker())
.finishingCriteria(criteriaFactory.getBackwardFinishingCriteria())
.rowStrategy(rowStrategy)
.placer(placerFactory.getAtStartPlacer())
.positionIterator(new DecrementalPositionIterator(layoutManager.getItemCount()))
.build();
}
@NonNull
public final ILayouter getForwardLayouter(@NonNull AnchorViewState anchorRect) {
return fillBasicBuilder(createForwardBuilder())
.offsetRect(createOffsetRectForForwardLayouter(anchorRect))
.breaker(breakerFactory.createForwardRowBreaker())
.finishingCriteria(criteriaFactory.getForwardFinishingCriteria())
.rowStrategy(new SkipLastRowStrategy(rowStrategy, !layoutManager.isStrategyAppliedWithLastRow()))
.placer(placerFactory.getAtEndPlacer())
.positionIterator(new IncrementalPositionIterator(layoutManager.getItemCount()))
.build();
}
@NonNull
public final ILayouter buildForwardLayouter(@NonNull ILayouter layouter) {
AbstractLayouter abstractLayouter = (AbstractLayouter) layouter;
abstractLayouter.setFinishingCriteria(criteriaFactory.getForwardFinishingCriteria());
abstractLayouter.setPlacer(placerFactory.getAtEndPlacer());
return abstractLayouter;
}
@NonNull
public final ILayouter buildBackwardLayouter(@NonNull ILayouter layouter) {
AbstractLayouter abstractLayouter = (AbstractLayouter) layouter;
abstractLayouter.setFinishingCriteria(criteriaFactory.getBackwardFinishingCriteria());
abstractLayouter.setPlacer(placerFactory.getAtStartPlacer());
return abstractLayouter;
}
}