Package org.eclipse.jst.pagedesigner.commands.range

Source Code of org.eclipse.jst.pagedesigner.commands.range.InsertEdit

/*******************************************************************************
* 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;
//  }
}
TOP

Related Classes of org.eclipse.jst.pagedesigner.commands.range.InsertEdit

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.