package client.net.sf.saxon.ce.trans.update; import client.net.sf.saxon.ce.expr.XPathContext; import com.google.gwt.dom.client.Node; import com.google.gwt.dom.client.NodeList; /** * A pending update action representing the effect of an insert expression */ public class InsertAction extends PendingUpdateAction { private Node content; private Node targetNode; private int position; public static final int FIRST = 0; public static final int LAST = 1; public static final int BEFORE = 2; public static final int AFTER = 3; /** * Create an InsertAction * @param content an HTML document node whose children represent the content sequence to be inserted * @param targetNode the node that defines where the new nodes will be inserted * @param position defines where the nodes will be inserted: before or after the target node, or as the first * or last child of the target node. */ public InsertAction(Node content, Node targetNode, int position) { this.content = content; this.targetNode = targetNode; this.position = position; } /** * Apply the pending update action to the affected nodes * * @param context the XPath evaluation context */ public void apply(XPathContext context) { switch (position) { case FIRST: { NodeList list = content.getChildNodes(); int count = list.getLength(); for (int i=count-1; i>=0; i--) { targetNode.insertFirst(list.getItem(i)); } break; } case LAST:{ while (content.hasChildNodes()) { targetNode.appendChild(content.getFirstChild()); } break; } case BEFORE: { Node refNode = targetNode.getChild(position); NodeList list = content.getChildNodes(); int count = list.getLength(); for (int i=0; i < count; i++) { targetNode.insertBefore(list.getItem(i), refNode); } break; } case AFTER: { Node refNode = targetNode.getChild(position); NodeList list = content.getChildNodes(); int count = list.getLength(); for (int i=count-1; i>=0; i--) { targetNode.insertAfter(list.getItem(i), refNode); } break; } default: throw new UnsupportedOperationException("Unknown insert position " + position); } } /** * Get the target node of the update action * @return the target node, the node to which this update action applies. Returns null in the * case of a delete action, which affects multiple nodes. */ public Node getTargetNode() { return targetNode; } } // This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. // If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. // This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.