metadata-editor/source/pro/litvinovg/libreoffice/metadata/OutlineElement.java
2020-04-09 17:16:38 +02:00

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;
}
}