All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.text.edits.MultiTextEdit Maven / Gradle / Ivy

/*******************************************************************************
 * 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 */ 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. */ 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. * * @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.

* * @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 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 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$ } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy