blob: bcf96eb9eca027ad9ec8f12df4146a74565d6646 [file] [log] [blame]
/*******************************************************************************
* 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;
// }
}