diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml
index 6f8a3af6b..8ffde351f 100644
--- a/assets/resources/application/en.xml
+++ b/assets/resources/application/en.xml
@@ -255,6 +255,9 @@
+
+
+
diff --git a/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java b/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java
index 3deb7a683..d88c0eec3 100644
--- a/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java
+++ b/src/org/geometerplus/android/fbreader/ProcessHyperlinkAction.java
@@ -30,6 +30,8 @@ import com.github.johnpersano.supertoasts.SuperToast;
import com.github.johnpersano.supertoasts.util.OnClickWrapper;
import org.geometerplus.zlibrary.core.network.ZLNetworkException;
+import org.geometerplus.zlibrary.core.resources.ZLResource;
+import org.geometerplus.zlibrary.text.util.AutoTextSnippet;
import org.geometerplus.zlibrary.text.view.*;
import org.geometerplus.fbreader.fbreader.FBReaderApp;
@@ -70,16 +72,18 @@ class ProcessHyperlinkAction extends FBAndroidAction {
case FBHyperlinkType.INTERNAL:
Reader.Collection.markHyperlinkAsVisited(Reader.getCurrentBook(), hyperlink.Id);
{
- final FBReaderApp.FootnoteData data = Reader.getFootnoteData(hyperlink.Id);
- if (data != null) {
- final SuperActivityToast toast =
- new SuperActivityToast(BaseActivity, SuperToast.Type.BUTTON);
- toast.setText(data.Text);
- toast.setDuration(SuperToast.Duration.LONG);
+ final AutoTextSnippet snippet = Reader.getFootnoteData(hyperlink.Id);
+ if (snippet == null) {
+ break;
+ }
+ final SuperActivityToast toast;
+ if (snippet.IsEndOfText) {
+ toast = new SuperActivityToast(BaseActivity, SuperToast.Type.STANDARD);
+ } else {
+ toast = new SuperActivityToast(BaseActivity, SuperToast.Type.BUTTON);
toast.setButtonIcon(
android.R.drawable.ic_menu_more,
- "More"
- //ZLResource.resource("dialog").getResource("button").getResource("edit").getValue()
+ ZLResource.resource("footnoteToast").getResource("more").getValue()
);
toast.setOnClickWrapper(new OnClickWrapper("ftnt", new SuperToast.OnClickListener() {
@Override
@@ -87,8 +91,10 @@ class ProcessHyperlinkAction extends FBAndroidAction {
Reader.tryOpenFootnote(hyperlink.Id);
}
}));
- toast.show();
}
+ toast.setText(snippet.getText());
+ toast.setDuration(SuperToast.Duration.LONG);
+ toast.show();
}
break;
}
diff --git a/src/org/geometerplus/fbreader/book/Bookmark.java b/src/org/geometerplus/fbreader/book/Bookmark.java
index 9f23ac4a2..4e258d5fe 100644
--- a/src/org/geometerplus/fbreader/book/Bookmark.java
+++ b/src/org/geometerplus/fbreader/book/Bookmark.java
@@ -23,8 +23,8 @@ import java.util.*;
import org.geometerplus.zlibrary.core.util.MiscUtil;
import org.geometerplus.zlibrary.text.view.*;
+import org.geometerplus.zlibrary.text.util.AutoTextSnippet;
import org.geometerplus.zlibrary.text.util.TextSnippet;
-import org.geometerplus.zlibrary.text.util.TextSnippetImpl;
public final class Bookmark extends ZLTextFixedPosition {
public enum DateType {
@@ -35,7 +35,7 @@ public final class Bookmark extends ZLTextFixedPosition {
}
public static Bookmark createBookmark(Book book, String modelId, ZLTextWordCursor startCursor, int maxWords, boolean isVisible) {
- return new Bookmark(book, modelId, new TextSnippetImpl(startCursor, maxWords), isVisible);
+ return new Bookmark(book, modelId, new AutoTextSnippet(startCursor, maxWords), isVisible);
}
private long myId;
diff --git a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java
index b7926234d..e06803514 100644
--- a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java
+++ b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java
@@ -28,6 +28,7 @@ import org.geometerplus.zlibrary.core.util.*;
import org.geometerplus.zlibrary.text.hyphenation.ZLTextHyphenator;
import org.geometerplus.zlibrary.text.model.ZLTextModel;
+import org.geometerplus.zlibrary.text.util.AutoTextSnippet;
import org.geometerplus.zlibrary.text.util.EmptyTextSnippet;
import org.geometerplus.zlibrary.text.view.*;
@@ -211,17 +212,7 @@ public final class FBReaderApp extends ZLApplication {
return (FBView)getCurrentView();
}
- public static class FootnoteData {
- public final String Text;
- public final boolean IsFull;
-
- private FootnoteData(String text, boolean isFull) {
- Text = text;
- IsFull = isFull;
- }
- }
-
- public FootnoteData getFootnoteData(String id) {
+ public AutoTextSnippet getFootnoteData(String id) {
if (Model == null) {
return null;
}
@@ -229,7 +220,18 @@ public final class FBReaderApp extends ZLApplication {
if (label == null) {
return null;
}
- return new FootnoteData("Here will be the footnote text", false);
+ final ZLTextModel model;
+ if (label.ModelId != null) {
+ model = Model.getFootnoteModel(label.ModelId);
+ } else {
+ model = Model.getTextModel();
+ }
+ if (model == null) {
+ return null;
+ }
+ final ZLTextWordCursor cursor =
+ new ZLTextWordCursor(new ZLTextParagraphCursor(model, label.ParagraphIndex));
+ 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 391a85810..c29930754 100644
--- a/src/org/geometerplus/fbreader/fbreader/FBView.java
+++ b/src/org/geometerplus/fbreader/fbreader/FBView.java
@@ -29,8 +29,8 @@ import org.geometerplus.zlibrary.core.util.ZLColor;
import org.geometerplus.zlibrary.core.view.ZLPaintContext;
import org.geometerplus.zlibrary.text.model.ZLTextModel;
+import org.geometerplus.zlibrary.text.util.FixedTextSnippet;
import org.geometerplus.zlibrary.text.util.TextSnippet;
-import org.geometerplus.zlibrary.text.util.TextSnippetImpl;
import org.geometerplus.zlibrary.text.view.*;
import org.geometerplus.zlibrary.text.view.style.ZLTextStyleCollection;
@@ -747,7 +747,7 @@ public final class FBView extends ZLTextView {
if (!isSelectionEmpty()) {
traverser.traverse(start, end);
}
- return new TextSnippetImpl(start, end, traverser.getText());
+ return new FixedTextSnippet(start, end, traverser.getText());
}
public int getCountOfSelectedWords() {
diff --git a/src/org/geometerplus/zlibrary/text/util/TextSnippetImpl.java b/src/org/geometerplus/zlibrary/text/util/AutoTextSnippet.java
similarity index 93%
rename from src/org/geometerplus/zlibrary/text/util/TextSnippetImpl.java
rename to src/org/geometerplus/zlibrary/text/util/AutoTextSnippet.java
index faa2ba74a..f58d77100 100644
--- a/src/org/geometerplus/zlibrary/text/util/TextSnippetImpl.java
+++ b/src/org/geometerplus/zlibrary/text/util/AutoTextSnippet.java
@@ -23,18 +23,14 @@ import java.util.*;
import org.geometerplus.zlibrary.text.view.*;
-public class TextSnippetImpl implements TextSnippet {
+public final class AutoTextSnippet implements TextSnippet {
private final ZLTextPosition myStart;
private final ZLTextPosition myEnd;
private final String myText;
- public TextSnippetImpl(ZLTextPosition start, ZLTextPosition end, String text) {
- myStart = start;
- myEnd = end;
- myText = text;
- }
+ public final boolean IsEndOfText;
- public TextSnippetImpl(ZLTextWordCursor start, int maxWords) {
+ public AutoTextSnippet(ZLTextWordCursor start, int maxWords) {
final ZLTextWordCursor cursor = new ZLTextWordCursor(start);
final Buffer buffer = new Buffer(cursor);
@@ -118,6 +114,7 @@ mainLoop:
myStart = new ZLTextFixedPosition(start);
myEnd = buffer.Cursor;
myText = buffer.Builder.toString();
+ IsEndOfText = cursor.isEndOfText() && sentenceBuffer.isEmpty() && phraseBuffer.isEmpty();
}
private static class Buffer {
diff --git a/src/org/geometerplus/zlibrary/text/util/FixedTextSnippet.java b/src/org/geometerplus/zlibrary/text/util/FixedTextSnippet.java
new file mode 100644
index 000000000..cdd2afedf
--- /dev/null
+++ b/src/org/geometerplus/zlibrary/text/util/FixedTextSnippet.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2009-2015 FBReader.ORG Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+package org.geometerplus.zlibrary.text.util;
+
+import org.geometerplus.zlibrary.text.view.ZLTextPosition;
+
+public final class FixedTextSnippet implements TextSnippet {
+ private final ZLTextPosition myStart;
+ private final ZLTextPosition myEnd;
+ private final String myText;
+
+ public FixedTextSnippet(ZLTextPosition start, ZLTextPosition end, String text) {
+ myStart = start;
+ myEnd = end;
+ myText = text;
+ }
+
+ public ZLTextPosition getStart() {
+ return myStart;
+ }
+
+ public ZLTextPosition getEnd() {
+ return myEnd;
+ }
+
+ public String getText() {
+ return myText;
+ }
+}
diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextParagraphCursor.java b/src/org/geometerplus/zlibrary/text/view/ZLTextParagraphCursor.java
index c7cb74400..28cb50522 100644
--- a/src/org/geometerplus/zlibrary/text/view/ZLTextParagraphCursor.java
+++ b/src/org/geometerplus/zlibrary/text/view/ZLTextParagraphCursor.java
@@ -210,6 +210,10 @@ public final class ZLTextParagraphCursor {
public final ZLTextModel Model;
private final ArrayList myElements = new ArrayList();
+ public ZLTextParagraphCursor(ZLTextModel model, int index) {
+ this(new CursorManager(model, null), model, index);
+ }
+
ZLTextParagraphCursor(CursorManager cManager, ZLTextModel model, int index) {
CursorManager = cManager;
Model = model;