package org.ebookdroid.core; import org.ebookdroid.common.settings.types.DocumentViewMode; import android.graphics.RectF; import java.util.Queue; public abstract class AbstractEventScroll<E extends AbstractEventScroll<E>> extends AbstractEvent { private final Queue<E> eventQueue; protected PageTreeLevel level; protected AbstractEventScroll(final Queue<E> eventQueue) { this.eventQueue = eventQueue; } final void init(final AbstractViewController ctrl) { this.viewState = ViewState.get(ctrl); this.ctrl = ctrl; this.level = PageTreeLevel.getLevel(viewState.zoom); } @SuppressWarnings("unchecked") final void release() { this.ctrl = null; this.viewState = null; this.level = null; this.bitmapsToRecycle.clear(); this.nodesToDecode.clear(); eventQueue.offer((E) this); } /** * {@inheritDoc} * * @see org.ebookdroid.core.AbstractEvent#process() */ @Override public final ViewState process() { try { super.process(); final Page page = viewState.pages.getCurrentPage(); if (page != null) { if (ctrl.mode != DocumentViewMode.SINGLE_PAGE) { ctrl.model.setCurrentPageIndex(page.index); } ctrl.updatePosition(page, viewState); } ctrl.getView().redrawView(viewState); return viewState; } finally { release(); } } /** * {@inheritDoc} * * @see org.ebookdroid.core.IEvent#process(org.ebookdroid.core.ViewState, org.ebookdroid.core.PageTree) */ @Override public boolean process(final PageTree nodes) { if (level.next != null) { nodes.recycleNodes(level.next, bitmapsToRecycle); } return process(nodes, level); } /** * {@inheritDoc} * * @see org.ebookdroid.core.IEvent#process(org.ebookdroid.core.ViewState, org.ebookdroid.core.PageTreeNode) */ @Override public boolean process(final PageTreeNode node) { final RectF pageBounds = viewState.getBounds(node.page); if (!viewState.isNodeKeptInMemory(node, pageBounds)) { node.recycle(bitmapsToRecycle); return false; } if (!node.holder.hasBitmaps()) { node.decodePageTreeNode(nodesToDecode, viewState); } return true; } }