Copyright (c) 2000, 2006 IBM Corporation and others.
This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
IBM Corporation - initial API and implementation
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.text.edits;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
A multi-text edit can be used to aggregate several edits into
one edit. The edit itself doesn't modify a document.
Clients are allowed to implement subclasses of a multi-text
edit.Subclasses must implement doCopy()
to ensure
the a copy of the right type is created. Not implementing
doCopy()
in subclasses will result in an assertion
failure during copying.
Since: 3.0
/**
* A multi-text edit can be used to aggregate several edits into
* one edit. The edit itself doesn't modify a document.
* <p>
* Clients are allowed to implement subclasses of a multi-text
* edit.Subclasses must implement <code>doCopy()</code> to ensure
* the a copy of the right type is created. Not implementing
* <code>doCopy()</code> in subclasses will result in an assertion
* failure during copying.
*
* @since 3.0
*/
public class MultiTextEdit extends TextEdit {
private boolean fDefined;
Creates a new MultiTextEdit
. The range
of the edit is determined by the range of its children.
Adding this edit to a parent edit sets its range to the
range covered by its children. If the edit doesn't have
any children its offset is set to the parent's offset
and its length is set to 0.
/**
* Creates a new <code>MultiTextEdit</code>. The range
* of the edit is determined by the range of its children.
*
* Adding this edit to a parent edit sets its range to the
* range covered by its children. If the edit doesn't have
* any children its offset is set to the parent's offset
* and its length is set to 0.
*/
public MultiTextEdit() {
super(0, Integer.MAX_VALUE);
fDefined= false;
}
Creates a new MultiTextEdit
for the given
range. Adding a child to this edit which isn't covered
by the given range will result in an exception.
Params: - offset – the edit's offset
- length – the edit's length.
See Also:
/**
* Creates a new <code>MultiTextEdit</code> for the given
* range. Adding a child to this edit which isn't covered
* by the given range will result in an exception.
*
* @param offset the edit's offset
* @param length the edit's length.
* @see TextEdit#addChild(TextEdit)
* @see TextEdit#addChildren(TextEdit[])
*/
public MultiTextEdit(int offset, int length) {
super(offset, length);
fDefined= true;
}
/*
* Copy constructor.
*/
protected MultiTextEdit(MultiTextEdit other) {
super(other);
}
Checks the edit's integrity.
Note that this method should only be called by the edit
framework and not by normal clients.
This default implementation does nothing. Subclasses may override
if needed.
Throws: - MalformedTreeException – if the edit isn't in a valid state
and can therefore not be executed
/**
* Checks the edit's integrity.
* <p>
* Note that this method <b>should only be called</b> by the edit
* framework and not by normal clients.</p>
*<p>
* This default implementation does nothing. Subclasses may override
* if needed.</p>
*
* @exception MalformedTreeException if the edit isn't in a valid state
* and can therefore not be executed
*/
protected void checkIntegrity() throws MalformedTreeException {
// does nothing
}
@Override
final boolean isDefined() {
if (fDefined)
return true;
return hasChildren();
}
@Override
public final int getOffset() {
if (fDefined)
return super.getOffset();
List<TextEdit> children= internalGetChildren();
if (children == null || children.isEmpty())
return 0;
// the children are already sorted
return children.get(0).getOffset();
}
@Override
public final int getLength() {
if (fDefined)
return super.getLength();
List<TextEdit> children= internalGetChildren();
if (children == null || children.isEmpty())
return 0;
// the children are already sorted
TextEdit first= children.get(0);
TextEdit last= children.get(children.size() - 1);
return last.getOffset() - first.getOffset() + last.getLength();
}
@Override
public final boolean covers(TextEdit other) {
if (fDefined)
return super.covers(other);
// an undefined multiple text edit covers everything
return true;
}
@Override
protected boolean canZeroLengthCover() {
return true;
}
@Override
protected TextEdit doCopy() {
Assert.isTrue(MultiTextEdit.class == getClass(), "Subclasses must reimplement copy0"); //$NON-NLS-1$
return new MultiTextEdit(this);
}
@Override
protected void accept0(TextEditVisitor visitor) {
boolean visitChildren= visitor.visit(this);
if (visitChildren) {
acceptChildren(visitor);
}
}
@Override
void adjustOffset(int delta) {
if (fDefined)
super.adjustOffset(delta);
}
@Override
void adjustLength(int delta) {
if (fDefined)
super.adjustLength(delta);
}
@Override
void performConsistencyCheck(TextEditProcessor processor, IDocument document) throws MalformedTreeException {
checkIntegrity();
}
@Override
int performDocumentUpdating(IDocument document) throws BadLocationException {
fDelta= 0;
return fDelta;
}
@Override
boolean deleteChildren() {
return false;
}
@Override
void aboutToBeAdded(TextEdit parent) {
defineRegion(parent.getOffset());
}
void defineRegion(int parentOffset) {
if (fDefined)
return;
if (hasChildren()) {
IRegion region= getCoverage(getChildren());
internalSetOffset(region.getOffset());
internalSetLength(region.getLength());
} else {
internalSetOffset(parentOffset);
internalSetLength(0);
}
fDefined= true;
}
@Override
void internalToString(StringBuilder buffer, int indent) {
super.internalToString(buffer, indent);
if (! fDefined)
buffer.append(" [undefined]"); //$NON-NLS-1$
}
}