package nota.oxygen.common.notes;
import nota.oxygen.common.BaseAuthorOperation;
import nota.oxygen.common.Utils;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
import ro.sync.ecss.extensions.api.ArgumentDescriptor;
import ro.sync.ecss.extensions.api.ArgumentsMap;
import ro.sync.ecss.extensions.api.AuthorConstants;
import ro.sync.ecss.extensions.api.AuthorDocumentController;
import ro.sync.ecss.extensions.api.AuthorOperationException;
import ro.sync.ecss.extensions.api.node.AuthorElement;
/**
* Markup a nota and search for references to it.
* @author OHA
*
*/
public class MarkupNoteOperation extends BaseAuthorOperation {
@Override
public String getDescription() {
return "Does note and noteref markup";
}
@Override
protected void doOperation() throws AuthorOperationException {
try {
AuthorDocumentController docCtrl = getAuthorAccess().getDocumentController();
int startSel = getSelectionStart();
int endSel = getSelectionEnd();
AuthorElement firstAthElem = (AuthorElement)docCtrl.getNodeAtOffset(startSel+1);
AuthorElement lastAthElem = (AuthorElement)docCtrl.getNodeAtOffset(endSel-1);
if (firstAthElem.getParent()!=lastAthElem.getParent()) {
String msg = "Selected nodes are not siblings:\n";
msg += "first element: "+firstAthElem.getLocalName()+"[@id='"+firstAthElem.getAttribute("id")+"']\n";
msg += "last element: "+lastAthElem.getLocalName()+"[@id='"+lastAthElem.getAttribute("id")+"']\n";
showMessage(msg);
return;
}
startSel = firstAthElem.getStartOffset();
endSel = lastAthElem.getEndOffset();
docCtrl.surroundInFragment(noteFragment, startSel, endSel);
AuthorElement note = getElementAtOffset(getAuthorAccess().getEditorAccess().getBalancedSelectionStart());
tryToFindNoteIdentifier(note);
getAuthorAccess().getEditorAccess().setCaretPosition(note.getEndOffset()-2);
}
catch (AuthorOperationException e) {
throw e;
}
catch (Exception e) {
throw new AuthorOperationException(
"Unexpected "+e.getClass().getName()+"occured: "+e.getMessage(),
e);
}
}
private void tryToFindNoteIdentifier(AuthorElement note) throws AuthorOperationException {
if (note==null) return;
Element noteElem = Utils.deserializeElement(serialize(note));
Node firstChildElement = noteElem.getFirstChild();
if (firstChildElement==null) return;
if (firstChildElement.getNodeType()!=Node.ELEMENT_NODE) return;
Node firstText = firstChildElement.getFirstChild();
if (firstText==null) return;
if (firstText.getNodeType()!=Node.TEXT_NODE) return;
if (firstText.getTextContent().trim().isEmpty()) return;
firstChildElement.removeChild(firstText);
Element noteIdentifierElement = (Element)noteElem.getOwnerDocument().importNode( Utils.deserializeElement(noteIdentifierFragment), true);
String text = firstText.getTextContent();
if (text.indexOf(' ')!=-1) {
Text restTextNode = noteElem.getOwnerDocument().createTextNode(text.substring(text.indexOf(' ')));
firstChildElement.insertBefore(restTextNode, firstChildElement.getFirstChild());
text = text.substring(0, text.indexOf(' '));
}
noteIdentifierElement.insertBefore(noteElem.getOwnerDocument().createTextNode(text), noteIdentifierElement.getFirstChild());
firstChildElement.insertBefore(noteIdentifierElement, firstChildElement.getFirstChild());
AuthorDocumentController docCtrl = getAuthorAccess().getDocumentController();
docCtrl.insertXMLFragment(Utils.serialize(noteElem), note, AuthorConstants.POSITION_BEFORE);
docCtrl.deleteNode(note);
}
private static String ARG_NOTE_FRAGMENT = "note fragment";
private String noteFragment;
private static String ARG_NOTE_IDENTIFIER_FRAGMENT = "note identifier fragment";
private String noteIdentifierFragment;
@Override
public ArgumentDescriptor[] getArguments() {
return new ArgumentDescriptor[] {
new ArgumentDescriptor(ARG_NOTE_FRAGMENT, ArgumentDescriptor.TYPE_FRAGMENT, "The note fragment"),
new ArgumentDescriptor(ARG_NOTE_IDENTIFIER_FRAGMENT, ArgumentDescriptor.TYPE_FRAGMENT, "The note identifier fragment"),
};
}
@Override
protected void parseArguments(ArgumentsMap args)
throws IllegalArgumentException {
noteFragment = (String)args.getArgumentValue(ARG_NOTE_FRAGMENT);
noteIdentifierFragment = (String)args.getArgumentValue(ARG_NOTE_IDENTIFIER_FRAGMENT);
}
}