diff --git a/TODO.highlighting b/TODO.highlighting index c5ec297ac..391dc7621 100644 --- a/TODO.highlighting +++ b/TODO.highlighting @@ -1,4 +1,4 @@ -* re-implement go to bookmark operation +DONE re-implement go to bookmark operation DONE highlight bookmarks DONE show highlights in footnote view DONE don't draw all bookmarks, filter by position diff --git a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java index 87fa82c48..db9f0406d 100644 --- a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java +++ b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java @@ -408,11 +408,15 @@ public final class FBReaderApp extends ZLApplication { final String modelId = bookmark.ModelId; if (modelId == null) { addInvisibleBookmark(); - BookTextView.gotoPosition(bookmark); + BookTextView.gotoHighlighting( + new BookmarkHighlighting(BookTextView, Collection, bookmark) + ); setView(BookTextView); } else { setFootnoteModel(modelId); - FootnoteView.gotoPosition(bookmark); + FootnoteView.gotoHighlighting( + new BookmarkHighlighting(FootnoteView, Collection, bookmark) + ); setView(FootnoteView); } getViewWidget().repaint(); diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java index 97acf49e0..aac71bfd0 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java @@ -142,6 +142,38 @@ public abstract class ZLTextView extends ZLTextViewBase { } } + public synchronized void gotoHighlighting(ZLTextHighlighting highlighting) { + myPreviousPage.reset(); + myNextPage.reset(); + boolean doRepaint = false; + if (myCurrentPage.StartCursor.isNull()) { + doRepaint = true; + preparePaintInfo(myCurrentPage); + } + if (myCurrentPage.StartCursor.isNull()) { + return; + } + if (!highlighting.intersects(myCurrentPage)) { + gotoPosition(highlighting.getStartPosition().getParagraphIndex(), 0, 0); + preparePaintInfo(myCurrentPage); + } + if (myCurrentPage.EndCursor.isNull()) { + preparePaintInfo(myCurrentPage); + } + while (!highlighting.intersects(myCurrentPage)) { + doRepaint = true; + scrollPage(true, ScrollingMode.NO_OVERLAPPING, 0); + preparePaintInfo(myCurrentPage); + } + if (doRepaint) { + if (myCurrentPage.StartCursor.isNull()) { + preparePaintInfo(myCurrentPage); + } + Application.getViewWidget().reset(); + Application.getViewWidget().repaint(); + } + } + public synchronized int search(final String text, boolean ignoreCase, boolean wholeText, boolean backward, boolean thisSectionOnly) { if (text.length() == 0) { return 0;