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

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

/*******************************************************************************
* 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.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
import org.eclipse.jst.pagedesigner.dom.DOMRange;
import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
import org.eclipse.jst.pagedesigner.viewer.DesignRange;
import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
import org.w3c.dom.Node;

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

  DOMRange _resultRange = null;

  /**
   * @param label
   * @param viewer
   */
  public RangeModeCommand(String label, IHTMLGraphicalViewer viewer) {
    super(label, viewer);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#prePreExecute()
   */
  protected boolean prePreExecute() {
    int position = -1;
    int length = -1;
    ISelection selection = getViewer().getSelection();
    if (selection != null) {
      if (getViewer().isInRangeMode()) {
        DesignRange range = (DesignRange) selection;
        if (range.isValid()) {
          IDOMPosition domPos = DOMPositionHelper.toDOMPosition(range
              .getStartPosition());
          IDOMPosition domEnd = DOMPositionHelper.toDOMPosition(range
              .getEndPosition());
          if (!EditValidateUtil.validPosition(domPos)
              || !EditValidateUtil.validPosition(domEnd)) {
            return false;
          }
          position = EditModelQuery.getIndexedRegionLocation(domPos);
          int end = EditModelQuery.getIndexedRegionLocation(domEnd);
          if (end < position) {
            length = position - end;
            position = end;
          } else {
            length = end - position;
          }
        }
      } else {
        Object object = ((IStructuredSelection) selection)
            .getFirstElement();
        if (object instanceof ElementEditPart) {
          Node node = ((ElementEditPart) object).getIDOMNode();
          position = EditModelQuery.getNodeStartIndex(node);
          length = EditModelQuery.getNodeLenth(node);
        } else {
          return false;
        }
      }
      if (position >= 0 && length >= 0) {
        getModel().beginRecording(this, getLabel(), position, length);
      } else {
        getModel().beginRecording(this, getLabel());
      }
      getViewer().startSelectionChange();
      getModel().aboutToChangeModel();
      return true;
    }
        return false;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
   */
  protected final void doExecute() {
    DesignRange range = getViewer().getRangeSelection();
    if (range != null && range.isValid()) {
      DOMRange domrange = (range == null || !range.isValid()) ? null
          : toDOMRange(range);
      _resultRange = doRangeExecute(domrange);
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
   */
  protected final ISelection getAfterCommandDesignerSelection() {
//    try {
      if (_resultRange == null) {
        return null;
      }
      IDOMPosition startPos = _resultRange.getStartPosition();
      DesignPosition start = DOMPositionHelper.toDesignPosition(startPos);
      if (_resultRange.isEmpty()) {
        return new DesignRange(start, start);
      }
            IDOMPosition endPos = _resultRange.getEndPosition();
            return new DesignRange(start, DOMPositionHelper
                .toDesignPosition(endPos));
            // TODO: don't know what this exception catch is for
//    } catch (Exception e) {
//      // "Selection error"
//      _log.error("Error.RangeModeCommand.SetSelection"); //$NON-NLS-1$
//      return null;
//    }
  }

  /**
   * @param range
   * @return
   */
  private DOMRange toDOMRange(DesignRange range) {
    return new DOMRange(DOMPositionHelper.toDOMPosition(range
        .getStartPosition()), DOMPositionHelper.toDOMPosition(range
        .getEndPosition()));
  }

  /**
   * In the implementation of this method, should not do anything relating to
   * EditPart. (maybe even not ICSSStyle, since not style information not
   * refreshed yet)
   * @param selection
   *
   * @return null means no change have been done to the model. In this case,
   *         system may choose to cancel undo recorrding, etc.
   */
  protected abstract DOMRange doRangeExecute(DOMRange selection);

  /**
   * @param parent
   * @param ref
   * @param child
   */
  protected static void appendChild(Node parent, Node ref, Node child) {
    Node next = ref.getNextSibling();
    if (next == null)
      parent.appendChild(child);
    else
      parent.insertBefore(child, next);
  }
}
TOP

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

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.