package org.ebookdroid.core;
import org.ebookdroid.common.settings.AppSettings;
import org.ebookdroid.common.settings.books.BookSettings;
import org.ebookdroid.common.settings.types.DocumentViewMode;
import org.ebookdroid.common.settings.types.PageAlign;
import org.ebookdroid.core.models.DocumentModel.PageIterator;
import org.ebookdroid.ui.viewer.IActivityController;
import android.graphics.Rect;
import android.graphics.RectF;
public class VScrollController extends AbstractScrollController {
public VScrollController(final IActivityController base) {
super(base, DocumentViewMode.VERTICALL_SCROLL);
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.ui.viewer.IViewController#calculateCurrentPage(org.ebookdroid.core.ViewState)
*/
@Override
public final int calculateCurrentPage(final ViewState viewState, final int firstVisible, final int lastVisible) {
int result = 0;
long bestDistance = Long.MAX_VALUE;
final int viewY = Math.round(viewState.viewRect.centerY());
final PageIterator pages = firstVisible != -1 ? viewState.model.getPages(firstVisible, lastVisible + 1)
: viewState.model.getPages(0);
try {
RectF bounds = new RectF();
for (final Page page : pages) {
viewState.getBounds(page, bounds);
final int pageY = Math.round(bounds.centerY());
final long dist = Math.abs(pageY - viewY);
if (dist < bestDistance) {
bestDistance = dist;
result = page.index.viewIndex;
}
}
} finally {
pages.release();
}
return result;
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.ui.viewer.IViewController#verticalConfigScroll(int)
*/
@Override
public final void verticalConfigScroll(final int direction) {
final AppSettings app = AppSettings.current();
final int dy = (int) (direction * getHeight() * (app.scrollHeight / 100.0));
if (app.animateScrolling) {
getView().startPageScroll(0, dy);
} else {
getView().scrollBy(0, dy);
}
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.ui.viewer.IViewController#getScrollLimits()
*/
@Override
public final Rect getScrollLimits() {
final int width = getWidth();
final int height = getHeight();
final Page lpo = model.getLastPageObject();
final float zoom = getBase().getZoomModel().getZoom();
final int bottom = lpo != null ? (int) lpo.getBounds(zoom).bottom - height : 0;
final int right = (int) (width * zoom) - width;
return new Rect(0, 0, right, bottom);
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.ui.viewer.IViewController#invalidatePageSizes(org.ebookdroid.ui.viewer.IViewController.InvalidateSizeReason,
* org.ebookdroid.core.Page)
*/
@Override
public synchronized final void invalidatePageSizes(final InvalidateSizeReason reason, final Page changedPage) {
if (!isInitialized) {
return;
}
if (reason == InvalidateSizeReason.PAGE_ALIGN) {
return;
}
final int width = getWidth();
final int height = getHeight();
final BookSettings bookSettings = base.getBookSettings();
final PageAlign pageAlign = DocumentViewMode.getPageAlign(bookSettings);
if (changedPage == null) {
float heightAccum = 0;
for (final Page page : model.getPages()) {
final RectF pageBounds = calcPageBounds(pageAlign, page.getAspectRatio(), width, height);
pageBounds.offset(0, heightAccum);
page.setBounds(pageBounds);
heightAccum += pageBounds.height() + 3;
}
} else {
float heightAccum = changedPage.getBounds(1.0f).top;
final PageIterator pages = model.getPages(changedPage.index.viewIndex);
try {
for (final Page page : pages) {
final RectF pageBounds = calcPageBounds(pageAlign, page.getAspectRatio(), width, height);
pageBounds.offset(0, heightAccum);
page.setBounds(pageBounds);
heightAccum += pageBounds.height() + 3;
}
} finally {
pages.release();
}
}
}
/**
* {@inheritDoc}
*
* @see org.ebookdroid.ui.viewer.IViewController#calcPageBounds(org.ebookdroid.core.Page, int, int)
*/
@Override
public RectF calcPageBounds(final PageAlign pageAlign, final float pageAspectRatio, final int width,
final int height) {
return new RectF(0, 0, width, width / pageAspectRatio);
}
}