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 EventGotoPageCorner implements IEvent { public static final LogContext LCTX = LogManager.root().lctx("EventGotoPage"); protected AbstractViewController ctrl; protected final ViewState viewState; protected DocumentModel model; protected int viewIndex; protected final float offsetX; protected final float offsetY; public EventGotoPageCorner(final AbstractViewController ctrl, final float offsetX, final float offsetY) { this.viewState = ViewState.get(ctrl); this.ctrl = ctrl; this.model = viewState.model; this.viewIndex = ctrl.getBase().getDocumentModel().getCurrentViewPageIndex(); 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; } final IView view = ctrl.getView(); final PointF p = calculateScroll(page); final int left = Math.round(p.x); final int top = Math.round(p.y); view.scrollTo(left, top); viewState.update(); return viewState; } protected PointF calculateScroll(final Page page) { final RectF viewRect = ctrl.getView().getViewRect(); final RectF bounds = page.getBounds(viewState.zoom); final float pageCornerX = bounds.left + offsetX * bounds.width(); final float pageCornerY = bounds.top + offsetY * bounds.height(); final float targetX = pageCornerX - offsetX * viewRect.width(); final float targetY = pageCornerY - offsetY * viewRect.height(); return new PointF(targetX, targetY); } @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; } }