package org.ebookdroid.core;
import org.ebookdroid.common.settings.SettingsManager;
import android.graphics.PointF;
import android.graphics.RectF;
import java.util.Queue;
import org.emdev.utils.LengthUtils;
public abstract class AbstractEventZoom<E extends AbstractEventZoom<E>> extends AbstractEvent {
private final Queue<E> eventQueue;
public float oldZoom;
public float newZoom;
public PageTreeLevel oldLevel;
public PageTreeLevel newLevel;
public boolean committed;
public PointF center;
protected AbstractEventZoom(final Queue<E> eventQueue) {
this.eventQueue = eventQueue;
}
final void init(final AbstractViewController ctrl, final float oldZoom, final float newZoom, final boolean committed, PointF center) {
this.viewState = ViewState.get(ctrl, newZoom);
this.ctrl = ctrl;
this.oldZoom = oldZoom;
this.newZoom = newZoom;
this.oldLevel = PageTreeLevel.getLevel(oldZoom);
this.newLevel = PageTreeLevel.getLevel(newZoom);
this.committed = committed;
this.center = center;
}
@SuppressWarnings("unchecked")
final void release() {
this.ctrl = null;
this.center = null;
this.viewState = null;
this.oldLevel = null;
this.newLevel = null;
this.bitmapsToRecycle.clear();
this.nodesToDecode.clear();
eventQueue.offer((E) this);
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.core.AbstractEvent#process()
*/
@Override
public final ViewState process() {
try {
if (!committed) {
ctrl.getView().invalidateScroll(newZoom, oldZoom, center);
viewState.update();
}
super.process();
if (!committed) {
ctrl.redrawView(viewState);
} else {
SettingsManager.zoomChanged(viewState.book, newZoom, true);
ctrl.updatePosition(ctrl.model.getCurrentPageObject(), viewState);
}
return viewState;
} finally {
release();
}
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.core.IEvent#process(org.ebookdroid.core.ViewState, org.ebookdroid.core.PageTree)
*/
@Override
public final boolean process(final PageTree nodes) {
return process(nodes, newLevel);
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.core.AbstractEvent#calculatePageVisibility(org.ebookdroid.core.ViewState)
*/
@Override
protected final void calculatePageVisibility() {
final int viewIndex = ctrl.model.getCurrentViewPageIndex();
int firstVisiblePage = viewIndex;
int lastVisiblePage = viewIndex;
final Page[] pages = ctrl.model.getPages();
if (LengthUtils.isEmpty(pages)) {
return;
}
final RectF bounds = new RectF();
while (firstVisiblePage > 0) {
final int index = firstVisiblePage - 1;
if (!ctrl.isPageVisible(pages[index], viewState, bounds)) {
break;
}
firstVisiblePage = index;
}
while (lastVisiblePage < pages.length - 1) {
final int index = lastVisiblePage + 1;
if (!ctrl.isPageVisible(pages[index], viewState, bounds)) {
break;
}
lastVisiblePage = index;
}
viewState.update(firstVisiblePage, lastVisiblePage);
}
}