package org.ebookdroid.core; import android.graphics.RectF; import java.util.Comparator; import org.emdev.utils.CompareUtils; public class PageTreeNodeComparator implements Comparator<PageTreeNode> { final ViewState viewState; final RectF bounds1 = new RectF(); final RectF bounds2 = new RectF(); public PageTreeNodeComparator(final ViewState viewState) { this.viewState = viewState; } @Override public int compare(final PageTreeNode node1, final PageTreeNode node2) { final int cp = viewState.pages.currentIndex; final int viewIndex1 = node1.page.index.viewIndex; final int viewIndex2 = node2.page.index.viewIndex; viewState.getBounds(node1.page, bounds1); viewState.getBounds(node2.page, bounds2); final boolean v1 = viewState.isNodeVisible(node1, bounds1); final boolean v2 = viewState.isNodeVisible(node2, bounds2); final RectF s1 = node1.pageSliceBounds; final RectF s2 = node2.pageSliceBounds; int res = 0; if (viewIndex1 == cp && viewIndex2 == cp) { res = CompareUtils.compare(s1.top, s2.top); if (res == 0) { res = CompareUtils.compare(s1.left, s2.left); } } else if (v1 && !v2) { res = -1; } else if (!v1 && v2) { res = 1; } else { final float d1 = viewIndex1 + s1.centerY() - (cp + 0.5f); final float d2 = viewIndex2 + s2.centerY() - (cp + 0.5f); final int dist1 = Math.abs((int) (d1 * node1.level.zoom)); final int dist2 = Math.abs((int) (d2 * node2.level.zoom)); res = CompareUtils.compare(dist1, dist2); if (res == 0) { res = -CompareUtils.compare(viewIndex1, viewIndex2); } } return res; } }