| /******************************************************************************* |
| * Copyright (c) 2006 Sybase, Inc. and others. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Sybase, Inc. - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.pagedesigner.commands.range; |
| |
| import org.eclipse.gef.GraphicalViewer; |
| import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants; |
| import org.eclipse.jst.pagedesigner.dom.DOMPosition; |
| import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper; |
| import org.eclipse.jst.pagedesigner.dom.DOMRange; |
| import org.eclipse.jst.pagedesigner.dom.DOMRefPosition; |
| import org.eclipse.jst.pagedesigner.dom.DOMUtil; |
| import org.eclipse.jst.pagedesigner.dom.EditModelQuery; |
| import org.eclipse.jst.pagedesigner.dom.IDOMPosition; |
| import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.Text; |
| |
| /** |
| * InsertEdit will perform action at a single location, the data souce could be |
| * clipboard or keyboard. |
| * |
| * @author mengbo |
| */ |
| public class InsertEdit extends DeleteEdit { |
| private IInputSourceProvider _data; |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate() |
| */ |
| public boolean operate() { |
| DOMRange range = getRange(); |
| if (!EditModelQuery.isSame(range.getStartPosition(), range |
| .getEndPosition())) { |
| deleteRange(); |
| range = new DOMRange(getOperationPosition(), getOperationPosition()); |
| setRange(range); |
| } |
| if (insertNodes()) { |
| return true; |
| } else if (insertString()) { |
| return true; |
| } else { |
| return insertChar(); |
| } |
| } |
| |
| /** |
| * @param range |
| * @param viewer |
| * @param data |
| */ |
| public InsertEdit(DOMRange range, GraphicalViewer viewer, |
| IInputSourceProvider data) { |
| super(range, viewer); |
| _data = data; |
| } |
| |
| /** |
| * @param position |
| * @param viewer |
| * @param data |
| */ |
| public InsertEdit(IDOMPosition position, GraphicalViewer viewer, |
| IInputSourceProvider data) { |
| super(new DOMRange(position, position), viewer); |
| setOperationPosition(position); |
| _data = data; |
| } |
| |
| /** |
| * @return ?? |
| */ |
| public boolean insertChar() { |
| if (_data.getStringData() == null) { |
| return false; |
| } |
| IDOMPosition position = getOperationPosition(); |
| if (position.isText()) { |
| Text text = EditModelQuery.getInstance().getText(position); |
| text.insertData(getOperationPosition().getOffset(), _data |
| .getCharacterData().toString()); |
| setOperationPosition(new DOMPosition(text, position.getOffset() + 1)); |
| } else { |
| Node refNode = position.getNextSiblingNode(); |
| Text text = getDocument().createTextNode(_data.getCharacterData() |
| .toString()); |
| position.getContainerNode().insertBefore(text, refNode); |
| setOperationPosition(new DOMPosition(text, text.getLength())); |
| } |
| return true; |
| } |
| |
| /** |
| * @return ???? |
| */ |
| public boolean insertString() { |
| String content = _data.getStringData(); |
| if (content != null) { |
| IDOMPosition position = getOperationPosition(); |
| if (position.isText()) { |
| Text text = EditModelQuery.getInstance().getText(position); |
| text.insertData(getOperationPosition().getOffset(), content); |
| setOperationPosition(new DOMPosition(text, position.getOffset() |
| + content.length())); |
| } else { |
| Node refNode = position.getNextSiblingNode(); |
| Text text = getDocument().createTextNode(content); |
| position.getContainerNode().insertBefore(text, refNode); |
| setOperationPosition(new DOMPosition(text, text.getLength())); |
| } |
| return true; |
| } |
| return false; |
| } |
| |
| private boolean insertNodes() { |
| Node[] nodes = _data.getNodes(); |
| if (nodes == null) { |
| return false; |
| } |
| IDOMPosition position = getOperationPosition(); |
| if (position == null) { |
| return false; |
| } |
| Node refNode = null; |
| if (position.isText()) { |
| position = DOMPositionHelper.splitText(position); |
| } |
| refNode = position.getNextSiblingNode(); |
| Node parent = position.getContainerNode(); |
| Node node = null; |
| for (int i = 0; i < nodes.length; i++) { |
| node = DOMUtil.cloneNodeDeep(getDocument(), nodes[i]); |
| String prefix = node.getPrefix(); |
| String name = node.getLocalName(); |
| if (name != null |
| && ITLDConstants.URI_JSP.equals(prefix) |
| && (node.getLocalName().startsWith( |
| IJSPCoreConstants.TAG_LEADING_DIRECTIVE) |
| || IJSPCoreConstants.TAG_DECLARATION.equals(name) |
| || IJSPCoreConstants.TAG_EXPRESSION.equals(name) || IJSPCoreConstants.TAG_SCRIPTLET |
| .equals(name))) { |
| // it is a jsp tag |
| ((IDOMElement) node).setJSPTag(true); |
| } |
| node = parent.insertBefore(node, refNode); |
| } |
| |
| if (node != null) { |
| setOperationPosition(new DOMRefPosition(node, true)); |
| } else if (refNode != null) { |
| setOperationPosition(new DOMRefPosition(refNode, false)); |
| } else { |
| setOperationPosition(new DOMRefPosition(parent.getLastChild(), true)); |
| } |
| return true; |
| } |
| |
| // TODO: dead? |
| // private boolean splitNode() { |
| // if ((getViewer()).getSelection() instanceof DesignRange |
| // && _data.getCharacterData() != null |
| // && _data.getCharacterData().charValue() == '\r') { |
| // DesignRange range = (DesignRange) (getViewer()).getSelection(); |
| // Node node = range.getStartPosition().getContainerNode(); |
| // if (EditModelQuery.isText(node)) { |
| // node = node.getParentNode(); |
| // } |
| // if (EditModelQuery.isListItem(node)) { |
| // IDOMPosition position = DOMPositionHelper.toDOMPosition(range |
| // .getStartPosition()); |
| // // split text and it's parent. |
| // position = EditHelper.splitNode(position); |
| // position = EditHelper.splitNode(position); |
| // position = EditHelper.moveInto(position.getNextSiblingNode(), |
| // new InlineEditingNavigationMediator(new ActionData( |
| // ActionData.INLINE_EDIT, null)), true); |
| // setOperationPosition(position); |
| // return true; |
| // } |
| // } |
| // return false; |
| // } |
| } |