From a7cc9a9becc3f77fdcd11916ddc52e08a25adb45 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Mon, 7 Jan 2008 13:45:38 +0000 Subject: [PATCH] MiniHelp: fixed mistyping added 'open external links in browser' feature git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@464 6a642e6f-84f6-412e-ac94-c4a38d5a04b0 --- TODO | 2 + data/help/MiniHelp.ru.fb2 | 2 +- src/org/fbreader/fbreader/BookTextView.java | 46 ++++++++++++++++++- src/org/fbreader/fbreader/ContentsView.java | 2 +- src/org/zlibrary/core/library/ZLibrary.java | 1 + .../zlibrary/text/model/ZLTextParagraph.java | 2 + .../text/model/impl/ZLTextModelImpl.java | 7 ++- .../text/view/impl/ZLTextControlElement.java | 4 +- .../text/view/impl/ZLTextElement.java | 2 +- .../text/view/impl/ZLTextElementArea.java | 8 ++-- .../impl/ZLTextHyperlinkControlElement.java | 10 ++++ .../text/view/impl/ZLTextImageElement.java | 2 +- .../text/view/impl/ZLTextParagraphCursor.java | 6 ++- .../text/view/impl/ZLTextViewImpl.java | 7 ++- .../zlibrary/text/view/impl/ZLTextWord.java | 2 +- .../ui/android/library/ZLAndroidLibrary.java | 8 ++++ .../ui/swing/library/ZLSwingLibrary.java | 5 ++ 17 files changed, 98 insertions(+), 18 deletions(-) create mode 100644 src/org/zlibrary/text/view/impl/ZLTextHyperlinkControlElement.java diff --git a/TODO b/TODO index 0f9be3b95..f7061cedf 100644 --- a/TODO +++ b/TODO @@ -5,6 +5,8 @@ ZLTextView: переход по ссылкам внутренним внешним (вызов браузера) + swing +DONE android переносы position indicator обработка неразрывных пробелов diff --git a/data/help/MiniHelp.ru.fb2 b/data/help/MiniHelp.ru.fb2 index ca3c234c4..d97648ec6 100644 --- a/data/help/MiniHelp.ru.fb2 +++ b/data/help/MiniHelp.ru.fb2 @@ -6,7 +6,7 @@

FBReader распространяется свободно, включая исходные тексты, под лицензией GNU GPL.

С чего начать

-

FBReader автоматически собирает в библиотеку файлы форматов fb2, oeb и OpenReader, лежащие в каталогах, заданных параметром “Каталоги с книгами”. Поэтому прежде всего нужно определить этот параметр. Откройте диалог настроек (нажмите на кнопку ) и отредактруйте “каталоги с книгами” в разделе “Общие настройки”. Каталоги перечисляются через двоеточие, в этих каталогах должны лижать файлы с расширениями fb2, oebzip или orb, или содержащие их архивы.

+

FBReader автоматически собирает в библиотеку файлы форматов fb2, oeb и OpenReader, лежащие в каталогах, заданных параметром “Каталоги с книгами”. Поэтому прежде всего нужно определить этот параметр. Откройте диалог настроек (нажмите на кнопку ) и отредактруйте “каталоги с книгами” в разделе “Общие настройки”. Каталоги перечисляются через двоеточие, в этих каталогах должны лежать файлы с расширениями fb2, oebzip или orb, или содержащие их архивы.

Теперь откройте библиотеку (нажмите на ), выберите книгу, и приступайте к чтению.

Чтобы читать книгу в другом формате, ее нужно вручную добавить в библиотеку. Запустите диалог добавления книги (), выберите файл и отредактируйте информацию о книге. В следующий раз вы сможете открыть эту книгу уже с помощью библиотеки ().

