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

ContentsTree instead of ZLTextTreeModel

This commit is contained in:
Nikolay Pultsin 2012-05-13 13:42:39 +01:00
parent b783fa99b9
commit 9b22b0743a
13 changed files with 79 additions and 260 deletions

View file

@ -211,33 +211,19 @@ static jobject createTextModel(JNIEnv *env, jobject javaModel, ZLTextModel &mode
return env->PopLocalFrame(textModel); return env->PopLocalFrame(textModel);
} }
static bool initTOC(JNIEnv *env, jobject javaModel, BookModel &model) { static void initTOC(JNIEnv *env, jobject javaModel, const ContentsTree &tree) {
ContentsModel &contentsModel = (ContentsModel&)*model.contentsModel(); const std::vector<shared_ptr<ContentsTree> > &children = tree.children();
for (std::vector<shared_ptr<ContentsTree> >::const_iterator it = children.begin(); it != children.end(); ++it) {
const ContentsTree &child = **it;
jstring text = AndroidUtil::createJavaString(env, child.text());
const int ref = child.reference();
AndroidUtil::Method_NativeBookModel_addTOCItem->call(javaModel, text, ref);
env->DeleteLocalRef(text);
jobject javaTextModel = createTextModel(env, javaModel, contentsModel); initTOC(env, javaModel, child);
if (javaTextModel == 0) {
return false; AndroidUtil::Method_NativeBookModel_leaveTOCItem->call(javaModel);
} }
std::vector<jint> childrenNumbers;
std::vector<jint> referenceNumbers;
const size_t size = contentsModel.paragraphsNumber();
childrenNumbers.reserve(size);
referenceNumbers.reserve(size);
for (size_t pos = 0; pos < size; ++pos) {
ZLTextTreeParagraph *par = (ZLTextTreeParagraph*)contentsModel[pos];
childrenNumbers.push_back(par->children().size());
referenceNumbers.push_back(contentsModel.reference(par));
}
jintArray javaChildrenNumbers = AndroidUtil::createJavaIntArray(env, childrenNumbers);
jintArray javaReferenceNumbers = AndroidUtil::createJavaIntArray(env, referenceNumbers);
AndroidUtil::Method_NativeBookModel_initTOC->call(javaModel, javaTextModel, javaChildrenNumbers, javaReferenceNumbers);
env->DeleteLocalRef(javaTextModel);
env->DeleteLocalRef(javaChildrenNumbers);
env->DeleteLocalRef(javaReferenceNumbers);
return !env->ExceptionCheck();
} }
extern "C" extern "C"
@ -259,10 +245,12 @@ JNIEXPORT jboolean JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPl
return JNI_FALSE; return JNI_FALSE;
} }
if (!initInternalHyperlinks(env, javaModel, *model) || !initTOC(env, javaModel, *model)) { if (!initInternalHyperlinks(env, javaModel, *model)) {
return JNI_FALSE; return JNI_FALSE;
} }
initTOC(env, javaModel, *model->contentsTree());
shared_ptr<ZLTextModel> textModel = model->bookTextModel(); shared_ptr<ZLTextModel> textModel = model->bookTextModel();
jobject javaTextModel = createTextModel(env, javaModel, *textModel); jobject javaTextModel = createTextModel(env, javaModel, *textModel);
if (javaTextModel == 0) { if (javaTextModel == 0) {

View file

@ -34,7 +34,7 @@ BookModel::BookModel(const shared_ptr<Book> book, jobject javaModel) : myBook(bo
const std::string cacheDirectory = Library::Instance().cacheDirectory(); const std::string cacheDirectory = Library::Instance().cacheDirectory();
myBookTextModel = new ZLTextPlainModel(std::string(), book->language(), 131072, cacheDirectory, "ncache"); myBookTextModel = new ZLTextPlainModel(std::string(), book->language(), 131072, cacheDirectory, "ncache");
myContentsModel = new ContentsModel(book->language(), cacheDirectory, "ncontents"); myContentsTree = new ContentsTree();
/*shared_ptr<FormatPlugin> plugin = PluginCollection::Instance().plugin(book->file(), false); /*shared_ptr<FormatPlugin> plugin = PluginCollection::Instance().plugin(book->file(), false);
if (!plugin.isNull()) { if (!plugin.isNull()) {
plugin->readModel(*this); plugin->readModel(*this);
@ -58,20 +58,6 @@ BookModel::Label BookModel::label(const std::string &id) const {
return (it != myInternalHyperlinks.end()) ? it->second : Label(0, -1); return (it != myInternalHyperlinks.end()) ? it->second : Label(0, -1);
} }
ContentsModel::ContentsModel(const std::string &language,
const std::string &directoryName, const std::string &fileExtension) :
ZLTextTreeModel(std::string(), language, directoryName, fileExtension) {
}
void ContentsModel::setReference(const ZLTextTreeParagraph *paragraph, int reference) {
myReferenceByParagraph[paragraph] = reference;
}
int ContentsModel::reference(const ZLTextTreeParagraph *paragraph) const {
std::map<const ZLTextTreeParagraph*,int>::const_iterator it = myReferenceByParagraph.find(paragraph);
return (it != myReferenceByParagraph.end()) ? it->second : -1;
}
const shared_ptr<Book> BookModel::book() const { const shared_ptr<Book> BookModel::book() const {
return myBook; return myBook;
} }
@ -81,7 +67,6 @@ bool BookModel::flush() {
if (myBookTextModel->allocator().failed()) { if (myBookTextModel->allocator().failed()) {
return false; return false;
} }
myContentsModel->flush();
std::map<std::string,shared_ptr<ZLTextModel> >::const_iterator it = myFootnotes.begin(); std::map<std::string,shared_ptr<ZLTextModel> >::const_iterator it = myFootnotes.begin();
for (; it != myFootnotes.end(); ++it) { for (; it != myFootnotes.end(); ++it) {

View file

@ -23,6 +23,7 @@
#include <jni.h> #include <jni.h>
#include <map> #include <map>
#include <vector>
#include <string> #include <string>
#include <ZLTextModel.h> #include <ZLTextModel.h>
@ -31,15 +32,21 @@
class ZLImage; class ZLImage;
class Book; class Book;
class ContentsModel : public ZLTextTreeModel { class ContentsTree {
public: public:
ContentsModel(const std::string &language, const std::string &directoryName, const std::string &fileExtension); ContentsTree();
void setReference(const ZLTextTreeParagraph *paragraph, int reference); ContentsTree(ContentsTree &parent, int reference);
int reference(const ZLTextTreeParagraph *paragraph) const; void addText(const std::string &buffer);
const std::string &text() const;
int reference() const;
const std::vector<shared_ptr<ContentsTree> > &children() const;
private: private:
std::map<const ZLTextTreeParagraph*,int> myReferenceByParagraph; std::string myText;
const int myReference;
std::vector<shared_ptr<ContentsTree> > myChildren;
}; };
class BookModel { class BookModel {
@ -66,7 +73,7 @@ public:
void setHyperlinkMatcher(shared_ptr<HyperlinkMatcher> matcher); void setHyperlinkMatcher(shared_ptr<HyperlinkMatcher> matcher);
shared_ptr<ZLTextModel> bookTextModel() const; shared_ptr<ZLTextModel> bookTextModel() const;
shared_ptr<ZLTextModel> contentsModel() const; shared_ptr<ContentsTree> contentsTree() const;
const std::map<std::string,shared_ptr<ZLTextModel> > &footnotes() const; const std::map<std::string,shared_ptr<ZLTextModel> > &footnotes() const;
Label label(const std::string &id) const; Label label(const std::string &id) const;
@ -80,7 +87,7 @@ private:
const shared_ptr<Book> myBook; const shared_ptr<Book> myBook;
jobject myJavaModel; jobject myJavaModel;
shared_ptr<ZLTextModel> myBookTextModel; shared_ptr<ZLTextModel> myBookTextModel;
shared_ptr<ZLTextModel> myContentsModel; shared_ptr<ContentsTree> myContentsTree;
std::map<std::string,shared_ptr<ZLTextModel> > myFootnotes; std::map<std::string,shared_ptr<ZLTextModel> > myFootnotes;
std::map<std::string,Label> myInternalHyperlinks; std::map<std::string,Label> myInternalHyperlinks;
shared_ptr<HyperlinkMatcher> myHyperlinkMatcher; shared_ptr<HyperlinkMatcher> myHyperlinkMatcher;
@ -89,8 +96,20 @@ friend class BookReader;
}; };
inline shared_ptr<ZLTextModel> BookModel::bookTextModel() const { return myBookTextModel; } inline shared_ptr<ZLTextModel> BookModel::bookTextModel() const { return myBookTextModel; }
inline shared_ptr<ZLTextModel> BookModel::contentsModel() const { return myContentsModel; } inline shared_ptr<ContentsTree> BookModel::contentsTree() const { return myContentsTree; }
inline const std::map<std::string,shared_ptr<ZLTextModel> > &BookModel::footnotes() const { return myFootnotes; } inline const std::map<std::string,shared_ptr<ZLTextModel> > &BookModel::footnotes() const { return myFootnotes; }
inline const std::map<std::string,BookModel::Label> &BookModel::internalHyperlinks() const { return myInternalHyperlinks; } inline const std::map<std::string,BookModel::Label> &BookModel::internalHyperlinks() const { return myInternalHyperlinks; }
inline ContentsTree::ContentsTree() : myReference(-1) {}
inline ContentsTree::ContentsTree(ContentsTree &parent, int reference) : myReference(reference) {
parent.myChildren.push_back(this);
}
inline void ContentsTree::addText(const std::string &buffer) {
myText += buffer;
}
inline const std::string &ContentsTree::text() const { return myText; }
inline int ContentsTree::reference() const { return myReference; }
inline const std::vector<shared_ptr<ContentsTree> > &ContentsTree::children() const { return myChildren; }
#endif /* __BOOKMODEL_H__ */ #endif /* __BOOKMODEL_H__ */

View file

@ -34,10 +34,8 @@
BookReader::BookReader(BookModel &model) : myModel(model) { BookReader::BookReader(BookModel &model) : myModel(model) {
myCurrentTextModel = 0; myCurrentTextModel = 0;
myLastTOCParagraphIsEmpty = false;
myTextParagraphExists = false; myTextParagraphExists = false;
myContentsParagraphExists = false;
myInsideTitle = false; myInsideTitle = false;
mySectionContainsRegularContents = false; mySectionContainsRegularContents = false;
@ -195,8 +193,8 @@ void BookReader::addData(const std::string &data) {
} }
void BookReader::addContentsData(const std::string &data) { void BookReader::addContentsData(const std::string &data) {
if (!data.empty() && !myTOCStack.empty()) { if (!data.empty() && !myContentsTreeStack.empty()) {
myContentsBuffer.push_back(data); myContentsTreeStack.top()->addText(data);
} }
} }
@ -256,45 +254,33 @@ void BookReader::addImageReference(const std::string &id, short vOffset, bool is
void BookReader::beginContentsParagraph(int referenceNumber) { void BookReader::beginContentsParagraph(int referenceNumber) {
if (myCurrentTextModel == myModel.myBookTextModel) { if (myCurrentTextModel == myModel.myBookTextModel) {
ContentsModel &contentsModel = (ContentsModel&)*myModel.myContentsModel;
if (referenceNumber == -1) { if (referenceNumber == -1) {
referenceNumber = myCurrentTextModel->paragraphsNumber(); referenceNumber = myCurrentTextModel->paragraphsNumber();
} }
ZLTextTreeParagraph *peek = myTOCStack.empty() ? 0 : myTOCStack.top(); shared_ptr<ContentsTree> parent =
if (!myContentsBuffer.empty()) { myContentsTreeStack.empty() ? myModel.contentsTree() : myContentsTreeStack.top();
contentsModel.addText(myContentsBuffer); if (parent->text().empty()) {
myContentsBuffer.clear(); parent->addText("...");
myLastTOCParagraphIsEmpty = false;
} }
if (myLastTOCParagraphIsEmpty) { new ContentsTree(*parent, referenceNumber);
contentsModel.addText("..."); const std::vector<shared_ptr<ContentsTree> > &children = parent->children();
} myContentsTreeStack.push(children[children.size() - 1]);
ZLTextTreeParagraph *para = contentsModel.createParagraph(peek);
contentsModel.addControl(CONTENTS_TABLE_ENTRY, true);
contentsModel.setReference(para, referenceNumber);
myTOCStack.push(para);
myLastTOCParagraphIsEmpty = true;
myContentsParagraphExists = true; myContentsParagraphExists = true;
} }
} }
void BookReader::endContentsParagraph() { void BookReader::endContentsParagraph() {
if (!myTOCStack.empty()) { if (!myContentsTreeStack.empty()) {
ContentsModel &contentsModel = (ContentsModel&)*myModel.myContentsModel; shared_ptr<ContentsTree> tree = myContentsTreeStack.top();
if (!myContentsBuffer.empty()) { if (tree->text().empty()) {
contentsModel.addText(myContentsBuffer); tree->addText("...");
myContentsBuffer.clear();
myLastTOCParagraphIsEmpty = false;
} }
if (myLastTOCParagraphIsEmpty) { myContentsTreeStack.pop();
contentsModel.addText("...");
myLastTOCParagraphIsEmpty = false;
}
myTOCStack.pop();
} }
myContentsParagraphExists = false; myContentsParagraphExists = false;
} }
/*
void BookReader::setReference(size_t contentsParagraphNumber, int referenceNumber) { void BookReader::setReference(size_t contentsParagraphNumber, int referenceNumber) {
ContentsModel &contentsModel = (ContentsModel&)*myModel.myContentsModel; ContentsModel &contentsModel = (ContentsModel&)*myModel.myContentsModel;
if (contentsParagraphNumber >= contentsModel.paragraphsNumber()) { if (contentsParagraphNumber >= contentsModel.paragraphsNumber()) {
@ -302,6 +288,7 @@ void BookReader::setReference(size_t contentsParagraphNumber, int referenceNumbe
} }
contentsModel.setReference((const ZLTextTreeParagraph*)contentsModel[contentsParagraphNumber], referenceNumber); contentsModel.setReference((const ZLTextTreeParagraph*)contentsModel[contentsParagraphNumber], referenceNumber);
} }
*/
void BookReader::reset() { void BookReader::reset() {
myKindStack.clear(); myKindStack.clear();

View file

@ -30,6 +30,7 @@
#include "FBTextKind.h" #include "FBTextKind.h"
class BookModel; class BookModel;
class ContentsTree;
class ZLTextModel; class ZLTextModel;
class ZLInputStream; class ZLInputStream;
class ZLCachedMemoryAllocator; class ZLCachedMemoryAllocator;
@ -69,7 +70,7 @@ public:
void beginContentsParagraph(int referenceNumber = -1); void beginContentsParagraph(int referenceNumber = -1);
void endContentsParagraph(); void endContentsParagraph();
bool contentsParagraphIsOpen() const; bool contentsParagraphIsOpen() const;
void setReference(size_t contentsParagraphNumber, int referenceNumber); //void setReference(size_t contentsParagraphNumber, int referenceNumber);
void addData(const std::string &data); void addData(const std::string &data);
void addContentsData(const std::string &data); void addContentsData(const std::string &data);
@ -93,14 +94,12 @@ private:
bool myTextParagraphExists; bool myTextParagraphExists;
bool myContentsParagraphExists; bool myContentsParagraphExists;
std::stack<ZLTextTreeParagraph*> myTOCStack; std::stack<shared_ptr<ContentsTree> > myContentsTreeStack;
bool myLastTOCParagraphIsEmpty;
bool mySectionContainsRegularContents; bool mySectionContainsRegularContents;
bool myInsideTitle; bool myInsideTitle;
std::vector<std::string> myBuffer; std::vector<std::string> myBuffer;
std::vector<std::string> myContentsBuffer;
std::string myHyperlinkReference; std::string myHyperlinkReference;
FBHyperlinkType myHyperlinkType; FBHyperlinkType myHyperlinkType;

View file

@ -110,7 +110,8 @@ shared_ptr<StaticObjectMethod> AndroidUtil::StaticMethod_Tag_getTag;
shared_ptr<ObjectField> AndroidUtil::Field_NativeBookModel_Book; shared_ptr<ObjectField> AndroidUtil::Field_NativeBookModel_Book;
shared_ptr<VoidMethod> AndroidUtil::Method_NativeBookModel_initInternalHyperlinks; shared_ptr<VoidMethod> AndroidUtil::Method_NativeBookModel_initInternalHyperlinks;
shared_ptr<VoidMethod> AndroidUtil::Method_NativeBookModel_initTOC; shared_ptr<VoidMethod> AndroidUtil::Method_NativeBookModel_addTOCItem;
shared_ptr<VoidMethod> AndroidUtil::Method_NativeBookModel_leaveTOCItem;
shared_ptr<ObjectMethod> AndroidUtil::Method_NativeBookModel_createTextModel; shared_ptr<ObjectMethod> AndroidUtil::Method_NativeBookModel_createTextModel;
shared_ptr<VoidMethod> AndroidUtil::Method_NativeBookModel_setBookTextModel; shared_ptr<VoidMethod> AndroidUtil::Method_NativeBookModel_setBookTextModel;
shared_ptr<VoidMethod> AndroidUtil::Method_NativeBookModel_setFootnoteModel; shared_ptr<VoidMethod> AndroidUtil::Method_NativeBookModel_setFootnoteModel;
@ -185,7 +186,8 @@ bool AndroidUtil::init(JavaVM* jvm) {
Field_NativeBookModel_Book = new ObjectField(Class_NativeBookModel, "Book", Class_Book); Field_NativeBookModel_Book = new ObjectField(Class_NativeBookModel, "Book", Class_Book);
Method_NativeBookModel_initInternalHyperlinks = new VoidMethod(Class_NativeBookModel, "initInternalHyperlinks", "(Ljava/lang/String;Ljava/lang/String;I)"); Method_NativeBookModel_initInternalHyperlinks = new VoidMethod(Class_NativeBookModel, "initInternalHyperlinks", "(Ljava/lang/String;Ljava/lang/String;I)");
Method_NativeBookModel_initTOC = new VoidMethod(Class_NativeBookModel, "initTOC", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;[I[I)"); Method_NativeBookModel_addTOCItem = new VoidMethod(Class_NativeBookModel, "addTOCItem", "(Ljava/lang/String;I)");
Method_NativeBookModel_leaveTOCItem = new VoidMethod(Class_NativeBookModel, "leaveTOCItem", "()");
Method_NativeBookModel_createTextModel = new ObjectMethod(Class_NativeBookModel, "createTextModel", Class_ZLTextModel, "(Ljava/lang/String;Ljava/lang/String;I[I[I[I[I[BLjava/lang/String;Ljava/lang/String;I)"); Method_NativeBookModel_createTextModel = new ObjectMethod(Class_NativeBookModel, "createTextModel", Class_ZLTextModel, "(Ljava/lang/String;Ljava/lang/String;I[I[I[I[I[BLjava/lang/String;Ljava/lang/String;I)");
Method_NativeBookModel_setBookTextModel = new VoidMethod(Class_NativeBookModel, "setBookTextModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)"); Method_NativeBookModel_setBookTextModel = new VoidMethod(Class_NativeBookModel, "setBookTextModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)");
Method_NativeBookModel_setFootnoteModel = new VoidMethod(Class_NativeBookModel, "setFootnoteModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)"); Method_NativeBookModel_setFootnoteModel = new VoidMethod(Class_NativeBookModel, "setFootnoteModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)");

View file

@ -132,7 +132,8 @@ public:
static shared_ptr<ObjectField> Field_NativeBookModel_Book; static shared_ptr<ObjectField> Field_NativeBookModel_Book;
static shared_ptr<VoidMethod> Method_NativeBookModel_initInternalHyperlinks; static shared_ptr<VoidMethod> Method_NativeBookModel_initInternalHyperlinks;
static shared_ptr<VoidMethod> Method_NativeBookModel_initTOC; static shared_ptr<VoidMethod> Method_NativeBookModel_addTOCItem;
static shared_ptr<VoidMethod> Method_NativeBookModel_leaveTOCItem;
static shared_ptr<ObjectMethod> Method_NativeBookModel_createTextModel; static shared_ptr<ObjectMethod> Method_NativeBookModel_createTextModel;
static shared_ptr<VoidMethod> Method_NativeBookModel_setBookTextModel; static shared_ptr<VoidMethod> Method_NativeBookModel_setBookTextModel;
static shared_ptr<VoidMethod> Method_NativeBookModel_setFootnoteModel; static shared_ptr<VoidMethod> Method_NativeBookModel_setFootnoteModel;

View file

@ -133,42 +133,6 @@ void ZLTextModel::addParagraphInternal(ZLTextParagraph *paragraph) {
myLastEntryStart = 0; myLastEntryStart = 0;
} }
ZLTextTreeModel::ZLTextTreeModel(const std::string &id, const std::string &language,
const std::string &directoryName, const std::string &fileExtension) :
ZLTextModel(id, language, 8192, directoryName, fileExtension) {
myRoot = new ZLTextTreeParagraph();
myRoot->open(true);
}
ZLTextTreeModel::~ZLTextTreeModel() {
delete myRoot;
}
ZLTextTreeParagraph *ZLTextTreeModel::createParagraph(ZLTextTreeParagraph *parent) {
if (parent == 0) {
parent = myRoot;
}
ZLTextTreeParagraph *tp = new ZLTextTreeParagraph(parent);
addParagraphInternal(tp);
return tp;
}
/*
void ZLTextTreeModel::search(const std::string &text, size_t startIndex, size_t endIndex, bool ignoreCase) const {
ZLTextModel::search(text, startIndex, endIndex, ignoreCase);
for (std::vector<ZLTextMark>::const_iterator it = marks().begin(); it != marks().end(); ++it) {
((ZLTextTreeParagraph*)(*this)[it->ParagraphIndex])->openTree();
}
}
void ZLTextTreeModel::selectParagraph(size_t index) const {
if (index < paragraphsNumber()) {
ZLTextModel::selectParagraph(index);
((ZLTextTreeParagraph*)(*this)[index])->openTree();
}
}
*/
ZLTextPlainModel::ZLTextPlainModel(const std::string &id, const std::string &language, const size_t rowSize, ZLTextPlainModel::ZLTextPlainModel(const std::string &id, const std::string &language, const size_t rowSize,
const std::string &directoryName, const std::string &fileExtension) : const std::string &directoryName, const std::string &fileExtension) :
ZLTextModel(id, language, rowSize, directoryName, fileExtension) { ZLTextModel(id, language, rowSize, directoryName, fileExtension) {

View file

@ -36,12 +36,6 @@ class ZLTextStyleEntry;
class ZLTextModel { class ZLTextModel {
public:
enum Kind {
PLAIN_TEXT_MODEL,
TREE_MODEL,
};
protected: protected:
ZLTextModel(const std::string &id, const std::string &language, const size_t rowSize, ZLTextModel(const std::string &id, const std::string &language, const size_t rowSize,
const std::string &directoryName, const std::string &fileExtension); const std::string &directoryName, const std::string &fileExtension);
@ -50,7 +44,6 @@ protected:
public: public:
virtual ~ZLTextModel(); virtual ~ZLTextModel();
virtual Kind kind() const = 0;
const std::string &id() const; const std::string &id() const;
const std::string &language() const; const std::string &language() const;
@ -121,27 +114,9 @@ public:
const std::string &directoryName, const std::string &fileExtension); const std::string &directoryName, const std::string &fileExtension);
ZLTextPlainModel(const std::string &id, const std::string &language, ZLTextPlainModel(const std::string &id, const std::string &language,
shared_ptr<ZLCachedMemoryAllocator> allocator); shared_ptr<ZLCachedMemoryAllocator> allocator);
Kind kind() const;
void createParagraph(ZLTextParagraph::Kind kind); void createParagraph(ZLTextParagraph::Kind kind);
}; };
class ZLTextTreeModel : public ZLTextModel {
public:
ZLTextTreeModel(const std::string &id, const std::string &language,
const std::string &directoryName, const std::string &fileExtension);
~ZLTextTreeModel();
Kind kind() const;
ZLTextTreeParagraph *createParagraph(ZLTextTreeParagraph *parent = 0);
void search(const std::string &text, size_t startIndex, size_t endIndex, bool ignoreCase) const;
void selectParagraph(size_t index) const;
private:
ZLTextTreeParagraph *myRoot;
};
inline const std::string &ZLTextModel::id() const { return myId; } inline const std::string &ZLTextModel::id() const { return myId; }
inline const std::string &ZLTextModel::language() const { return myLanguage; } inline const std::string &ZLTextModel::language() const { return myLanguage; }
inline size_t ZLTextModel::paragraphsNumber() const { return myParagraphs.size(); } inline size_t ZLTextModel::paragraphsNumber() const { return myParagraphs.size(); }
@ -162,8 +137,4 @@ inline const ZLTextParagraph *ZLTextModel::operator [] (size_t index) const {
return myParagraphs[std::min(myParagraphs.size() - 1, index)]; return myParagraphs[std::min(myParagraphs.size() - 1, index)];
} }
inline ZLTextModel::Kind ZLTextPlainModel::kind() const { return PLAIN_TEXT_MODEL; }
inline ZLTextModel::Kind ZLTextTreeModel::kind() const { return TREE_MODEL; }
#endif /* __ZLTEXTMODEL_H__ */ #endif /* __ZLTEXTMODEL_H__ */

View file

@ -239,32 +239,3 @@ size_t ZLTextParagraph::characterNumber() const {
return len; return len;
} }
*/ */
ZLTextTreeParagraph::ZLTextTreeParagraph(ZLTextTreeParagraph *parent) : myIsOpen(false), myParent(parent) {
if (parent != 0) {
parent->addChild(this);
myDepth = parent->myDepth + 1;
} else {
myDepth = 0;
}
}
void ZLTextTreeParagraph::openTree() {
for (ZLTextTreeParagraph *p = parent(); p != 0; p = p->parent()) {
p->open(true);
}
}
void ZLTextTreeParagraph::removeFromParent() {
if (myParent != 0) {
myParent->myChildren.erase(std::find(myParent->myChildren.begin(), myParent->myChildren.end(), this));
}
}
int ZLTextTreeParagraph::fullSize() const {
int size = 1;
for (std::vector<ZLTextTreeParagraph*>::const_iterator it = myChildren.begin(); it != myChildren.end(); ++it) {
size += (*it)->fullSize();
}
return size;
}

View file

@ -222,34 +222,6 @@ private:
friend class ZLTextPlainModel; friend class ZLTextPlainModel;
}; };
class ZLTextTreeParagraph : public ZLTextParagraph {
public:
ZLTextTreeParagraph(ZLTextTreeParagraph *parent = 0);
~ZLTextTreeParagraph();
Kind kind() const;
bool isOpen() const;
void open(bool o);
void openTree();
int depth() const;
ZLTextTreeParagraph *parent();
const ZLTextTreeParagraph *parent() const;
const std::vector<ZLTextTreeParagraph*> &children() const;
int fullSize() const;
void removeFromParent();
private:
void addChild(ZLTextTreeParagraph *child);
private:
bool myIsOpen;
int myDepth;
ZLTextTreeParagraph *myParent;
std::vector<ZLTextTreeParagraph*> myChildren;
};
inline ZLTextParagraphEntry::ZLTextParagraphEntry() {} inline ZLTextParagraphEntry::ZLTextParagraphEntry() {}
inline ZLTextParagraphEntry::~ZLTextParagraphEntry() {} inline ZLTextParagraphEntry::~ZLTextParagraphEntry() {}
@ -295,14 +267,4 @@ inline ZLTextSpecialParagraph::ZLTextSpecialParagraph(Kind kind) : myKind(kind)
inline ZLTextSpecialParagraph::~ZLTextSpecialParagraph() {} inline ZLTextSpecialParagraph::~ZLTextSpecialParagraph() {}
inline ZLTextParagraph::Kind ZLTextSpecialParagraph::kind() const { return myKind; } inline ZLTextParagraph::Kind ZLTextSpecialParagraph::kind() const { return myKind; }
inline ZLTextTreeParagraph::~ZLTextTreeParagraph() {}
inline ZLTextParagraph::Kind ZLTextTreeParagraph::kind() const { return TREE_PARAGRAPH; }
inline bool ZLTextTreeParagraph::isOpen() const { return myIsOpen; }
inline void ZLTextTreeParagraph::open(bool o) { myIsOpen = o; }
inline int ZLTextTreeParagraph::depth() const { return myDepth; }
inline ZLTextTreeParagraph *ZLTextTreeParagraph::parent() { return myParent; }
inline const ZLTextTreeParagraph *ZLTextTreeParagraph::parent() const { return myParent; }
inline const std::vector<ZLTextTreeParagraph*> &ZLTextTreeParagraph::children() const { return myChildren; }
inline void ZLTextTreeParagraph::addChild(ZLTextTreeParagraph *child) { myChildren.push_back(child); }
#endif /* __ZLTEXTPARAGRAPH_H__ */ #endif /* __ZLTEXTPARAGRAPH_H__ */

View file

@ -90,7 +90,8 @@
-keepclassmembers class org.geometerplus.fbreader.bookmodel.NativeBookModel { -keepclassmembers class org.geometerplus.fbreader.bookmodel.NativeBookModel {
public ** Book; public ** Book;
public void initInternalHyperlinks(**,**,int); public void initInternalHyperlinks(**,**,int);
public void initTOC(**,int[],int[]); public void addTOCItem(**,int);
public void leaveTOCItem();
public ** createTextModel(**,**,int,int[],int[],int[],int[],byte[],**,**,int); public ** createTextModel(**,**,int,int[],int[],int[],int[],byte[],**,**,int);
public void setBookTextModel(**); public void setBookTextModel(**);
public void setFootnoteModel(**); public void setFootnoteModel(**);

View file

@ -36,49 +36,18 @@ public class NativeBookModel extends BookModelImpl {
myInternalHyperlinks = new CachedCharStorageRO(directoryName, fileExtension, blocksNumber); myInternalHyperlinks = new CachedCharStorageRO(directoryName, fileExtension, blocksNumber);
} }
public void initTOC(ZLTextModel contentsModel, int[] childrenNumbers, int[] referenceNumbers) { private TOCTree myCurrentTree = TOCTree;
try {
final StringBuilder buffer = new StringBuilder();
final ArrayList<Integer> positions = new ArrayList<Integer>(); public void addTOCItem(String text, int reference) {
TOCTree tree = TOCTree; myCurrentTree = new TOCTree(myCurrentTree);
myCurrentTree.setText(text);
final int size = contentsModel.getParagraphsNumber(); myCurrentTree.setReference(myBookTextModel, reference);
for (int pos = 0; pos < size; ++pos) {
positions.add(pos);
ZLTextParagraph par = contentsModel.getParagraph(pos);
buffer.delete(0, buffer.length());
ZLTextParagraph.EntryIterator it = par.iterator();
while (it.hasNext()) {
it.next();
if (it.getType() == ZLTextParagraph.Entry.TEXT) {
buffer.append(it.getTextData(), it.getTextOffset(), it.getTextLength());
}
} }
tree = new TOCTree(tree); public void leaveTOCItem() {
tree.setText(buffer.toString()); myCurrentTree = myCurrentTree.Parent;
tree.setReference(myBookTextModel, referenceNumbers[pos]); if (myCurrentTree == null) {
myCurrentTree = TOCTree;
while (positions.size() > 0 && tree != TOCTree) {
final int lastIndex = positions.size() - 1;
final int treePos = positions.get(lastIndex);
if (tree.subTrees().size() < childrenNumbers[treePos]) {
break;
}
tree = tree.Parent;
positions.remove(lastIndex);
}
}
if (tree != TOCTree || positions.size() > 0) {
throw new RuntimeException("Invalid state after TOC building:\n"
+ "tree.Level = " + tree.Level + "\n"
+ "positions.size() = " + positions.size());
}
} catch (Exception e) {
e.printStackTrace();
} }
} }