diff --git a/src/org/zlibrary/text/view/ZLTextView.java b/src/org/zlibrary/text/view/ZLTextView.java new file mode 100644 index 000000000..bd2e24772 --- /dev/null +++ b/src/org/zlibrary/text/view/ZLTextView.java @@ -0,0 +1,5 @@ +package org.zlibrary.text.view; + +public interface ZLTextView { + +} diff --git a/src/org/zlibrary/text/view/impl/ZLTextControlElement.java b/src/org/zlibrary/text/view/impl/ZLTextControlElement.java new file mode 100644 index 000000000..6ff60f62f --- /dev/null +++ b/src/org/zlibrary/text/view/impl/ZLTextControlElement.java @@ -0,0 +1,28 @@ +package org.zlibrary.text.view.impl; + +import org.zlibrary.text.model.entry.ZLTextControlEntry; +import org.zlibrary.text.model.entry.ZLTextParagraphEntry; + +class ZLTextControlElement extends ZLTextElement { + private ZLTextParagraphEntry myEntry; + + private ZLTextControlElement(ZLTextParagraphEntry entry) { + myEntry = entry; + } + + public Kind getKind() { + return Kind.CONTROL_ELEMENT; + } + + public ZLTextControlEntry getEntry() { + return (ZLTextControlEntry)myEntry; + } + + public byte getTextKind() { + return getEntry().getKind(); + } + + public boolean isStart() { + return getEntry().isStart(); + } +} diff --git a/src/org/zlibrary/text/view/impl/ZLTextElement.java b/src/org/zlibrary/text/view/impl/ZLTextElement.java new file mode 100644 index 000000000..abb3f0e30 --- /dev/null +++ b/src/org/zlibrary/text/view/impl/ZLTextElement.java @@ -0,0 +1,13 @@ +package org.zlibrary.text.view.impl; + +class ZLTextElement { + + enum Kind { + WORD_ELEMENT, + CONTROL_ELEMENT, + }; + + public Kind getKind() { + return Kind.WORD_ELEMENT; + } +} diff --git a/src/org/zlibrary/text/view/impl/ZLTextLineInfo.java b/src/org/zlibrary/text/view/impl/ZLTextLineInfo.java new file mode 100644 index 000000000..b18897174 --- /dev/null +++ b/src/org/zlibrary/text/view/impl/ZLTextLineInfo.java @@ -0,0 +1,21 @@ +package org.zlibrary.text.view.impl; + +class ZLTextLineInfo { + public ZLTextWordCursor myStart; + public ZLTextWordCursor myRealStart; + public ZLTextWordCursor myEnd; + public boolean myIsVisible; + public int myLeftIndent; + public int myWidth; + public int myHeight; + + public ZLTextLineInfo(ZLTextWordCursor word) { + myStart = word; + myRealStart= word; + myEnd = word; + myIsVisible = false; + myLeftIndent = 0; + myWidth = 0; + myHeight = 0; + } +} diff --git a/src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java b/src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java new file mode 100644 index 000000000..711f94919 --- /dev/null +++ b/src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java @@ -0,0 +1,65 @@ +package org.zlibrary.text.view.impl; + +import org.zlibrary.text.model.ZLTextModel; +import org.zlibrary.text.model.ZLTextParagraph; + +import java.util.*; + +abstract class ZLTextParagraphCursor { + protected ZLTextModel myModel; + protected int myIndex; + protected List myElements; + + protected ZLTextParagraphCursor(ZLTextModel model, int index) { + myModel = model; + myIndex = Math.min(index, myModel.getParagraphsNumber() - 1); + fill(); + } + + public static ZLTextParagraphCursor getCursor(ZLTextModel model, int index) { + ZLTextParagraphCursor result; + result = new ZLTextPlainParagraphCursor(model, index); + return result; + } + + protected void fill() { + ZLTextParagraph paragraph = myModel.getParagraph(myIndex); + } + + protected void clear() { + myElements.clear(); + } + + /*Something strange here*/ + + public boolean isNull() { + return myModel == null; + } + + public boolean isFirst() { + return myIndex == 0; + } + + public abstract boolean isLast(); + + public int getParagraphLength() { + return myElements.size(); + } + + public int getIndex() { + return myIndex; + } + + abstract public ZLTextParagraphCursor previous(); + abstract public ZLTextParagraphCursor next(); + + public ZLTextElement getElement(int index) { + return myElements.get(index); + } + + public ZLTextParagraph getParagraph() { + return myModel.getParagraph(myIndex); + } +} + + diff --git a/src/org/zlibrary/text/view/impl/ZLTextPlainParagraphCursor.java b/src/org/zlibrary/text/view/impl/ZLTextPlainParagraphCursor.java new file mode 100644 index 000000000..fb767bc61 --- /dev/null +++ b/src/org/zlibrary/text/view/impl/ZLTextPlainParagraphCursor.java @@ -0,0 +1,21 @@ +package org.zlibrary.text.view.impl; + +import org.zlibrary.text.model.ZLTextModel; + +class ZLTextPlainParagraphCursor extends ZLTextParagraphCursor { + /*package*/ ZLTextPlainParagraphCursor(ZLTextModel model, int index) { + super(model, index); + } + + public boolean isLast() { + return (myIndex + 1 == myModel.getParagraphsNumber()); + } + + public ZLTextParagraphCursor previous() { + return isFirst() ? null : getCursor(myModel, myIndex - 1); + } + + public ZLTextParagraphCursor next() { + return isLast() ? null : getCursor(myModel, myIndex + 1); + } +} diff --git a/src/org/zlibrary/text/view/impl/ZLTextViewImpl.java b/src/org/zlibrary/text/view/impl/ZLTextViewImpl.java new file mode 100644 index 000000000..d08adbbfb --- /dev/null +++ b/src/org/zlibrary/text/view/impl/ZLTextViewImpl.java @@ -0,0 +1,11 @@ +package org.zlibrary.text.view.impl; + +import org.zlibrary.text.view.ZLTextView; + +class ZLTextViewImpl implements ZLTextView { + + ZLTextLineInfo processTextLine(ZLTextWordCursor start, ZLTextWordCursor end) { + ZLTextLineInfo info = new ZLTextLineInfo(start); + return info; + } +} diff --git a/src/org/zlibrary/text/view/impl/ZLTextWord.java b/src/org/zlibrary/text/view/impl/ZLTextWord.java new file mode 100644 index 000000000..b3de6cf52 --- /dev/null +++ b/src/org/zlibrary/text/view/impl/ZLTextWord.java @@ -0,0 +1,19 @@ +package org.zlibrary.text.view.impl; + +class ZLTextWord extends ZLTextElement { + public String myData; + public short mySize; + public short myLength; + public int myParagraphOffset; + + private ZLTextWord(String data, short size, int paragraphOffset) { + myData = data; + mySize = size; + myLength = (short) data.length(); + myParagraphOffset = paragraphOffset; + } + + public Kind getKind() { + return Kind.WORD_ELEMENT; + } +} diff --git a/src/org/zlibrary/text/view/impl/ZLTextWordCursor.java b/src/org/zlibrary/text/view/impl/ZLTextWordCursor.java new file mode 100644 index 000000000..8ce717efe --- /dev/null +++ b/src/org/zlibrary/text/view/impl/ZLTextWordCursor.java @@ -0,0 +1,168 @@ +package org.zlibrary.text.view.impl; + +import java.util.*; + +class ZLTextWordCursor { + private ZLTextParagraphCursor myParagraphCursor; + private int myWordNumber; + private int myCharNumber; + + /*Why do we create cursor without paragraph number and then are having all the troubles with cheking whether it is null or not?*/ + + public ZLTextWordCursor() { + myWordNumber = 0; + myCharNumber = 0; + } + + public ZLTextWordCursor(ZLTextWordCursor cursor) { + myParagraphCursor = cursor.myParagraphCursor; + myWordNumber = cursor.myWordNumber; + myCharNumber = cursor.myCharNumber; + } + + public void setCursor(ZLTextWordCursor cursor) { + myParagraphCursor = cursor.myParagraphCursor; + myWordNumber = cursor.myWordNumber; + myCharNumber = cursor.myCharNumber; + } + + public void setCursor(ZLTextParagraphCursor paragraphCursor) { + myWordNumber = 0; + myCharNumber = 0; + myParagraphCursor = paragraphCursor; + moveToParagraphStart(); + } + + public boolean isNull() { + return myParagraphCursor.isNull(); + } + + public boolean equalWordNumber(ZLTextWordCursor cursor) { + return myWordNumber == cursor.myWordNumber; + } + + public boolean sameElementAs(ZLTextWordCursor cursor) { + return (myWordNumber == cursor.myWordNumber && myParagraphCursor.getIndex() == cursor.myParagraphCursor.getIndex()); + } + + public boolean isStartOfParagraph() { + return (myWordNumber == 0 && myCharNumber == 0); + } + + /*Why don't we check here whether myCharNumber is in the end of the word or not?*/ + + public boolean isEndOfParagraph() { + return myWordNumber == myParagraphCursor.getParagraphLength(); + } + + public int getWordNumber() { + return myWordNumber; + } + + public int getCharNumber() { + return myCharNumber; + } + + public ZLTextElement getElement() { + return myParagraphCursor.getElement(myWordNumber); + } + + public ZLTextParagraphCursor getParagraphCursor() { + return myParagraphCursor; + } + + public void nextWord() { + myWordNumber++; + myCharNumber = 0; + } + + public void previousWord() { + myWordNumber--; + myCharNumber = 0; + } + + public boolean nextParagraph() { + if (!isNull()) { + if (!myParagraphCursor.isLast()) { + myParagraphCursor = myParagraphCursor.next(); + moveToParagraphStart(); + return true; + } + } + return false; + } + + public boolean previousParagraph() { + if (!isNull()) { + if (!myParagraphCursor.isFirst()) { + myParagraphCursor = myParagraphCursor.previous(); + moveToParagraphStart(); + } + } + return false; + } + + public void moveToParagraphStart() { + if (!isNull()) { + myWordNumber = 0; + myCharNumber = 0; + } + } + + /*Why are we moving outside of the paragraph?*/ + + public void moveToParagraphEnd() { + if (!isNull()) { + myWordNumber = myParagraphCursor.getParagraphLength(); + myCharNumber = 0; + } + } + + /*Why do we create new object here instead of just changing myParagraphNumber?*/ + + public void moveToParagraph(int paragraphNumber) { + if (!isNull() && (paragraphNumber != myParagraphCursor.getIndex())) { + myParagraphCursor = ZLTextParagraphCursor.getCursor(myParagraphCursor.myModel, paragraphNumber); + moveToParagraphStart(); + } + } + + public void moveTo(int wordNumber, int charNumber) { + if (!isNull()) { + if (wordNumber == 0 && charNumber == 0) { + myWordNumber = 0; + myCharNumber = 0; + } else { + wordNumber = Math.max(0, wordNumber); + int size = myParagraphCursor.getParagraphLength(); + if (wordNumber > size) { + myWordNumber = size; + myCharNumber = 0; + } else { + myWordNumber = wordNumber; + setCharNumber(charNumber); + } + } + } + } + + public void setCharNumber(int charNumber) { + charNumber = Math.max(0, charNumber); + myCharNumber = 0; + if (charNumber > 0) { + ZLTextElement element = myParagraphCursor.getElement(myWordNumber); + if (element.getKind() == ZLTextElement.Kind.WORD_ELEMENT) { + if (charNumber <= ((ZLTextWord)element).myLength) { + myCharNumber = charNumber; + } + } + } + } + + public void rebuild() { + if (!isNull()) { + myParagraphCursor.clear(); + myParagraphCursor.fill(); + } + } +}