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