void EbookController::ScrollToLink(PageDestination *dest) { int reparseIdx = dest->GetDestPageNo() - 1; int pageNo = PageForReparsePoint(pages, reparseIdx); if (pageNo > 0) GoToPage(pageNo, true); else if (0 == pageNo) GoToLastPage(); }
// Given a page try to calculate its page number void EbookController::UpdateCurrPageNoForPage(HtmlPage *pd) { currPageNo = 0; if (!pd) return; // pages can have have the same reparse point, so finding them by // reparse point is not reliable. try first to find by page object if (GetPagesFromBeginning()) { int n = GetPagesFromBeginning()->Find(pd) + 1; if (n > 0) { currPageNo = n; return; } } currPageNo = PageForReparsePoint(GetPagesFromBeginning(), pd->reparseIdx); }
void EbookController::Navigate(int dir) { if (!CanNavigate(dir)) return; // update the current history entry int idx = currPageReparseIdx; if (navHistoryIx < navHistory.Count()) navHistory.At(navHistoryIx) = idx; else navHistory.Append(idx); navHistoryIx += dir; idx = navHistory.At(navHistoryIx); int pageNo = PageForReparsePoint(pages, idx); if (0 == pageNo) pageNo = GetMaxPageCount(); if (pageNo > 0) GoToPage(pageNo, false); }
void EbookController::HandlePagesFromEbookLayout(EbookFormattingData *ft) { if (formattingThreadNo != ft->threadNo) { // this is a message from cancelled thread, we can disregard lf("EbookController::HandlePagesFromEbookLayout() thread msg discarded, curr thread: %d, sending thread: %d", formattingThreadNo, ft->threadNo); DeleteEbookFormattingData(ft); return; } //lf("EbookController::HandlePagesFromEbookLayout() %d pages, ft=0x%x", ft->pageCount, (int)ft); if (incomingPages) { for (size_t i = 0; i < ft->pageCount; i++) { incomingPages->Append(ft->pages[i]); } int pageNo = PageForReparsePoint(incomingPages, currPageReparseIdx); if (pageNo > 0) { Vec<HtmlPage*> *toDelete = pages; pages = incomingPages; incomingPages = nullptr; DeletePages(&toDelete); GoToPage(pageNo, false); } } else { CrashIf(!pages); for (size_t i = 0; i < ft->pageCount; i++) { pages->Append(ft->pages[i]); } } if (ft->finished) { CrashIf(!pages); StopFormattingThread(); } UpdateStatus(); // don't call DeleteEbookFormattingData since // ft->pages are now owned by incomingPages or pages delete ft; }