/******************************************************************************* * 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.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.IDOMPosition; import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer; import org.w3c.dom.Text; /** * This command can used to handle things like "paste". Or keyboard printable * ascii key. Note: ENTER key is not handled here. * * @author mengbo */ // FIXME: \r \n in the content string is not handled. public class ContentCommand extends RangeModeCommand { private String _content; /** * @param viewer * @param content */ public ContentCommand(IHTMLGraphicalViewer viewer, String content) { super("", viewer); //$NON-NLS-1$ _content = content; } /** * @param viewer * @param c */ public ContentCommand(IHTMLGraphicalViewer viewer, char c) { super("", viewer); //$NON-NLS-1$ _content = String.valueOf(c); } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute() */ protected DOMRange doRangeExecute(DOMRange range) { if (range == null) return null; IDOMPosition position = DOMPositionHelper.removeRange(range); position = doContent(position); return new DOMRange(position, position); } /** * @param position * @return ?? */ protected IDOMPosition doContent(IDOMPosition position) { position = DOMPositionHelper.mergeIntoText(position); if (position.getContainerNode() instanceof Text) { Text text = (Text) position.getContainerNode(); String data = text.getData(); int offset = position.getOffset(); String newData = data.substring(0, offset) + _content + data.substring(offset); text.setData(newData); return new DOMPosition(text, offset + _content.length()); } // we need to create a text node. Text text = getDocument().createTextNode(_content); position.getContainerNode().insertBefore(text, position.getNextSiblingNode()); return new DOMRefPosition(text, true); } // protected DesignPosition doContent() // { // // DesignPosition position = removeRange(); // DesignPosition position = this.getSelectionRange().getEndPosition(); // if ('\r' == _content || '\n' == _content) // { // Element br = getModel().getDocument().createElement("BR"); // Node node = RangeUtil.insertElement(position, br); // // // we need set the new range to the node. // // FIXME: temp code, need to reconsider how to do refresh, when those // editpart // // are recreated. // IDOMNode parent = (IDOMNode) node.getParentNode(); // EditPart parentPart = (EditPart) parent.getAdapterFor(EditPart.class); // List childParts = parentPart.getChildren(); // for (int i=0; i<childParts.size(); i++) // { // if (node == ((EditPart)childParts.get(i)).getModel()) // { // return new DesignPosition(parentPart, i+1); // } // } // return new DesignPosition(parentPart, childParts.size()); // } // else // { // TextPosition textPosition = RangeUtil.insertText(position, // String.valueOf(_content)); // IDOMText text = textPosition.getTextNode(); // EditPart part = (EditPart) text.getAdapterFor(EditPart.class); // return new DesignPosition(part, textPosition.getOffset()); // } // } // }