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

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

/*******************************************************************************
* 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 java.util.Stack;
import java.util.Vector;

import org.eclipse.gef.GraphicalViewer;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
import org.eclipse.jst.pagedesigner.IHTMLConstants;
import org.eclipse.jst.pagedesigner.PDPlugin;
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.EditHelper;
import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
import org.eclipse.jst.pagedesigner.validation.caret.IETablePositionRule;
import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
import org.eclipse.jst.pagedesigner.viewer.LayoutPart;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

/**
* @author mengbo
*/
public class DeleteEdit extends DesignEdit {
  private static final Logger _log = PDPlugin.getLogger(DeleteEdit.class);

  private static final boolean INNER_DEBUG = false;

  private boolean _forward;

  Vector deleted = new Vector();

  /**
   * @param range
   * @param viewer
   * @param forward
   */
  public DeleteEdit(DOMRange range, GraphicalViewer viewer, boolean forward) {
    super(range, viewer);
    _forward = forward;
  }

  /**
   * @param range
   * @param viewer
   */
  public DeleteEdit(DOMRange range, GraphicalViewer viewer) {
    super(range, viewer);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
   */
  protected boolean operate() {
    try {
      boolean result = true;
      if (EditModelQuery.isSame(getRange())) {
        deleteSingle();
      } else {
        deleteRange();
      }
      return result;
    } catch (Exception e) {
      _log.error("Exception", e); //$NON-NLS-1$
      return false;
    }
  }

  /**
   * Delete one node or char at operation position.
   */
  private void deleteSingle() {
    IDOMPosition opPosition = getOperationPosition();
    opPosition = EditHelper.moveToNextEditPosition(getOperationPosition(),
        _forward, new InlineEditingNavigationMediator(new ActionData(
            ActionData.INLINE_EDIT, null)));
    // for inner debug
    if (INNER_DEBUG) {
      _log.info("EditHelper, now we are at:" + opPosition); //$NON-NLS-1$
    }
    if (EditModelQuery.isSame(opPosition, getOperationPosition())) {
      return;
    }
        setRange(new DOMRange(opPosition, getOperationPosition()));
        deleteRange();
  }

  /**
   * @return the stack
   */
  protected Stack deleteRange() {
    WorkNode root = getRootWorkNode();
    Node rootNode = root.getNode();
    Stack result = getProcessedResult();
    collectOtherStyles(rootNode, result);
    return result;
  }

  private boolean isTableComponents(WorkNode node) {
    String name = node.getNode().getNodeName();
    return (IHTMLConstants.TAG_TD.equalsIgnoreCase(name) || //
        IHTMLConstants.TAG_TH.equalsIgnoreCase(name) || //
        IHTMLConstants.TAG_TR.equalsIgnoreCase(name) || //
        IHTMLConstants.TAG_THEAD.equalsIgnoreCase(name) || //
        IHTMLConstants.TAG_TBODY.equalsIgnoreCase(name) || //
    IHTMLConstants.TAG_TFOOT.equalsIgnoreCase(name));
  }

  private Node processContainerTable(WorkNode node) {
    Node result = null;
    if ((isTableComponents(node) || IHTMLConstants.TAG_TABLE
        .equalsIgnoreCase(node.getNode().getNodeName())) //
        && new IETablePositionRule(null).isInValidTable(node
            .getNode())) {
      result = node.getNode().cloneNode(false);
    }
    return result;
  }

  private Node processContainerStyleNodes(WorkNode node) {
    String name = node.getNode().getNodeName();
    Node result = null;
    if (IHTMLConstants.TAG_LI.equalsIgnoreCase(name) || //
        EditModelQuery.HTML_STYLE_NODES.contains(node.getNode()
            .getLocalName())) {
      if (node.getNode().hasChildNodes()) {
        result = node.getNode().cloneNode(false);
      }
    }
    return result;
  }

  private Node processContainerView(WorkNode node) {
    Node result = null;
    if (IJSFConstants.TAG_VIEW.equalsIgnoreCase(node.getNode()
        .getLocalName())) {
      result = EditModelQuery.getDocumentNode(node.getNode())
          .createElement(IJSFConstants.TAG_SUBVIEW);
      result.setPrefix(node.getNode().getPrefix());
    } else if (IHTMLConstants.TAG_BODY.equalsIgnoreCase(node.getNode()
        .getNodeName())
        || IHTMLConstants.TAG_HTML.equalsIgnoreCase(node.getNode()
            .getNodeName())) {
      result = EditModelQuery.getDocumentNode(node.getNode())
          .createElement(node.getNode().getNodeName());
    }
    return result;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processContainer(org.eclipse.jst.pagedesigner.commands.range.WorkNode)
   */
  protected Node processContainer(WorkNode node) {
    Node result = processContainerView(node);
    if (result == null) {
      result = processContainerTable(node);
    }
    if (result == null) {
      result = processContainerStyleNodes(node);
    }
    if (result == null) {
      // strip out container
      if (LayoutPart.getConcreteNode(node.getNode()) != null) {
        Node parent = node.getNode().getParentNode();
        Node refNode = node.getNode();
        Node child = node.getNode().getFirstChild();
        Node first = null, last = null;
        int index = 0;
        NodeList children = node.getNode().getChildNodes();
        int size = children.getLength();
        while (child != null) {
          Node next = child.getNextSibling();
          Node n = EditHelper.deleteNode(child);
          parent.insertBefore(n, refNode);
          if (index == 0) {
            if (refNode != null) {
              first = refNode.getPreviousSibling();
            } else {
              first = parent.getLastChild();
            }
          }
          if (index == size - 1) {
            if (refNode != null) {
              last = refNode.getPreviousSibling();
            } else {
              last = parent.getLastChild();
            }
          }
          index++;
          child = next;
        }
        if (node.getPosOffsets()[0] <= 0) {
          setOperationPosition(new DOMRefPosition(first, false));
        } else {
          setOperationPosition(new DOMRefPosition(last, true));
        }
      } else {
        setOperationPosition(new DOMRefPosition(node.getNode(), false));
      }
      result = EditHelper.deleteNode(node.getNode());
    }
    return result;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processNode(org.w3c.dom.Node,
   *      int[])
   */
  protected Node processNode(WorkNode node) {
    Node result = null;
    if (!isTableComponents(node)
        || !new IETablePositionRule(null).isInValidTable(node
            .getNode())) {
      // it's not table components.
      setOperationPosition(new DOMRefPosition(node.getNode(), false));
      result = EditHelper.deleteNode(node.getNode());
    }
    return result;

  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processText(org.w3c.dom.Text,
   *      int[])
   */
  protected Text processText(WorkNode node) {
    Text currentNode = (Text) node.getNode();
    int[] offsets = node.getPosOffsets();
    Node second = null;
    int location1 = EditHelper.getInstance().getLocation(currentNode,
        node.getPosOffsets()[0], true);
    int location2 = EditHelper.getInstance().getLocation(currentNode,
        node.getPosOffsets()[1], true);
    // left index
    if (currentNode.getData().length() > 0) {
      if (location1 == EditHelper.IN_MIDDLE) {
        IDOMPosition position = new DOMPosition(currentNode, node
            .getPosOffsets()[0]);
        setOperationPosition(position);
        position = DOMPositionHelper.splitText(position);
        Node nnode = position.getNextSiblingNode();
        if (nnode instanceof Text) {
          currentNode = (Text) nnode;
          offsets[1] -= offsets[0] > 0 ? offsets[0] : 0;
        }
      } else {
        // setOperationPosition(new DOMRefPosition(currentNode, false));
        if (currentNode.getPreviousSibling() != null) {
          setOperationPosition(new DOMRefPosition(currentNode
              .getPreviousSibling(), true));
        } else {
          setOperationPosition(new DOMPosition(currentNode
              .getParentNode(), 0));
        }
      }
      // right index
      if (location2 >= EditHelper.IN_MIDDLE) {
        IDOMPosition position = new DOMPosition(currentNode, offsets[1]);
        position = DOMPositionHelper.splitText(position);
        second = position.getPreviousSiblingNode();
      }
      return second != null ? (Text) EditHelper.deleteNode(second) : null;
    }
        setOperationPosition(new DOMRefPosition(currentNode, false));
        return (Text) EditHelper.deleteNode(currentNode);
  }
}
TOP

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

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.