/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.internal.texteditor.quickdiff;

import java.util.List;

import org.eclipse.core.runtime.Assert;

import org.eclipse.jface.text.IDocument;

import org.eclipse.compare.rangedifferencer.RangeDifferencer;


/**
 * Description of a change between two or three ranges of comparable entities.
 * <p>
 * <code>RangeDifference</code> objects are the elements of a compare result returned from the
 * <code>RangeDifferencer</code> <code>find* </code> methods. Clients use these objects as they are
 * returned from the differencer. This class is not intended to be instantiated or subclassed.
 * <p>
 * Note: A range in the <code>RangeDifference</code> object is given as a start index and length in
 * terms of comparable entities. However, these entity indices and counts are not necessarily
 * character positions. For example, if an entity represents a line in a document, the start index
 * would be a line number and the count would be in lines.
 * </p>
 * 
 * @see RangeDifferencer
 * @since 3.0 (originally in org.eclipse.ui.internal.texteditor.quickdiff.compare.rangedifferencer)
 */
public class QuickDiffRangeDifference extends org.eclipse.compare.rangedifferencer.RangeDifference {

	private DiffRegion fRegion;

	/**
	 * Creates a new <code>RangeDifference</code> with the given change kind and left and right
	 * ranges.
	 * 
	 * @param kind the kind of change
	 * @param rightStart start index of entity on right side
	 * @param rightLength number of entities on right side
	 * @param leftStart start index of entity on left side
	 * @param leftLength number of entities on left side
	 */
	public QuickDiffRangeDifference(int kind, int rightStart, int rightLength, int leftStart, int leftLength) {
		super(kind, rightStart, rightLength, leftStart, leftLength);
	}

	/**
	 * Creates a new <code>RangeDifference</code> with the given change kind.
	 * 
	 * @since 3.5
	 */
	public QuickDiffRangeDifference() {
		super(NOCHANGE);
	}

	/**
	 * Shifts the offset into the left document of the receiver.
	 * 
	 * @param shift the number of elements to shift
	 */
	public void shiftLeft(int shift) {
		Assert.isTrue(shift + leftStart >= 0);
		leftStart+= shift;
	}

	/**
	 * Shifts the offset into the right document of the receiver.
	 *
	 * @param shift the number of elements to shift
	 */
	public void shiftRight(int shift) {
		Assert.isTrue(shift + rightStart >= 0);
		rightStart+= shift;
	}

	/**
	 * Resizes the receiver <code>shift</code> units, on both sides, by
	 * moving the start of the difference.
	 *
	 * @param shift the number of elements to shift
	 */
	public void extendStart(int shift) {
		Assert.isTrue(shift + rightStart >= 0);
		Assert.isTrue(shift + leftStart >= 0);
		rightStart+= shift;
		rightLength-= shift;
		leftStart+= shift;
		leftLength-= shift;
	}

	/**
	 * Resizes the receiver <code>shift</code> units, on both sides, by
	 * moving the end of the difference.
	 *
	 * @param shift the number of elements to shift
	 */
	public void extendEnd(int shift) {
		Assert.isTrue(shift + rightLength >= 0);
		Assert.isTrue(shift + leftLength >= 0);
		rightLength+= shift;
		leftLength+= shift;
	}

	/**
	 * Returns the diff region corresponding to this range difference.
	 *
	 * @param differences the list of differences around this one difference
	 * @param source the original document (left document) that this difference refers to
	 * @return a <code>DiffRegion</code> corresponding to this difference
	 */
	public DiffRegion getDiffRegion(List<QuickDiffRangeDifference> differences, IDocument source) {
		if (fRegion == null)
			fRegion= new DiffRegion(this, 0, differences, source);
		return fRegion;
	}
}

