package nota.oxygen.common.list; import java.util.List; import nota.oxygen.common.BaseAuthorOperation; import nota.oxygen.common.Utils; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import ro.sync.ecss.extensions.api.ArgumentDescriptor; import ro.sync.ecss.extensions.api.ArgumentsMap; import ro.sync.ecss.extensions.api.AuthorDocumentController; import ro.sync.ecss.extensions.api.AuthorOperationException; import ro.sync.ecss.extensions.api.node.AuthorElement; import ro.sync.ecss.extensions.api.node.AuthorNode; /** * Outdents lists by replacing the list with it's items * * @author Ole Holst Andersen (oha@nota.nu) */ public class OutdentListOperation extends BaseAuthorOperation { @Override protected void doOperation() throws AuthorOperationException { try { AuthorDocumentController docCtrl = getAuthorAccess().getDocumentController(); AuthorElement list = getNamedCommonParentElementOfSelection(listElement, null); List<AuthorNode> items = list.getContentNodes(); //showMessage(list.getParent().getName()+"=="+itemElement); if (list.getParent().getName().equals(itemElement)) { AuthorElement parentLiAElem = (AuthorElement)list.getParent(); int index = parentLiAElem.getContentNodes().indexOf(list); if (items.size()>0) { Element parentLiElem = Utils.deserializeElement(serialize(parentLiAElem)); Element listElem = (Element)parentLiElem.getChildNodes().item(index); String xml = ""; NodeList listChildren = listElem.getChildNodes(); for (int i=0; i<listChildren.getLength(); i++) { xml += Utils.serialize(listChildren.item(i)); } parentLiElem.removeChild(listElem); if (parentLiElem.getChildNodes().getLength()>0) { xml = Utils.serialize(parentLiElem) + xml; } docCtrl.deleteNode(parentLiAElem); docCtrl.insertXMLFragment(xml, getAuthorAccess().getEditorAccess().getCaretOffset()); } } else { Element listElem = Utils.deserializeElement(serialize(list)); NodeList listChildren = listElem.getChildNodes(); String xml = ""; for (int i=0; i<listChildren.getLength(); i++) { Node node = listChildren.item(i); if (node.getLocalName().equals(itemElement)) { Element repl = listElem.getOwnerDocument().createElementNS(listElem.getNamespaceURI(), itemReplacementElement); NodeList liChildren = listChildren.item(i).getChildNodes(); for (int j=0; j<liChildren.getLength(); j++) { repl.appendChild(liChildren.item(j).cloneNode(true)); } xml += Utils.serialize(repl); } else { xml += Utils.serialize(node); } } docCtrl.deleteNode(list); docCtrl.insertXMLFragment(xml, getAuthorAccess().getEditorAccess().getCaretOffset()); } } catch (AuthorOperationException e) { throw e; } catch (Exception e) { String msg = "Unexpected "+e.getClass().getName() +" occured in "+getClass().getName()+".doOperation:\n" + e.getMessage(); throw new AuthorOperationException(msg, e); } } @Override protected void parseArguments(ArgumentsMap args) throws IllegalArgumentException { listElement = (String)args.getArgumentValue(ARG_LIST_ELEMENT); itemElement = (String)args.getArgumentValue(ARG_ITEM_ELEMENT); itemReplacementElement = (String)args.getArgumentValue(ARG_ITEM_REPLACEMENT_ELEMENT); } private static String ARG_LIST_ELEMENT = "list element"; private static String ARG_ITEM_ELEMENT = "item element"; private static String ARG_ITEM_REPLACEMENT_ELEMENT = "item replacement element"; private String listElement; private String itemElement; private String itemReplacementElement; @Override public ArgumentDescriptor[] getArguments() { return new ArgumentDescriptor[] { new ArgumentDescriptor(ARG_LIST_ELEMENT, ArgumentDescriptor.TYPE_STRING, "list element name"), new ArgumentDescriptor(ARG_ITEM_ELEMENT, ArgumentDescriptor.TYPE_STRING, "item element name"), new ArgumentDescriptor(ARG_ITEM_REPLACEMENT_ELEMENT, ArgumentDescriptor.TYPE_STRING, "item replacement element name") }; } @Override public String getDescription() { // TODO Auto-generated method stub return "Outdent list items"; } }