diff --git a/src/org/zlibrary/text/model/ZLTextParagraph.java b/src/org/zlibrary/text/model/ZLTextParagraph.java index 12ea4bba0..70798880b 100644 --- a/src/org/zlibrary/text/model/ZLTextParagraph.java +++ b/src/org/zlibrary/text/model/ZLTextParagraph.java @@ -2,7 +2,7 @@ package org.zlibrary.text.model; import java.util.List; -public interface ZLTextParagraph { +public interface ZLTextParagraph extends Iterable { interface Entry { } @@ -19,6 +19,4 @@ public interface ZLTextParagraph { Kind getKind(); int getEntryNumber(); int getTextLength(); - List getEntries(); - void addEntry(Entry entry); } diff --git a/src/org/zlibrary/text/model/impl/ZLModelFactory.java b/src/org/zlibrary/text/model/impl/ZLModelFactory.java index 0c9b71975..357858379 100644 --- a/src/org/zlibrary/text/model/impl/ZLModelFactory.java +++ b/src/org/zlibrary/text/model/impl/ZLModelFactory.java @@ -17,6 +17,7 @@ public class ZLModelFactory { return new ZLTextTreeModelImpl(); } //paragraphs + /* public ZLTextParagraph createParagraph() { return new ZLTextParagraphImpl(); } @@ -32,6 +33,7 @@ public class ZLModelFactory { public ZLTextTreeParagraph createTreeParagraph() { return new ZLTextTreeParagraphImpl(null); } + */ //entries public ZLTextControlEntry createControlEntry(byte kind, boolean isStart) { diff --git a/src/org/zlibrary/text/model/impl/ZLTextModelImpl.java b/src/org/zlibrary/text/model/impl/ZLTextModelImpl.java index 9ee9dbfbc..1c1dd6a4e 100644 --- a/src/org/zlibrary/text/model/impl/ZLTextModelImpl.java +++ b/src/org/zlibrary/text/model/impl/ZLTextModelImpl.java @@ -10,6 +10,7 @@ import java.util.Map; abstract class ZLTextModelImpl implements ZLTextModel { private final ArrayList myParagraphs = new ArrayList(); + protected final ArrayList myEntries = new ArrayList(); private static final int DATA_BLOCK_SIZE = 51200; private int myBlockOffset = 0; @@ -34,7 +35,7 @@ abstract class ZLTextModelImpl implements ZLTextModel { private void addEntry(ZLTextParagraph.Entry entry) { final ArrayList paragraphs = myParagraphs; - paragraphs.get(paragraphs.size() - 1).addEntry(entry); + ((ZLTextParagraphImpl)paragraphs.get(paragraphs.size() - 1)).addEntry(entry); } public void addControl(byte textKind, boolean isStart) { @@ -95,7 +96,7 @@ abstract class ZLTextModelImpl implements ZLTextModel { StringBuilder sb = new StringBuilder(); for (ZLTextParagraph paragraph: myParagraphs) { sb.append("[PARAGRAPH]\n"); - for (ZLTextParagraph.Entry entry: paragraph.getEntries()) { + for (ZLTextParagraph.Entry entry : paragraph) { if (entry instanceof ZLTextEntryImpl) { ZLTextEntryImpl textEntry = (ZLTextEntryImpl)entry; sb.append("[TEXT]"); diff --git a/src/org/zlibrary/text/model/impl/ZLTextParagraphImpl.java b/src/org/zlibrary/text/model/impl/ZLTextParagraphImpl.java index 70eb3438a..94e6f8a46 100644 --- a/src/org/zlibrary/text/model/impl/ZLTextParagraphImpl.java +++ b/src/org/zlibrary/text/model/impl/ZLTextParagraphImpl.java @@ -3,31 +3,61 @@ package org.zlibrary.text.model.impl; import org.zlibrary.text.model.ZLTextParagraph; import org.zlibrary.text.model.impl.ZLTextEntryImpl; -import java.util.List; -import java.util.ArrayList; -import java.util.Collections; +import java.util.*; class ZLTextParagraphImpl implements ZLTextParagraph { - private final ArrayList myEntries = new ArrayList(); + private final ArrayList myEntries; + private final int myOffset; + private int myLength; - ZLTextParagraphImpl() { + ZLTextParagraphImpl(ArrayList entries) { + myEntries = entries; + myOffset = entries.size(); + myLength = 0; } - public List getEntries() { - return Collections.unmodifiableList(myEntries); + private class EntryIterator implements Iterator { + private int myPosition; + + EntryIterator() { + myPosition = myOffset; + } + + public boolean hasNext() { + return myPosition < myOffset + myLength; + } + + public Entry next() { + if (myPosition == myOffset + myLength) { + throw new NoSuchElementException(); + } + return myEntries.get(myPosition++); + } + + public void remove() { + throw new UnsupportedOperationException(); + } + } + + public Iterator iterator() { + return new EntryIterator(); } public Kind getKind() { return Kind.TEXT_PARAGRAPH; } - public int getEntryNumber() { - return myEntries.size(); + public final int getEntryNumber() { + return myLength; } - public int getTextLength() { + public final int getTextLength() { int size = 0; - for (ZLTextParagraph.Entry entry: myEntries) { + final ArrayList entries = myEntries; + final int from = myOffset; + final int to = from + myLength; + for (int i = from; i < to; ++i) { + Entry entry = entries.get(i); if (entry instanceof ZLTextEntryImpl) { size += ((ZLTextEntryImpl)entry).getDataLength(); } @@ -35,7 +65,8 @@ class ZLTextParagraphImpl implements ZLTextParagraph { return size; } - public void addEntry(ZLTextParagraph.Entry entry) { + final void addEntry(Entry entry) { myEntries.add(entry); + ++myLength; } } diff --git a/src/org/zlibrary/text/model/impl/ZLTextPlainModelImpl.java b/src/org/zlibrary/text/model/impl/ZLTextPlainModelImpl.java index bfe69f75a..e49a5b38e 100644 --- a/src/org/zlibrary/text/model/impl/ZLTextPlainModelImpl.java +++ b/src/org/zlibrary/text/model/impl/ZLTextPlainModelImpl.java @@ -5,7 +5,9 @@ import org.zlibrary.text.model.ZLTextPlainModel; class ZLTextPlainModelImpl extends ZLTextModelImpl implements ZLTextPlainModel { public void createParagraph(ZLTextParagraph.Kind kind) { - ZLTextParagraph paragraph = (kind == ZLTextParagraph.Kind.TEXT_PARAGRAPH) ? new ZLTextParagraphImpl() : new ZLTextSpecialParagraphImpl(kind); + ZLTextParagraph paragraph = + (kind == ZLTextParagraph.Kind.TEXT_PARAGRAPH) ? + new ZLTextParagraphImpl(myEntries) : new ZLTextSpecialParagraphImpl(kind, myEntries); addParagraphInternal(paragraph); } } diff --git a/src/org/zlibrary/text/model/impl/ZLTextSpecialParagraphImpl.java b/src/org/zlibrary/text/model/impl/ZLTextSpecialParagraphImpl.java index 8be552cea..1e944d574 100644 --- a/src/org/zlibrary/text/model/impl/ZLTextSpecialParagraphImpl.java +++ b/src/org/zlibrary/text/model/impl/ZLTextSpecialParagraphImpl.java @@ -1,9 +1,12 @@ package org.zlibrary.text.model.impl; +import java.util.ArrayList; + class ZLTextSpecialParagraphImpl extends ZLTextParagraphImpl { private Kind myKind; - ZLTextSpecialParagraphImpl(Kind kind) { + ZLTextSpecialParagraphImpl(Kind kind, ArrayList entries) { + super(entries); myKind = kind; } diff --git a/src/org/zlibrary/text/model/impl/ZLTextTreeModelImpl.java b/src/org/zlibrary/text/model/impl/ZLTextTreeModelImpl.java index cc4047c50..68003e638 100644 --- a/src/org/zlibrary/text/model/impl/ZLTextTreeModelImpl.java +++ b/src/org/zlibrary/text/model/impl/ZLTextTreeModelImpl.java @@ -7,7 +7,7 @@ public class ZLTextTreeModelImpl extends ZLTextModelImpl implements ZLTextTreeMo private final ZLTextTreeParagraph myRoot; public ZLTextTreeModelImpl() { - myRoot = new ZLTextTreeParagraphImpl(null); + myRoot = new ZLTextTreeParagraphImpl(null, myEntries); myRoot.open(true); } @@ -15,7 +15,7 @@ public class ZLTextTreeModelImpl extends ZLTextModelImpl implements ZLTextTreeMo if (parent == null) { parent = myRoot; } - ZLTextTreeParagraph tp = new ZLTextTreeParagraphImpl(parent); + ZLTextTreeParagraph tp = new ZLTextTreeParagraphImpl(parent, myEntries); addParagraphInternal(tp); return tp; } diff --git a/src/org/zlibrary/text/model/impl/ZLTextTreeParagraphImpl.java b/src/org/zlibrary/text/model/impl/ZLTextTreeParagraphImpl.java index cace4885e..0396cc1c5 100644 --- a/src/org/zlibrary/text/model/impl/ZLTextTreeParagraphImpl.java +++ b/src/org/zlibrary/text/model/impl/ZLTextTreeParagraphImpl.java @@ -12,7 +12,8 @@ class ZLTextTreeParagraphImpl extends ZLTextParagraphImpl implements ZLTextTreeP private ZLTextTreeParagraph myParent; private final ArrayList myChildren = new ArrayList(); - ZLTextTreeParagraphImpl(ZLTextTreeParagraph parent) { + ZLTextTreeParagraphImpl(ZLTextTreeParagraph parent, ArrayList entries) { + super(entries); myParent = parent; if (parent != null) { ((ZLTextTreeParagraphImpl)parent).addChild(this); diff --git a/src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java b/src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java index 7700d6e63..e69fdf06a 100644 --- a/src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java +++ b/src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java @@ -24,8 +24,7 @@ public abstract class ZLTextParagraphCursor { /*Why do we need ZLTextParagraph.Entry interface?*/ public void fill() { - List entries = myParagraph.getEntries(); - for (ZLTextParagraph.Entry entry : entries) { + for (ZLTextParagraph.Entry entry : myParagraph) { if (entry instanceof ZLTextEntry) { processTextEntry((ZLTextEntry) entry); } else if (entry instanceof ZLTextControlEntry) {