blob: 07ce127c189e3cc94963c03dacba7bd0e2c7d51d [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.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);
}
}