diff --git a/src/org/fbreader/fbreader/BookTextView.java b/src/org/fbreader/fbreader/BookTextView.java index d29501575..80be2a5d8 100644 --- a/src/org/fbreader/fbreader/BookTextView.java +++ b/src/org/fbreader/fbreader/BookTextView.java @@ -1,10 +1,11 @@ package org.fbreader.fbreader; +import org.zlibrary.core.library.ZLibrary; import org.zlibrary.core.options.*; import org.zlibrary.core.view.ZLPaintContext; import org.zlibrary.text.model.ZLTextModel; -import org.zlibrary.text.view.impl.ZLTextWordCursor; -import org.zlibrary.text.view.impl.ZLTextParagraphCursor; +import org.zlibrary.text.view.impl.*; +import org.fbreader.bookmodel.FBTextKind; class BookTextView extends FBView { private ZLIntegerOption myParagraphNumberOption; @@ -46,6 +47,47 @@ class BookTextView extends FBView { if (super.onStylusPress(x, y)) { return true; } + + ZLTextElementArea area = getElementByCoordinates(x, y); + if (area != null) { + ZLTextElement element = area.Element; + if ((element instanceof ZLTextImageElement) || + (element instanceof ZLTextWord)) { + final ZLTextWordCursor cursor = new ZLTextWordCursor(getStartCursor()); + cursor.moveToParagraph(area.ParagraphNumber); + cursor.moveToParagraphStart(); + final int elementNumber = area.TextElementNumber; + byte hyperlinkKind = FBTextKind.REGULAR; + String id = null; + for (int i = 0; i < elementNumber; ++i) { + ZLTextElement e = cursor.getElement(); + if (e instanceof ZLTextControlElement) { + if (e instanceof ZLTextHyperlinkControlElement) { + final ZLTextHyperlinkControlElement control = (ZLTextHyperlinkControlElement)e; + hyperlinkKind = control.Kind; + id = control.Label; + } else { + final ZLTextControlElement control = (ZLTextControlElement)e; + if (!control.IsStart && (control.Kind == hyperlinkKind)) { + hyperlinkKind = FBTextKind.REGULAR; + id = null; + } + } + } + cursor.nextWord(); + } + if (id != null) { + switch (hyperlinkKind) { + case FBTextKind.EXTERNAL_HYPERLINK: + ZLibrary.getInstance().openInBrowser(id); + return true; + case FBTextKind.FOOTNOTE: + case FBTextKind.INTERNAL_HYPERLINK: + return true; + } + } + } + } return false; } } diff --git a/src/org/fbreader/fbreader/ContentsView.java b/src/org/fbreader/fbreader/ContentsView.java index 8072c4ca3..a087cbfcc 100644 --- a/src/org/fbreader/fbreader/ContentsView.java +++ b/src/org/fbreader/fbreader/ContentsView.java @@ -15,7 +15,7 @@ class ContentsView extends FBView { return true; } - final int index = paragraphIndexByCoordinate(y); + final int index = getParagraphIndexByCoordinate(y); if (index == -1) { return false; } diff --git a/src/org/zlibrary/core/library/ZLibrary.java b/src/org/zlibrary/core/library/ZLibrary.java index 4384ad10b..febbd1601 100644 --- a/src/org/zlibrary/core/library/ZLibrary.java +++ b/src/org/zlibrary/core/library/ZLibrary.java @@ -38,6 +38,7 @@ public abstract class ZLibrary { abstract public ZLPaintContext createPaintContext(); abstract public InputStream getResourceInputStream(String fileName); + abstract public void openInBrowser(String reference); protected final void loadProperties() { new ZLXMLReaderAdapter() { diff --git a/src/org/zlibrary/text/model/ZLTextParagraph.java b/src/org/zlibrary/text/model/ZLTextParagraph.java index d563887b5..4d4cf09dd 100644 --- a/src/org/zlibrary/text/model/ZLTextParagraph.java +++ b/src/org/zlibrary/text/model/ZLTextParagraph.java @@ -20,6 +20,8 @@ public interface ZLTextParagraph { byte getControlKind(); boolean getControlIsStart(); + boolean getControlIsHyperlink(); + String getHyperlinkControlLabel(); ZLImageEntry getImageEntry(); diff --git a/src/org/zlibrary/text/model/impl/ZLTextModelImpl.java b/src/org/zlibrary/text/model/impl/ZLTextModelImpl.java index 83f97247b..d9d544f0e 100644 --- a/src/org/zlibrary/text/model/impl/ZLTextModelImpl.java +++ b/src/org/zlibrary/text/model/impl/ZLTextModelImpl.java @@ -36,6 +36,7 @@ abstract class ZLTextModelImpl implements ZLTextModel { private byte myControlKind; private boolean myControlIsStart; private boolean myControlIsHyperlink; + private String myHyperlinkControlLabel; private ZLImageEntry myImageEntry; @@ -68,6 +69,9 @@ abstract class ZLTextModelImpl implements ZLTextModel { public boolean getControlIsHyperlink() { return myControlIsHyperlink; } + public String getHyperlinkControlLabel() { + return myHyperlinkControlLabel; + } public ZLImageEntry getImageEntry() { return myImageEntry; @@ -109,6 +113,7 @@ abstract class ZLTextModelImpl implements ZLTextModel { if ((kind & 0x0200) == 0x0200) { myControlIsHyperlink = true; short labelLength = (short)data[dataOffset++]; + myHyperlinkControlLabel = new String(data, dataOffset, labelLength); dataOffset += labelLength; } else { myControlIsHyperlink = false; @@ -219,8 +224,6 @@ abstract class ZLTextModelImpl implements ZLTextModel { block[blockOffset++] = (char)labelLength; label.getChars(0, labelLength, block, blockOffset); myBlockOffset = blockOffset + labelLength; - //addEntry(code + myEntries.size()); - //myEntries.add(new ZLTextHyperlinkControlEntry(textKind, label)); } public final void addImage(String id, ZLImageMap imageMap, short vOffset) { diff --git a/src/org/zlibrary/text/view/impl/ZLTextControlElement.java b/src/org/zlibrary/text/view/impl/ZLTextControlElement.java index cd8714077..e44f03c1e 100644 --- a/src/org/zlibrary/text/view/impl/ZLTextControlElement.java +++ b/src/org/zlibrary/text/view/impl/ZLTextControlElement.java @@ -1,6 +1,6 @@ package org.zlibrary.text.view.impl; -final class ZLTextControlElement extends ZLTextElement { +public class ZLTextControlElement extends ZLTextElement { private final static ZLTextControlElement[] myStartElements = new ZLTextControlElement[256]; private final static ZLTextControlElement[] myEndElements = new ZLTextControlElement[256]; @@ -17,7 +17,7 @@ final class ZLTextControlElement extends ZLTextElement { public final byte Kind; public final boolean IsStart; - private ZLTextControlElement(byte kind, boolean isStart) { + protected ZLTextControlElement(byte kind, boolean isStart) { Kind = kind; IsStart = isStart; } diff --git a/src/org/zlibrary/text/view/impl/ZLTextElement.java b/src/org/zlibrary/text/view/impl/ZLTextElement.java index 5be2a18fe..b4e5d0d56 100644 --- a/src/org/zlibrary/text/view/impl/ZLTextElement.java +++ b/src/org/zlibrary/text/view/impl/ZLTextElement.java @@ -1,6 +1,6 @@ package org.zlibrary.text.view.impl; -class ZLTextElement { +public class ZLTextElement { final static ZLTextElement HSpace = new ZLTextElement(); final static ZLTextElement AfterParagraph = new ZLTextElement(); final static ZLTextElement IndentElement = new ZLTextElement(); diff --git a/src/org/zlibrary/text/view/impl/ZLTextElementArea.java b/src/org/zlibrary/text/view/impl/ZLTextElementArea.java index e2c314f1a..cc2983eae 100644 --- a/src/org/zlibrary/text/view/impl/ZLTextElementArea.java +++ b/src/org/zlibrary/text/view/impl/ZLTextElementArea.java @@ -2,15 +2,15 @@ package org.zlibrary.text.view.impl; import org.zlibrary.text.view.ZLTextStyle; -class ZLTextElementArea extends ZLTextRectangularArea { - final int ParagraphNumber; - final int TextElementNumber; +public class ZLTextElementArea extends ZLTextRectangularArea { + public final int ParagraphNumber; + public final int TextElementNumber; final int StartCharNumber; final int Length; final boolean AddHyphenationSign; final boolean ChangeStyle; final ZLTextStyle Style; - final ZLTextElement Element; + public final ZLTextElement Element; ZLTextElementArea(int paragraphNumber, int textElementNumber, int startCharNumber, int length, boolean addHyphenationSign, boolean changeStyle, ZLTextStyle style, ZLTextElement element, int xStart, int xEnd, int yStart, int yEnd) { super(xStart, xEnd, yStart, yEnd); diff --git a/src/org/zlibrary/text/view/impl/ZLTextHyperlinkControlElement.java b/src/org/zlibrary/text/view/impl/ZLTextHyperlinkControlElement.java new file mode 100644 index 000000000..26a2774b1 --- /dev/null +++ b/src/org/zlibrary/text/view/impl/ZLTextHyperlinkControlElement.java @@ -0,0 +1,10 @@ +package org.zlibrary.text.view.impl; + +public final class ZLTextHyperlinkControlElement extends ZLTextControlElement { + public final String Label; + + ZLTextHyperlinkControlElement(byte kind, String label) { + super(kind, true); + Label = label; + } +} diff --git a/src/org/zlibrary/text/view/impl/ZLTextImageElement.java b/src/org/zlibrary/text/view/impl/ZLTextImageElement.java index 39fdd8b05..1b5a853fc 100644 --- a/src/org/zlibrary/text/view/impl/ZLTextImageElement.java +++ b/src/org/zlibrary/text/view/impl/ZLTextImageElement.java @@ -2,7 +2,7 @@ package org.zlibrary.text.view.impl; import org.zlibrary.core.image.ZLImageData; -class ZLTextImageElement extends ZLTextElement { +public final class ZLTextImageElement extends ZLTextElement { private ZLImageData myImageData; ZLTextImageElement(ZLImageData imageData) { diff --git a/src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java b/src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java index d3d3bf12d..d6391a0b1 100644 --- a/src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java +++ b/src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java @@ -26,7 +26,11 @@ public abstract class ZLTextParagraphCursor { processTextEntry(it.getTextData(), it.getTextOffset(), it.getTextLength()); break; case ZLTextParagraph.Entry.CONTROL: - myElements.add(ZLTextControlElement.get(it.getControlKind(), it.getControlIsStart())); + if (it.getControlIsStart() && it.getControlIsHyperlink()) { + myElements.add(new ZLTextHyperlinkControlElement(it.getControlKind(), it.getHyperlinkControlLabel())); + } else { + myElements.add(ZLTextControlElement.get(it.getControlKind(), it.getControlIsStart())); + } break; case ZLTextParagraph.Entry.IMAGE: ZLImage image = it.getImageEntry().getImage(); diff --git a/src/org/zlibrary/text/view/impl/ZLTextViewImpl.java b/src/org/zlibrary/text/view/impl/ZLTextViewImpl.java index 8599aa42e..4e202c0ec 100644 --- a/src/org/zlibrary/text/view/impl/ZLTextViewImpl.java +++ b/src/org/zlibrary/text/view/impl/ZLTextViewImpl.java @@ -339,7 +339,6 @@ public abstract class ZLTextViewImpl extends ZLTextView { final ZLTextLineInfo info = new ZLTextLineInfo(paragraphCursor, startIndex, startCharNumber, myTextStyle); final ZLTextLineInfo cachedInfo = myLineInfoCache.get(info); if (cachedInfo != null) { - //System.err.println("cached!!!!"); return cachedInfo; } @@ -898,7 +897,11 @@ public abstract class ZLTextViewImpl extends ZLTextView { return start; } - protected int paragraphIndexByCoordinate(int y) { + protected ZLTextElementArea getElementByCoordinates(int x, int y) { + return ZLTextRectangularArea.binarySearch(myTextElementMap, x, y); + } + + protected int getParagraphIndexByCoordinate(int y) { ZLTextElementArea area = ZLTextRectangularArea.binarySearch(myTextElementMap, y); return (area != null) ? area.ParagraphNumber : -1; } diff --git a/src/org/zlibrary/text/view/impl/ZLTextWord.java b/src/org/zlibrary/text/view/impl/ZLTextWord.java index 5daa0e5a9..ffbd9234d 100644 --- a/src/org/zlibrary/text/view/impl/ZLTextWord.java +++ b/src/org/zlibrary/text/view/impl/ZLTextWord.java @@ -2,7 +2,7 @@ package org.zlibrary.text.view.impl; import org.zlibrary.core.view.ZLPaintContext; -final class ZLTextWord extends ZLTextElement { +public final class ZLTextWord extends ZLTextElement { public final char[] Data; public final int Offset; public final int Length; diff --git a/src/org/zlibrary/ui/android/library/ZLAndroidLibrary.java b/src/org/zlibrary/ui/android/library/ZLAndroidLibrary.java index 8891e9fdf..bbfcb427b 100644 --- a/src/org/zlibrary/ui/android/library/ZLAndroidLibrary.java +++ b/src/org/zlibrary/ui/android/library/ZLAndroidLibrary.java @@ -3,6 +3,8 @@ package org.zlibrary.ui.android.library; import java.io.InputStream; import android.content.Resources; +import android.content.Intent; +import android.net.ContentURI; import org.zlibrary.core.library.ZLibrary; import org.zlibrary.core.application.ZLApplication; @@ -60,6 +62,12 @@ public final class ZLAndroidLibrary extends ZLibrary { } } + public void openInBrowser(String reference) { + Intent intent = new Intent(Intent.VIEW_ACTION); + intent.setData(ContentURI.create(reference)); + myActivity.startActivity(intent); + } + void run(ZLAndroidActivity activity) { myActivity = activity; diff --git a/src/org/zlibrary/ui/swing/library/ZLSwingLibrary.java b/src/org/zlibrary/ui/swing/library/ZLSwingLibrary.java index de9657ac0..7a30adcfb 100644 --- a/src/org/zlibrary/ui/swing/library/ZLSwingLibrary.java +++ b/src/org/zlibrary/ui/swing/library/ZLSwingLibrary.java @@ -54,4 +54,9 @@ public class ZLSwingLibrary extends ZLibrary { // ZLDialogManager.getInstance().errorBox(new "noHelpBox"); } + + public void openInBrowser(String reference) { + // TODO: implement + System.out.println("to open in browser: " + reference); + } }