package org.erlide.ui.editors.internal.reconciling; public class ErlDirtyRegion { /** The region's offset. */ private int fOffset; /** The region's length. (Removed length) */ private int fLength; /** The text which has been inserted. */ private String fText; /** * Creates a new dirty region. * * @param offset * the offset within the document where the change occurred * @param length * the length of the text within the document that changed * @param text * the substitution text */ public ErlDirtyRegion(final int offset, final int length, final String text) { fOffset = offset; fLength = length; fText = text == null ? "" : text; } public int getOffset() { return fOffset; } public int getLength() { return fLength; } public int getTextLength() { return fText.length(); } /** * Returns the text that changed as part of the region change. * * @return the changed text */ public String getText() { return fText; } /** * Modify the receiver so that it encompasses the region specified by the * dirty region. * * @param dr * the dirty region to merge with */ public void mergeWith(final ErlDirtyRegion dr) { fOffset = Math.min(fOffset, dr.fOffset); fLength = fLength + dr.fLength; fText = fText + dr.fText; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("Ofs ").append(fOffset).append(" del ").append(fLength) .append(" ins ").append(getTextLength()); return sb.toString(); } /** * Check if the regions are adjacent and can be merged to one * * @param nextMerge * @return */ public boolean isMergable(final ErlDirtyRegion nextMerge) { return getOffset() - getLength() + getTextLength() == nextMerge.getOffset() || getOffset() == nextMerge.getOffset() - nextMerge.getLength() + nextMerge.getTextLength(); } }