1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-04 10:19:33 +02:00

add text.view

git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@76 6a642e6f-84f6-412e-ac94-c4a38d5a04b0
This commit is contained in:
MarinaSokol 2007-10-30 19:08:11 +00:00
parent a9beaad9c9
commit 2eadd95e24
9 changed files with 351 additions and 0 deletions

View file

@ -0,0 +1,5 @@
package org.zlibrary.text.view;
public interface ZLTextView {
}

View file

@ -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();
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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 <ZLTextElement> 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);
}
}

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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();
}
}
}