X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/textmanipulation/TextEditNode.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/textmanipulation/TextEditNode.java deleted file mode 100644 index 7cfaa70..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/textmanipulation/TextEditNode.java +++ /dev/null @@ -1,493 +0,0 @@ -/* - * (c) Copyright IBM Corp. 2000, 2001. - * All Rights Reserved. - */ -package net.sourceforge.phpdt.internal.corext.textmanipulation; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.text.DocumentEvent; -import org.eclipse.jface.text.IDocumentListener; - - -/** - * A helper class to arrange TextEdits into a tree to optimize their - * execution. - */ -/* package */ abstract class TextEditNode { - - /* package */ TextEditNode fParent; - /* package */ List fChildren; - /* package */ TextEdit fEdit; - - /* package */ static class DefaultNode extends TextEditNode { - public DefaultNode(TextEdit edit) { - super(edit); - } - } - - /* package */ static class RootNode extends TextEditNode { - private int fUndoIndex; - public RootNode(int length) { - super(new NopTextEdit(new TextRange(0, length))); - fEdit.isSynthetic= true; - } - public boolean covers(TextEditNode node) { - return true; - } - public UndoMemento performDo(TextBuffer buffer, IProgressMonitor pm) throws CoreException { - DoRangeUpdater updater= new DoRangeUpdater(); - UndoMemento undo= new UndoMemento(TextBufferEditor.UNDO); - try { - buffer.registerUpdater(updater); - performDo(buffer, updater, undo, pm); - } finally { - buffer.unregisterUpdater(updater); - updater.setActiveNode(null); - } - return undo; - } - public UndoMemento performUndo(TextBuffer buffer, IProgressMonitor pm) throws CoreException { - UndoRangeUpdater updater= new UndoRangeUpdater(this); - UndoMemento undo= new UndoMemento(TextBufferEditor.REDO); - try { - buffer.registerUpdater(updater); - performUndo(buffer, updater, undo, pm); - } finally { - buffer.unregisterUpdater(updater); - updater.setActiveNode(null); - } - return undo; - } - - protected void setUndoIndex(int index) { - fUndoIndex= index; - } - - protected int getUndoIndex() { - return fUndoIndex; - } - } - - /* package */ abstract static class AbstractMoveNode extends TextEditNode { - private int state; - - private int fTargetIndex; - private int fSourceIndex; - - private List fAffectedChildren; - - public AbstractMoveNode(TextEdit edit) { - super(edit); - reset(); - } - protected abstract TextRange getSourceRange(); - protected abstract TextRange getTargetRange(); - protected abstract boolean isUpMove(); - protected boolean isDownMove() { - return !isUpMove(); - } - public boolean isMove() { - return true; - } - protected void checkRange(DocumentEvent event) { - TextRange range= getChildRange(); - int eventOffset= event.getOffset(); - int eventLength= event.getLength(); - int eventEnd = eventOffset + eventLength - 1; - // "Edit changes text that lies outside its defined range" - // Assert.isTrue(range.fOffset <= eventOffset && eventEnd <= range.getInclusiveEnd()); - } - protected boolean activeNodeChanged(int delta) { - TextRange targetRange= getTargetRange(); - TextRange sourceRange= getSourceRange(); - switch (state) { - case 0: // the move delete - init(); - // Assert.isTrue(Math.abs(delta) == sourceRange.fLength); - if (isUpMove()) { - updateOffset(fAffectedChildren, delta); - targetRange.fOffset+= delta; - } - sourceRange.fLength= 0; - state= 1; - break; - case 1: - TextEditNode target= (TextEditNode)fParent.fChildren.get(fTargetIndex); - TextEditNode source= (TextEditNode)fParent.fChildren.get(fSourceIndex); - updateOffset(source.fChildren, targetRange.fOffset - sourceRange.fOffset); - target.fChildren= source.fChildren; - if (target.fChildren != null) { - for (Iterator iter= target.fChildren.iterator(); iter.hasNext();) { - ((TextEditNode)iter.next()).fParent= target; - } - } - source.fChildren= null; - if (isDownMove()) { - updateOffset(fAffectedChildren, delta); - sourceRange.fOffset+= delta; - } - targetRange.fLength= delta; - reset(); - break; - } - return true; - } - private static void updateOffset(List nodes, int delta) { - if (nodes == null) - return; - for (int i= nodes.size() - 1; i >= 0; i--) { - TextEditNode node= (TextEditNode)nodes.get(i); - TextRange range= node.getTextRange(); - range.fOffset+= delta; - updateOffset(node.fChildren, delta); - } - } - private void init() { - TextRange source= getSourceRange(); - TextRange target= getTargetRange(); - List children= fParent.fChildren; - for (int i= children.size() - 1; i >= 0; i--) { - TextEditNode child= (TextEditNode)children.get(i); - TextRange range= child.fEdit.getTextRange(); - if (range == source) - fSourceIndex= i; - else if (range == target) - fTargetIndex= i; - } - int start= Math.min(fTargetIndex, fSourceIndex); - int end= Math.max(fTargetIndex, fSourceIndex); - fAffectedChildren= new ArrayList(3); - for (int i= start + 1; i < end; i++) { - fAffectedChildren.add(children.get(i)); - } - } - private void reset() { - state= 0; - fSourceIndex= -1; - fTargetIndex= -1; - } - } - - /* package */ static class MoveNode extends AbstractMoveNode { - public MoveNode(TextEdit edit) { - super(edit); - } - protected TextRange getChildRange() { - return ((MoveTextEdit)fEdit).getChildRange(); - } - protected TextRange getSourceRange() { - return ((MoveTextEdit)fEdit).getSourceRange(); - } - protected TextRange getTargetRange() { - return ((MoveTextEdit)fEdit).getTargetRange(); - } - protected boolean isUpMove() { - return ((MoveTextEdit)fEdit).isUpMove(); - } - public boolean isMovePartner(TextEditNode other) { - if (!(other instanceof TargetMarkNode)) - return false; - return fEdit == ((MoveTextEdit.TargetMark)other.fEdit).getMoveTextEdit(); - } - public boolean covers(TextEditNode node) { - if (node instanceof TargetMarkNode) { - MoveTextEdit.TargetMark edit= (MoveTextEdit.TargetMark)node.fEdit; - if (edit.getMoveTextEdit() == fEdit) - return false; - } - return getParentRange().covers(node.getChildRange()); - } - } - - /* package */ static class TargetMarkNode extends AbstractMoveNode { - public TargetMarkNode(TextEdit edit) { - super(edit); - } - protected TextRange getChildRange() { - return ((MoveTextEdit.TargetMark)fEdit).getMoveTextEdit().getChildRange(); - } - protected TextRange getSourceRange() { - return ((MoveTextEdit.TargetMark)fEdit).getMoveTextEdit().getSourceRange(); - } - protected TextRange getTargetRange() { - return ((MoveTextEdit.TargetMark)fEdit).getMoveTextEdit().getTargetRange(); - } - protected boolean isUpMove() { - return ((MoveTextEdit.TargetMark)fEdit).getMoveTextEdit().isUpMove(); - } - public boolean isMovePartner(TextEditNode other) { - return ((MoveTextEdit.TargetMark)fEdit).getMoveTextEdit() == other.fEdit; - } - } - - //---- Range updating --------------------------------------------------------------------------- - - private static abstract class RangeUpdater implements IDocumentListener { - protected TextEditNode fActiveNode; - public void documentAboutToBeChanged(DocumentEvent event) { - } - public void setActiveNode(TextEditNode node) { - fActiveNode= node; - } - public void updateParents(int delta) { - TextEditNode node= fActiveNode.fParent; - while (node != null) { - node.childNodeChanged(delta); - node= node.fParent; - } - } - public static int getDelta(DocumentEvent event) { - return (event.getText() == null ? 0 : event.getText().length()) - event.getLength(); - } - } - private static class DoRangeUpdater extends RangeUpdater { - private List fProcessedNodes= new ArrayList(10); - public void setActiveNode(TextEditNode node) { - if (fActiveNode != null) - fProcessedNodes.add(fActiveNode); - super.setActiveNode(node); - } - public void documentChanged(DocumentEvent event) { - fActiveNode.checkRange(event); - int delta= getDelta(event); - if (!fActiveNode.activeNodeChanged(delta)) { - for (Iterator iter= fProcessedNodes.iterator(); iter.hasNext();) { - ((TextEditNode)iter.next()).previousNodeChanged(delta); - } - } - updateParents(delta); - } - } - private static class UndoRangeUpdater extends RangeUpdater { - private RootNode fRootNode; - public UndoRangeUpdater(RootNode root) { - fRootNode= root; - } - public void setActiveNode(TextEditNode node) { - super.setActiveNode(node); - } - public void documentChanged(DocumentEvent event) { - fActiveNode.checkRange(event); - int delta= getDelta(event); - if (!fActiveNode.activeNodeChanged(delta)) { - int start= fRootNode.getUndoIndex() + 1; - List children= fRootNode.fChildren; - int size= children != null ? children.size() : 0; - for (int i= start; i < size; i++) { - updateUndo((TextEditNode)children.get(i), delta); - } - } - updateParents(delta); - } - private void updateUndo(TextEditNode node, int delta) { - node.previousNodeChanged(delta); - List children= node.fChildren; - int size= children != null ? children.size() : 0; - for (int i= 0; i < size; i++) { - updateUndo((TextEditNode)children.get(i), delta); - } - } - } - - //---- Creating instances --------------------------------------------------------------------------- - - static TextEditNode create(TextEdit edit) { - if (edit instanceof MoveTextEdit) - return new MoveNode(edit); - if (edit instanceof MoveTextEdit.TargetMark) - return new TargetMarkNode(edit); - return new DefaultNode(edit); - } - - static RootNode createRoot(int length) { - return new RootNode(length); - } - - private TextEditNode(TextEdit edit) { - fEdit= edit; - } - - //---- Adding children --------------------------------------------------------------------------- - - protected void add(TextEditNode node) { - if (fChildren == null) { - fChildren= new ArrayList(1); - node.fParent= this; - fChildren.add(node); - return; - } - // Optimize using binary search - for (Iterator iter= fChildren.iterator(); iter.hasNext();) { - TextEditNode child= (TextEditNode)iter.next(); - if (child.covers(node)) { - child.add(node); - return; - } - } - for (int i= 0; i < fChildren.size(); ) { - TextEditNode child= (TextEditNode)fChildren.get(i); - if (node.covers(child)) { - fChildren.remove(i); - node.add(child); - } else { - i++; - } - } - node.fParent= this; - fChildren.add(node); - } - - public boolean covers(TextEditNode node) { - return false; - } - - //---- Accessing -------------------------------------------------------------------------------------- - - protected RootNode getRoot() { - TextEditNode candidate= this; - while(candidate.fParent != null) - candidate= candidate.fParent; - return (RootNode)candidate; - } - - //---- Query interface -------------------------------------------------------------------------------- - - protected boolean isSynthetic() { - return fEdit.isSynthetic; - } - - public boolean isMove() { - return false; - } - - //---- Accessing Ranges ------------------------------------------------------------------------------ - - protected void checkRange(DocumentEvent event) { - TextRange range= getTextRange(); - int eventOffset= event.getOffset(); - int eventLength= event.getLength(); - int eventEnd = eventOffset + eventLength - 1; - // "Edit changes text that lies outside its defined range" - // Assert.isTrue(range.fOffset <= eventOffset && eventEnd <= range.getInclusiveEnd()); - } - - protected TextRange getTextRange() { - return fEdit.getTextRange(); - } - - protected TextRange getChildRange() { - return getTextRange(); - } - - protected TextRange getParentRange() { - return getTextRange(); - } - - public boolean validate(int bufferLength) { - if (fChildren == null) - return true; - // Only Moves and Nops can be parents - if (!(fEdit instanceof MoveTextEdit || fEdit instanceof NopTextEdit)) - return false; - TextRange lastRange= null; - for (Iterator iter= fChildren.iterator(); iter.hasNext(); ) { - TextEditNode node= (TextEditNode)iter.next(); - if (!node.validate(bufferLength)) - return false; - TextRange range= node.fEdit.getTextRange(); - if (!range.isValid() || range.fOffset + range.fLength > bufferLength) - return false; - if (lastRange != null && !(range.isInsertionPointAt(lastRange.fOffset) || range.liesBehind(lastRange))) - return false; - lastRange= range; - } - return true; - } - - //---- Updating ---------------------------------------------------------------------------------------- - - protected boolean activeNodeChanged(int delta) { - TextRange range= getTextRange(); - range.fLength+= delta; - // we didn't adjust any processed nodes. - return false; - } - - protected void previousNodeChanged(int delta) { - TextRange range= getTextRange(); - range.fOffset+= delta; - } - - protected void childNodeChanged(int delta) { - getTextRange().fLength+= delta; - } - - //---- Do it --------------------------------------------------------------------------------------------- - - protected void performDo(TextBuffer buffer, RangeUpdater updater, UndoMemento undo, IProgressMonitor pm) throws CoreException { - int size= fChildren != null ? fChildren.size() : 0; - for (int i= size - 1; i >= 0; i--) { - TextEditNode child= (TextEditNode)fChildren.get(i); - child.performDo(buffer, updater, undo, pm); - } - updater.setActiveNode(this); - if (isSynthetic()) - fEdit.perform(buffer); - else - undo.add(fEdit.perform(buffer)); - pm.worked(1); - } - - public void performedDo() { - int size= fChildren != null ? fChildren.size() : 0; - for (int i= size - 1; i >= 0; i--) { - TextEditNode child= (TextEditNode)fChildren.get(i); - child.performedDo(); - } - fEdit.performed(); - } - - //---- Undo it ------------------------------------------------------------------------------------------- - - protected void performUndo(TextBuffer buffer, RangeUpdater updater, UndoMemento undo, IProgressMonitor pm) throws CoreException { - int size= fChildren != null ? fChildren.size() : 0; - for (int i= 0; i < size; i++) { - setUndoIndex(i); - TextEditNode child= (TextEditNode)fChildren.get(i); - child.performUndo(buffer, updater, undo, pm); - } - updater.setActiveNode(this); - if (isSynthetic()) - fEdit.perform(buffer); - else - undo.add(fEdit.perform(buffer)); - pm.worked(1); - } - - protected void setUndoIndex(int index) { - } - - public void performedUndo() { - int size= fChildren != null ? fChildren.size() : 0; - for (int i= 0; i < size; i++) { - TextEditNode child= (TextEditNode)fChildren.get(i); - child.performedUndo(); - } - fEdit.performed(); - } - -// protected void createUndoList(List list) { -// int size= fChildren != null ? fChildren.size() : 0; -// for (int i= 0; i < size; i++) { -// TextEditNode child= (TextEditNode)fChildren.get(i); -// child.createUndoList(list); -// } -// list.add(this); -// } -} -