mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-04 02:09:35 +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:
parent
a9beaad9c9
commit
2eadd95e24
9 changed files with 351 additions and 0 deletions
5
src/org/zlibrary/text/view/ZLTextView.java
Normal file
5
src/org/zlibrary/text/view/ZLTextView.java
Normal file
|
@ -0,0 +1,5 @@
|
|||
package org.zlibrary.text.view;
|
||||
|
||||
public interface ZLTextView {
|
||||
|
||||
}
|
28
src/org/zlibrary/text/view/impl/ZLTextControlElement.java
Normal file
28
src/org/zlibrary/text/view/impl/ZLTextControlElement.java
Normal 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();
|
||||
}
|
||||
}
|
13
src/org/zlibrary/text/view/impl/ZLTextElement.java
Normal file
13
src/org/zlibrary/text/view/impl/ZLTextElement.java
Normal 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;
|
||||
}
|
||||
}
|
21
src/org/zlibrary/text/view/impl/ZLTextLineInfo.java
Normal file
21
src/org/zlibrary/text/view/impl/ZLTextLineInfo.java
Normal 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;
|
||||
}
|
||||
}
|
65
src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java
Normal file
65
src/org/zlibrary/text/view/impl/ZLTextParagraphCursor.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
11
src/org/zlibrary/text/view/impl/ZLTextViewImpl.java
Normal file
11
src/org/zlibrary/text/view/impl/ZLTextViewImpl.java
Normal 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;
|
||||
}
|
||||
}
|
19
src/org/zlibrary/text/view/impl/ZLTextWord.java
Normal file
19
src/org/zlibrary/text/view/impl/ZLTextWord.java
Normal 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;
|
||||
}
|
||||
}
|
168
src/org/zlibrary/text/view/impl/ZLTextWordCursor.java
Normal file
168
src/org/zlibrary/text/view/impl/ZLTextWordCursor.java
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue