diff --git a/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp b/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp index abb597d88..6008ed2fb 100644 --- a/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp +++ b/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp @@ -156,10 +156,13 @@ void BookReader::addHyperlinkControl(FBTextKind kind, const std::string &label) std::string type; switch (myHyperlinkKind) { case INTERNAL_HYPERLINK: - case FOOTNOTE: myHyperlinkType = HYPERLINK_INTERNAL; type = "internal"; break; + case FOOTNOTE: + myHyperlinkType = HYPERLINK_FOOTNOTE; + type = "footnote"; + break; case EXTERNAL_HYPERLINK: myHyperlinkType = HYPERLINK_EXTERNAL; type = "external"; diff --git a/jni/NativeFormats/fbreader/src/bookmodel/FBHyperlinkType.h b/jni/NativeFormats/fbreader/src/bookmodel/FBHyperlinkType.h index 5d01f5ca6..1a8901dc8 100644 --- a/jni/NativeFormats/fbreader/src/bookmodel/FBHyperlinkType.h +++ b/jni/NativeFormats/fbreader/src/bookmodel/FBHyperlinkType.h @@ -23,8 +23,9 @@ enum FBHyperlinkType { HYPERLINK_NONE = 0, HYPERLINK_INTERNAL = 1, - HYPERLINK_EXTERNAL = 2, - //HYPERLINK_BOOK = 3, + HYPERLINK_FOOTNOTE = 2, + HYPERLINK_EXTERNAL = 3, + //HYPERLINK_BOOK = 4, }; #endif /* __FBHYPERLINKTYPE_H__ */ diff --git a/jni/NativeFormats/fbreader/src/formats/fb2/FB2BookReader.cpp b/jni/NativeFormats/fbreader/src/formats/fb2/FB2BookReader.cpp index 853110984..0a9035a24 100644 --- a/jni/NativeFormats/fbreader/src/formats/fb2/FB2BookReader.cpp +++ b/jni/NativeFormats/fbreader/src/formats/fb2/FB2BookReader.cpp @@ -189,7 +189,7 @@ void FB2BookReader::startElementHandler(int tag, const char **xmlattributes) { if (ref[0] == '#') { const char *type = attributeValue(xmlattributes, "type"); static const std::string NOTE = "note"; - if ((type != 0) && (NOTE == type)) { + if (type != 0 && NOTE == type) { myHyperlinkType = FOOTNOTE; } else { myHyperlinkType = INTERNAL_HYPERLINK; diff --git a/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java b/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java index d88c0eec3..86d0409d1 100644 --- a/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java +++ b/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java @@ -70,12 +70,28 @@ class ProcessHyperlinkAction extends FBAndroidAction { openInBrowser(hyperlink.Id); break; case FBHyperlinkType.INTERNAL: + case FBHyperlinkType.FOOTNOTE: + { + final AutoTextSnippet snippet = Reader.getFootnoteData(hyperlink.Id); + if (snippet == null) { + break; + } + Reader.Collection.markHyperlinkAsVisited(Reader.getCurrentBook(), hyperlink.Id); - { - final AutoTextSnippet snippet = Reader.getFootnoteData(hyperlink.Id); - if (snippet == null) { + final boolean showToast; + switch (Reader.MiscOptions.ShowFootnoteToast.getValue()) { + default: + case never: + showToast = false; break; - } + case footnotesOnly: + showToast = hyperlink.Type == FBHyperlinkType.FOOTNOTE; + break; + case allInternalLinks: + showToast = true; + break; + } + if (showToast) { final SuperActivityToast toast; if (snippet.IsEndOfText) { toast = new SuperActivityToast(BaseActivity, SuperToast.Type.STANDARD); @@ -95,8 +111,11 @@ class ProcessHyperlinkAction extends FBAndroidAction { toast.setText(snippet.getText()); toast.setDuration(SuperToast.Duration.LONG); toast.show(); + } else { + Reader.tryOpenFootnote(hyperlink.Id); } break; + } } } else if (soul instanceof ZLTextImageRegionSoul) { Reader.getTextView().hideSelectedRegionBorder(); diff --git a/src/org/geometerplus/android/fbreader/preferences/PreferenceActivity.java b/src/org/geometerplus/android/fbreader/preferences/PreferenceActivity.java index 95c824735..e37ad7eff 100644 --- a/src/org/geometerplus/android/fbreader/preferences/PreferenceActivity.java +++ b/src/org/geometerplus/android/fbreader/preferences/PreferenceActivity.java @@ -292,6 +292,7 @@ public class PreferenceActivity extends ZLPreferenceActivity { */ appearanceScreen.addOption(androidLibrary.ShowStatusBarOption, "showStatusBar"); appearanceScreen.addOption(androidLibrary.DisableButtonLightsOption, "disableButtonLights"); + appearanceScreen.addOption(miscOptions.ShowFootnoteToast, "showFootnoteToast"); if (DeviceType.Instance().isEInk()) { final EInkOptions einkOptions = new EInkOptions(); diff --git a/src/org/geometerplus/fbreader/bookmodel/FBHyperlinkType.java b/src/org/geometerplus/fbreader/bookmodel/FBHyperlinkType.java index 751ecc8aa..aa1d88c9d 100644 --- a/src/org/geometerplus/fbreader/bookmodel/FBHyperlinkType.java +++ b/src/org/geometerplus/fbreader/bookmodel/FBHyperlinkType.java @@ -22,5 +22,6 @@ package org.geometerplus.fbreader.bookmodel; public interface FBHyperlinkType { byte NONE = 0; byte INTERNAL = 1; - byte EXTERNAL = 2; + byte FOOTNOTE = 2; + byte EXTERNAL = 3; } diff --git a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java index e06803514..6dd814cfc 100644 --- a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java +++ b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java @@ -231,7 +231,12 @@ public final class FBReaderApp extends ZLApplication { } final ZLTextWordCursor cursor = new ZLTextWordCursor(new ZLTextParagraphCursor(model, label.ParagraphIndex)); - return new AutoTextSnippet(cursor, 20); + final AutoTextSnippet longSnippet = new AutoTextSnippet(cursor, 24); + if (longSnippet.IsEndOfText) { + return longSnippet; + } else { + return new AutoTextSnippet(cursor, 20); + } } public void tryOpenFootnote(String id) { diff --git a/src/org/geometerplus/fbreader/fbreader/FBView.java b/src/org/geometerplus/fbreader/fbreader/FBView.java index c29930754..5a89bd52c 100644 --- a/src/org/geometerplus/fbreader/fbreader/FBView.java +++ b/src/org/geometerplus/fbreader/fbreader/FBView.java @@ -444,6 +444,7 @@ public final class FBView extends ZLTextView { case FBHyperlinkType.NONE: return profile.RegularTextOption.getValue(); case FBHyperlinkType.INTERNAL: + case FBHyperlinkType.FOOTNOTE: return myReader.Collection.isHyperlinkVisited(myReader.getCurrentBook(), hyperlink.Id) ? profile.VisitedHyperlinkTextOption.getValue() : profile.HyperlinkTextOption.getValue(); diff --git a/src/org/geometerplus/fbreader/fbreader/options/MiscOptions.java b/src/org/geometerplus/fbreader/fbreader/options/MiscOptions.java index 260763dd8..3f5f4f139 100644 --- a/src/org/geometerplus/fbreader/fbreader/options/MiscOptions.java +++ b/src/org/geometerplus/fbreader/fbreader/options/MiscOptions.java @@ -33,6 +33,11 @@ public class MiscOptions { } public final ZLEnumOption WordTappingAction; + public static enum FootnoteToastEnum { + never, footnotesOnly, allInternalLinks + } + public final ZLEnumOption ShowFootnoteToast; + public MiscOptions() { AllowScreenBrightnessAdjustment = new ZLBooleanOption("LookNFeel", "AllowScreenBrightnessAdjustment", true); @@ -46,5 +51,8 @@ public class MiscOptions { WordTappingAction = new ZLEnumOption("Options", "WordTappingAction", WordTappingActionEnum.startSelecting); + + ShowFootnoteToast = + new ZLEnumOption("Options", "ShowFootnoteToast", FootnoteToastEnum.footnotesOnly); } }