From 4d7522a60dc654c98efdbdf108f5246e1cf8b2c5 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 28 Apr 2013 18:50:18 +0200 Subject: [PATCH] 2 pages view --- .../fbreader/fbreader/FBReaderApp.java | 2 + .../fbreader/fbreader/FBView.java | 5 +++ .../zlibrary/text/view/ZLTextPage.java | 1 + .../zlibrary/text/view/ZLTextView.java | 42 ++++++++++++++----- .../zlibrary/text/view/ZLTextViewBase.java | 5 +++ 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java index d881fef26..13e2426b3 100644 --- a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java +++ b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java @@ -68,6 +68,7 @@ public final class FBReaderApp extends ZLApplication { public final ZLIntegerRangeOption RightMarginOption; public final ZLIntegerRangeOption TopMarginOption; public final ZLIntegerRangeOption BottomMarginOption; + public final ZLIntegerRangeOption IntercolumnSpaceOption; { final int dpi = ZLibrary.Instance().getDisplayDPI(); final int x = ZLibrary.Instance().getPixelWidth(); @@ -77,6 +78,7 @@ public final class FBReaderApp extends ZLApplication { RightMarginOption = new ZLIntegerRangeOption("Options", "RightMargin", 0, 100, horMargin); TopMarginOption = new ZLIntegerRangeOption("Options", "TopMargin", 0, 100, 0); BottomMarginOption = new ZLIntegerRangeOption("Options", "BottomMargin", 0, 100, 4); + IntercolumnSpaceOption = new ZLIntegerRangeOption("Options", "IntercolumnSpace", 0, 100, 4 * horMargin); } public final ZLIntegerRangeOption ScrollbarTypeOption = diff --git a/src/org/geometerplus/fbreader/fbreader/FBView.java b/src/org/geometerplus/fbreader/fbreader/FBView.java index 8d2b97ca4..bbd52e8e3 100644 --- a/src/org/geometerplus/fbreader/fbreader/FBView.java +++ b/src/org/geometerplus/fbreader/fbreader/FBView.java @@ -352,6 +352,11 @@ public final class FBView extends ZLTextView { return myReader.BottomMarginOption.getValue(); } + @Override + public int getIntercolumnSpace() { + return myReader.IntercolumnSpaceOption.getValue(); + } + @Override public ZLFile getWallpaperFile() { final String filePath = myReader.getColorProfile().WallpaperOption.getValue(); diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextPage.java b/src/org/geometerplus/zlibrary/text/view/ZLTextPage.java index e1c68e678..3826b166b 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextPage.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextPage.java @@ -25,6 +25,7 @@ final class ZLTextPage { final ZLTextWordCursor StartCursor = new ZLTextWordCursor(); final ZLTextWordCursor EndCursor = new ZLTextWordCursor(); final ArrayList LineInfos = new ArrayList(); + int Column0Height; int PaintState = PaintStateEnum.NOTHING_TO_PAINT; final ZLTextElementAreaVector TextElementMap = new ZLTextElementAreaVector(); diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java index fd320c4b1..2012f8688 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java @@ -433,12 +433,17 @@ public abstract class ZLTextView extends ZLTextViewBase { final ArrayList lineInfos = page.LineInfos; final int[] labels = new int[lineInfos.size() + 1]; + int x = getLeftMargin(); int y = getTopMargin(); int index = 0; for (ZLTextLineInfo info : lineInfos) { - prepareTextLine(page, info, y); + prepareTextLine(page, info, x, y); y += info.Height + info.Descent + info.VSpaceAfter; labels[++index] = page.TextElementMap.size(); + if (index == page.Column0Height) { + y = getTopMargin(); + x += getTextColumnWidth() + getIntercolumnSpace(); + } } y = getTopMargin(); @@ -447,6 +452,9 @@ public abstract class ZLTextView extends ZLTextViewBase { drawTextLine(page, info, labels[index], labels[index + 1], y); y += info.Height + info.Descent + info.VSpaceAfter; ++index; + if (index == page.Column0Height) { + y = getTopMargin(); + } } final ZLTextRegion selectedElementRegion = getSelectedRegion(page); @@ -835,7 +843,8 @@ public abstract class ZLTextView extends ZLTextViewBase { result.setCursor(start); int textAreaHeight = getTextAreaHeight(); page.LineInfos.clear(); - int counter = 0; + page.Column0Height = 0; + int columnCounter = 0; do { resetTextStyle(); final ZLTextParagraphCursor paragraphCursor = result.getParagraphCursor(); @@ -846,16 +855,28 @@ public abstract class ZLTextView extends ZLTextViewBase { while (info.EndElementIndex != endIndex) { info = processTextLine(paragraphCursor, info.EndElementIndex, info.EndCharIndex, endIndex); textAreaHeight -= info.Height + info.Descent; - if (textAreaHeight < 0 && counter > 0) { - break; + if (textAreaHeight < 0 && page.LineInfos.size() > page.Column0Height) { + if (columnCounter == 0) { + ++columnCounter; + textAreaHeight = getTextAreaHeight(); + textAreaHeight -= info.Height + info.Descent; + page.Column0Height = page.LineInfos.size(); + } else { + break; + } } textAreaHeight -= info.VSpaceAfter; result.moveTo(info.EndElementIndex, info.EndCharIndex); page.LineInfos.add(info); if (textAreaHeight < 0) { - break; + if (columnCounter == 0) { + ++columnCounter; + textAreaHeight = getTextAreaHeight(); + page.Column0Height = page.LineInfos.size(); + } else { + break; + } } - counter++; } } while (result.isEndOfParagraph() && result.nextParagraph() && !result.getParagraphCursor().isEndOfSection() && (textAreaHeight >= 0)); resetTextStyle(); @@ -918,7 +939,8 @@ public abstract class ZLTextView extends ZLTextViewBase { int newWidth = info.Width; int newHeight = info.Height; int newDescent = info.Descent; - int maxWidth = getTextAreaWidth() - getTextStyle().getRightIndent(); + //int maxWidth = (getTextAreaWidth() - getTextStyle().getRightIndent()) / 2; + int maxWidth = getTextColumnWidth(); boolean wordOccurred = false; boolean isVisible = false; int lastSpaceWidth = 0; @@ -1058,7 +1080,7 @@ public abstract class ZLTextView extends ZLTextViewBase { return info; } - private void prepareTextLine(ZLTextPage page, ZLTextLineInfo info, int y) { + private void prepareTextLine(ZLTextPage page, ZLTextLineInfo info, int x, int y) { y = Math.min(y + info.Height, getTopMargin() + getTextAreaHeight() - 1); final ZLPaintContext context = getContext(); @@ -1070,9 +1092,9 @@ public abstract class ZLTextView extends ZLTextViewBase { final boolean endOfParagraph = info.isEndOfParagraph(); boolean wordOccurred = false; boolean changeStyle = true; + x += info.LeftIndent; - int x = getLeftMargin() + info.LeftIndent; - final int maxWidth = getTextAreaWidth(); + final int maxWidth = getTextAreaWidth() / 2; switch (getTextStyle().getAlignment()) { case ZLTextAlignmentType.ALIGN_RIGHT: x += maxWidth - getTextStyle().getRightIndent() - info.Width; diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java b/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java index afe2a2abc..b5b9572ba 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java @@ -81,6 +81,7 @@ abstract class ZLTextViewBase extends ZLView { public abstract int getRightMargin(); public abstract int getTopMargin(); public abstract int getBottomMargin(); + public abstract int getIntercolumnSpace(); public abstract ZLFile getWallpaperFile(); public abstract ZLPaintContext.WallpaperMode getWallpaperMode(); @@ -102,6 +103,10 @@ abstract class ZLTextViewBase extends ZLView { return getContextWidth() - getLeftMargin() - getRightMargin(); } + int getTextColumnWidth() { + return (getContextWidth() - getLeftMargin() - getRightMargin() - getIntercolumnSpace()) / 2; + } + final ZLTextStyle getTextStyle() { return myTextStyle; }