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