/*******************************************************************************
 * Copyright (c) 2004, 2008 Tasktop Technologies 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:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.bugzilla.deprecated;

import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareEditorInput;
import org.eclipse.compare.structuremergeviewer.Differencer;
import org.eclipse.compare.structuremergeviewer.IStructureComparator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;

/**
 * A two-way or three-way compare for <code>BugReport</code> objects.
 * 
 * @author Shawn Minto
 * @author Mik Kersten
 */
public class BugzillaCompareInput extends CompareEditorInput {

	private boolean threeWay = false;

	private Object root;

	private IStructureComparator ancestor = null;

	private IStructureComparator left = null;

	private IStructureComparator right = null;

	/**
	 * Constructor.
	 * 
	 * @param configuration
	 *            The compare configuration used in this compare input.
	 * @see CompareConfiguration
	 */
	public BugzillaCompareInput(CompareConfiguration configuration) {
		super(configuration);
	}

	@Override
	protected Object prepareInput(IProgressMonitor monitor) {
		if (left == null || right == null) {
			return null;
		}
		Differencer d = new Differencer();
		root = d.findDifferences(threeWay, monitor, null, ancestor, left, right);
		return root;
	}

	/**
	 * @return The original object that's to be compared (appears on the top of the compare view).
	 */
	public IStructureComparator getAncestor() {
		return ancestor;
	}

	/**
	 * Sets the original object that's to be compared (appears on the top of the compare view).
	 * 
	 * @param newAncestor
	 *            The new original object.
	 */
	public void setAncestor(RepositoryTaskData newAncestor) {
		threeWay = (newAncestor != null);
		BugzillaCompareStructureCreator structureCreator = new BugzillaCompareStructureCreator();
		ancestor = structureCreator.getStructure(newAncestor);
	}

	/**
	 * @return The local object that's to be compared (appears on the left side of the compare view).
	 */
	public IStructureComparator getLeft() {
		return left;
	}

	/**
	 * Sets the local object that's to be compared (appears on the left side of the compare view).
	 * 
	 * @param newLeft
	 *            The new local object.
	 */
	public void setLeft(RepositoryTaskData newLeft) {
		BugzillaCompareStructureCreator structureCreator = new BugzillaCompareStructureCreator();
		left = structureCreator.getStructure(newLeft);
	}

	/**
	 * @return The online object that's to be compared (appears on the right side of the compare view).
	 */
	public IStructureComparator getRight() {
		return right;
	}

	/**
	 * Sets the online object that's to be compared (appears on the right side of the compare view).
	 * 
	 * @param newRight
	 *            The new online object.
	 */
	public void setRight(RepositoryTaskData newRight) {
		BugzillaCompareStructureCreator structureCreator = new BugzillaCompareStructureCreator();
		right = structureCreator.getStructure(newRight);
	}

	/**
	 * @return <code>true</code> if a three-way comparison is to be done.
	 */
	public boolean isThreeWay() {
		return threeWay;
	}
}
