package org.ebookdroid.core; import org.ebookdroid.core.models.DocumentModel; import org.ebookdroid.ui.viewer.IView; import android.graphics.PointF; import android.graphics.RectF; import org.emdev.common.log.LogContext; import org.emdev.common.log.LogManager; public class EventGotoPage implements IEvent { public static final LogContext LCTX = LogManager.root().lctx("EventGotoPage"); protected final boolean centerPage; protected AbstractViewController ctrl; protected final ViewState viewState; protected DocumentModel model; protected int viewIndex; protected final float offsetX; protected final float offsetY; public EventGotoPage(final AbstractViewController ctrl, final int viewIndex) { this.viewState = ViewState.get(ctrl); this.ctrl = ctrl; this.model = viewState.model; this.centerPage = true; this.viewIndex = viewIndex; this.offsetX = 0; this.offsetY = 0; } public EventGotoPage(final AbstractViewController ctrl, final int viewIndex, final float offsetX, final float offsetY) { this.viewState = ViewState.get(ctrl); this.ctrl = ctrl; this.model = viewState.model; this.centerPage = false; this.viewIndex = viewIndex; this.offsetX = offsetX; this.offsetY = offsetY; } @Override public ViewState process() { if (model == null) { return null; } final int pageCount = model.getPageCount(); if (viewIndex < 0 && viewIndex >= pageCount) { if (LCTX.isDebugEnabled()) { LCTX.d("Bad page index: " + viewIndex + ", page count: " + pageCount); } return viewState; } final Page page = model.getPageObject(viewIndex); if (page == null) { if (LCTX.isDebugEnabled()) { LCTX.d("No page found for index: " + viewIndex); } return viewState; } model.setCurrentPageIndex(page.index); final IView view = ctrl.getView(); final int scrollX = view.getScrollX(); final int scrollY = view.getScrollY(); final PointF p = calculateScroll(page, scrollX, scrollY); final int left = Math.round(p.x); final int top = Math.round(p.y); if (isScrollRequired(left, top, scrollX, scrollY)) { view.forceFinishScroll(); view.scrollTo(left, top); viewState.update(); return viewState; } viewState.release(); return EventPool.newEventScrollTo(ctrl, viewIndex).process(); } protected PointF calculateScroll(final Page page, final int scrollX, final int scrollY) { final RectF viewRect = ctrl.getView().getViewRect(); final RectF bounds = page.getBounds(viewState.zoom); final float width = bounds.width(); final float height = bounds.height(); if (centerPage) { switch (ctrl.mode) { case HORIZONTAL_SCROLL: return new PointF(bounds.left - (viewRect.width() - width) / 2, scrollY); case VERTICALL_SCROLL: return new PointF(scrollX, bounds.top - (viewRect.height() - height) / 2); } } return new PointF(bounds.left + offsetX * width, bounds.top + offsetY * height); } protected boolean isScrollRequired(final int left, final int top, final int scrollX, final int scrollY) { switch (ctrl.mode) { case HORIZONTAL_SCROLL: return left != scrollX; case VERTICALL_SCROLL: return top != scrollY; } return true; } @Override public boolean process(final Page page) { return false; } @Override public boolean process(final PageTree nodes) { return false; } @Override public boolean process(final PageTree nodes, final PageTreeLevel level) { return false; } @Override public boolean process(final PageTreeNode node) { return false; } }