/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
package net.sourceforge.phpdt.internal.corext.textmanipulation;
import org.eclipse.core.runtime.CoreException;
// import net.sourceforge.phpdt.internal.corext.Assert;
/**
* A text edit that moves text inside a text buffer.
*/
public final class MoveTextEdit extends TextEdit {
/* package */static class TargetMark extends NopTextEdit {
private MoveTextEdit fMoveTextEdit;
public TargetMark(TextRange range, MoveTextEdit edit) {
super(range);
fMoveTextEdit = edit;
}
/* package */MoveTextEdit getMoveTextEdit() {
return fMoveTextEdit;
}
public TextEdit perform(TextBuffer buffer) throws CoreException {
fMoveTextEdit.internalPerform(buffer);
return super.perform(buffer);
}
public TextEdit copy() {
// Assert.isTrue(false, "This should never happen"); //$NON-NLS-1$
return super.copy();
}
}
private TextRange fTarget;
private TextRange fSource;
private int fPerformCounter;
/**
* Creates a new MoveTextEdit
. The text edit doesn't support
* overlapping moves. So for a
* MoveTextEdit
destination <= offset &&
* offset + length - 1 <= destination
* must be true
.
*
* @param offset
* the offset of the text to be moved
* @param length
* the text length to be moved
* @param destination
* the destination offset
*/
public MoveTextEdit(int offset, int length, int destination) {
// Assert.isTrue(destination <= offset || offset + length <=
// destination);
fSource = new TextRange(offset, length);
fTarget = new TextRange(destination);
}
/**
* Creates a new MoveTextEdit
with the given source and
* target range.
*
* @param source
* the source
* @param target
* the target
*/
private MoveTextEdit(TextRange source, TextRange target) {
fSource = source;
fTarget = target;
}
/**
* Returns the move text edit's source range. This method returns the same
* range as TextEdit#getTextRange()
*
* @return the edit's source range
*/
public TextRange getSourceRange() {
return fSource;
}
/**
* Returns the move text edit's target range.
*
* @return the edit's target range
*/
public TextRange getTargetRange() {
return fTarget;
}
/*
* non Java-doc
*
* @see TextEdit#getTextRange()
*/
public TextRange getTextRange() {
return fSource;
}
/*
* non Java-doc
*
* @see TextEdit#connect(TextBufferEditor)
*/
public void connect(TextBufferEditor editor) throws CoreException {
editor.add(new TargetMark(fTarget, this));
}
/*
* non Java-doc
*
* @see TextEdit#perform(TextBuffer)
*/
public TextEdit perform(TextBuffer buffer) throws CoreException {
internalPerform(buffer);
return new MoveTextEdit(fTarget, fSource);
}
/*
* non Java-doc
*
* @see TextEdit#copy()
*/
public TextEdit copy() {
TextRange source = getSourceRange();
TextRange target = getTargetRange();
return new MoveTextEdit(source.fOffset, source.fLength, target.fOffset);
}
// ---- Helper method
// ---------------------------------------------------------------------------------
private void internalPerform(TextBuffer buffer) throws CoreException {
// Assert.isTrue(fPerformCounter < 2);
if (++fPerformCounter == 2) {
TextRange source = getSourceRange();
TextRange target = getTargetRange();
String current = buffer.getContent(source.fOffset, source.fLength);
buffer.replace(source, ""); //$NON-NLS-1$
buffer.replace(target, current);
}
}
/* package */boolean isUpMove() {
return fSource.fOffset < fTarget.fOffset;
}
/* package */boolean isDownMove() {
return fSource.fOffset > fTarget.fOffset;
}
/* package */TextRange getChildRange() {
int offset = fSource.fOffset;
int length = fSource.fLength;
int destination = fTarget.fOffset;
if (destination <= offset)
return new TextRange(destination, offset + length - destination);
else
return new TextRange(offset, destination - offset);
}
}