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

a workaround to fix an exception in initTOC

This commit is contained in:
Nikolay Pultsin 2012-03-29 20:24:02 +01:00
parent 85a23bc67a
commit 297f9aa6f9
2 changed files with 35 additions and 32 deletions

View file

@ -255,8 +255,7 @@ JNIEXPORT jboolean JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPl
} }
model->flush(); model->flush();
if (!initInternalHyperlinks(env, javaModel, *model) || if (!initInternalHyperlinks(env, javaModel, *model) || !initTOC(env, javaModel, *model)) {
!initTOC(env, javaModel, *model)) {
return JNI_FALSE; return JNI_FALSE;
} }

View file

@ -37,38 +37,42 @@ public class NativeBookModel extends BookModelImpl {
} }
public void initTOC(ZLTextModel contentsModel, int[] childrenNumbers, int[] referenceNumbers) { public void initTOC(ZLTextModel contentsModel, int[] childrenNumbers, int[] referenceNumbers) {
final StringBuilder buffer = new StringBuilder(); try {
final StringBuilder buffer = new StringBuilder();
final ArrayList<Integer> positions = new ArrayList<Integer>(); final ArrayList<Integer> positions = new ArrayList<Integer>();
TOCTree tree = TOCTree; TOCTree tree = TOCTree;
final int size = contentsModel.getParagraphsNumber(); final int size = contentsModel.getParagraphsNumber();
for (int pos = 0; pos < size; ++pos) { for (int pos = 0; pos < size; ++pos) {
positions.add(pos); positions.add(pos);
ZLTextParagraph par = contentsModel.getParagraph(pos); ZLTextParagraph par = contentsModel.getParagraph(pos);
buffer.delete(0, buffer.length()); buffer.delete(0, buffer.length());
ZLTextParagraph.EntryIterator it = par.iterator(); ZLTextParagraph.EntryIterator it = par.iterator();
while (it.hasNext()) { while (it.hasNext()) {
it.next(); it.next();
if (it.getType() == ZLTextParagraph.Entry.TEXT) { if (it.getType() == ZLTextParagraph.Entry.TEXT) {
buffer.append(it.getTextData(), it.getTextOffset(), it.getTextLength()); buffer.append(it.getTextData(), it.getTextOffset(), it.getTextLength());
}
}
tree = new TOCTree(tree);
tree.setText(buffer.toString());
tree.setReference(myBookTextModel, referenceNumbers[pos]);
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);
} }
} }
} catch (Exception e) {
tree = new TOCTree(tree); e.printStackTrace();
tree.setText(buffer.toString());
tree.setReference(myBookTextModel, referenceNumbers[pos]);
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) { if (tree != TOCTree || positions.size() > 0) {