90 lines
2.5 KiB
Java
90 lines
2.5 KiB
Java
package pro.litvinovg.libreoffice.metadata;
|
|
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
|
|
import com.sun.star.text.XParagraphCursor;
|
|
import com.sun.star.text.XText;
|
|
import com.sun.star.text.XTextCursor;
|
|
import com.sun.star.text.XTextRange;
|
|
import com.sun.star.uno.UnoRuntime;
|
|
import static pro.litvinovg.libreoffice.metadata.MetadataElementFactory.*;
|
|
|
|
public class OutlineElement {
|
|
|
|
private String name;
|
|
private ArrayList<MetadataElement> metadataElements = null;
|
|
|
|
public String getName() {
|
|
return name;
|
|
}
|
|
|
|
private XTextRange textRange;
|
|
private boolean hasMetadataStorage = false;
|
|
private XTextRange metadataTextRange = null;
|
|
|
|
public OutlineElement(XTextRange textRange) {
|
|
this.textRange = textRange;
|
|
this.name = textRange.getString();
|
|
getMetadataStorage();
|
|
}
|
|
|
|
private void getMetadataStorage() {
|
|
XText curText = textRange.getText();
|
|
XTextCursor cursor = curText.createTextCursorByRange(textRange);
|
|
XParagraphCursor paraCursor = UnoRuntime.queryInterface(XParagraphCursor.class, cursor);
|
|
readMetadataBody(paraCursor);
|
|
if (metadataElements == null) {
|
|
metadataElements = new ArrayList<MetadataElement>();
|
|
}
|
|
}
|
|
|
|
private void readMetadataBody(XParagraphCursor paraCursor) {
|
|
String cursorContent = getNextParaContent(paraCursor);
|
|
|
|
if (! cursorContent.equals(METADATA_START)){
|
|
System.out.println("Para doesn't have metadata start header" + cursorContent);
|
|
return;
|
|
}
|
|
ArrayList<MetadataElement> metadataTempElements = new ArrayList<MetadataElement>();
|
|
cursorContent = getNextParaContent(paraCursor);
|
|
while (cursorContent.startsWith(METADATA_PREFIX)) {
|
|
if (cursorContent.equals(METADATA_END)) {
|
|
metadataElements = metadataTempElements;
|
|
return;
|
|
}
|
|
if (MetadataElementFactory.isValidMetadataString(cursorContent)) {
|
|
MetadataElement metadataElement = null;
|
|
try {
|
|
metadataElement = MetadataElementFactory.fromString(cursorContent);
|
|
} catch (ClassNotFoundException e) {
|
|
e.printStackTrace();
|
|
return;
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
return;
|
|
}
|
|
metadataTempElements.add(metadataElement);
|
|
} else {
|
|
//If reading fails exit immediately
|
|
return;
|
|
}
|
|
cursorContent = getNextParaContent(paraCursor);
|
|
}
|
|
|
|
}
|
|
|
|
private String getNextParaContent(XParagraphCursor paraCursor) {
|
|
boolean moved = paraCursor.gotoNextParagraph(false);
|
|
if (moved == false) {
|
|
return "";
|
|
}
|
|
moved = paraCursor.gotoEndOfParagraph(true);
|
|
if (moved == false) {
|
|
return "";
|
|
}
|
|
String cursorContent = paraCursor.getString();
|
|
return cursorContent;
|
|
}
|
|
|
|
}
|