// $codepro.audit.disable com.instantiations.assist.eclipse.analysis.audit.rule.effectivejava.alwaysOverridetoString.alwaysOverrideToString, com.instantiations.assist.eclipse.analysis.deserializeabilitySecurity, com.instantiations.assist.eclipse.analysis.disallowReturnMutable, com.instantiations.assist.eclipse.analysis.enforceCloneableUsageSecurity, explicitThisUsage
/*******************************************************************************
 * Copyright (c) 2010, 2012 Ericsson AB 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
 * 
 * Description:
 * 
 * This class is used as the input class that feeds the eclipse compare
 * editor
 * 
 * Contributors:
 *   Sebastien Dubois - Created for Mylyn Review R4E project
 *   
 ******************************************************************************/

package org.eclipse.mylyn.reviews.r4e.ui.internal.editors;

import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;

import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareUI;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.structuremergeviewer.Differencer;
import org.eclipse.compare.structuremergeviewer.ICompareInput;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.UIUtils;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.team.ui.synchronize.SaveableCompareEditorInput;

/**
 * @author Sebastien Dubois
 * @version $Revision: 1.0 $
 */
public class R4ECompareEditorInput extends SaveableCompareEditorInput {

	// ------------------------------------------------------------------------
	// Member variables
	// ------------------------------------------------------------------------

	/**
	 * Field fConfig - the compare configuration
	 */
	private final CompareConfiguration fConfig;

	/**
	 * Field fAncestor - the optional element that will appear on the top of the compare editor
	 */
	private final ITypedElement fAncestor;

	/**
	 * Field fLeft - the element that will appear on the left side of the compare editor
	 */
	private final ITypedElement fLeft;

	/**
	 * Field fRight - the element that will appear on the right side of the compare editor
	 */
	private final ITypedElement fRight;

	// ------------------------------------------------------------------------
	// Constructors
	// ------------------------------------------------------------------------

	/**
	 * Constructor for R4ECompareEditorInput.
	 * 
	 * @param aConfig
	 *            CompareConfiguration
	 * @param aAncestor
	 *            ITypedElement
	 * @param aLeft
	 *            ITypedElement
	 * @param aRight
	 *            ITypedElement
	 */
	public R4ECompareEditorInput(CompareConfiguration aConfig, ITypedElement aAncestor, ITypedElement aLeft,
			ITypedElement aRight) {
		super(aConfig, null);
		fConfig = aConfig;
		fAncestor = aAncestor;
		fLeft = aLeft;
		fRight = aRight;
	}

	// ------------------------------------------------------------------------
	// Methods
	// ------------------------------------------------------------------------

	/**
	 * Method getAncestorElement.
	 * 
	 * @return ITypedElement
	 */
	public ITypedElement getAncestorElement() {
		return fAncestor;
	}

	/**
	 * Method getLeftElement.
	 * 
	 * @return ITypedElement
	 */
	public ITypedElement getLeftElement() {
		return fLeft;
	}

	/**
	 * Method getRightElement.
	 * 
	 * @return ITypedElement
	 */
	public ITypedElement getRightElement() {
		return fRight;
	}

	/**
	 * Method prepareCompareInputNoEditor.
	 */
	public void prepareCompareInputNoEditor() {
		prepareCompareInput(null);
	}

	/**
	 * Method getToolTipText.
	 * 
	 * @return String
	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
	 */
	@Override
	public String getToolTipText() {
		if (null != fLeft && null != fRight) {
			String format = null;

			// Set the label values for the compare editor
			StringBuilder leftLabel = null;
			if (null != fLeft) {
				leftLabel = new StringBuilder("Target: " + fLeft.getName());
				if (fLeft instanceof R4EFileRevisionTypedElement) {
					leftLabel.append("_" + ((R4EFileRevisionTypedElement) fLeft).getFileVersion().getVersionID());
				}
				fConfig.setLeftLabel(leftLabel.toString());
			}
			StringBuilder rightLabel = null;
			if (null != fRight) {
				rightLabel = new StringBuilder("Base: " + fRight.getName());
				if (fRight instanceof R4EFileRevisionTypedElement) {
					rightLabel.append("_" + ((R4EFileRevisionTypedElement) fRight).getFileVersion().getVersionID());
				}
				fConfig.setRightLabel(rightLabel.toString());
			}

			if (null != fAncestor) {
				format = CompareUI.getResourceBundle().getString("ResourceCompare.threeWay.tooltip"); //$NON-NLS-1$
				final String ancestorLabel = "";
				return MessageFormat.format(format, new Object[] { ancestorLabel, leftLabel, rightLabel });
			}
			format = CompareUI.getResourceBundle().getString("ResourceCompare.twoWay.tooltip"); //$NON-NLS-1$
			return MessageFormat.format(format, new Object[] { leftLabel, rightLabel });
		}
		// fall back
		return super.getToolTipText();
	}

	/**
	 * Method getAdapter.
	 * 
	 * @param adapter
	 *            Class
	 * @return Object
	 * @see org.eclipse.compare.CompareEditorInput#getAdapter(java.lang.Class)
	 */
	@Override
	public Object getAdapter(@SuppressWarnings("rawtypes")
	Class adapter) {
		if (IFile.class.equals(adapter)) {
			if (null != getWorkspaceElement()) {
				return getWorkspaceElement().getResource();
			}
			return null;
		}
		return super.getAdapter(adapter);
	}

	/**
	 * Method fireInputChange.
	 */
	@Override
	protected void fireInputChange() { // $codepro.audit.disable emptyMethod
		// Not implemented for now
	}

	/**
	 * Method getWorkspaceElement.
	 * 
	 * @return R4EFileTypedElement
	 */
	private R4EFileTypedElement getWorkspaceElement() {
		if (fLeft instanceof R4EFileTypedElement) {
			return (R4EFileTypedElement) fLeft;
		}
		return null;
	}

	/**
	 * Method prepareCompareInput.
	 * 
	 * @param aMonitor
	 *            IProgressMonitor
	 * @return ICompareInput
	 * @throws InvocationTargetException
	 * @throws InterruptedException
	 * @see org.eclipse.compare.CompareEditorInput#prepareCompareInput(IProgressMonitor)
	 */
	@Override
	protected ICompareInput prepareCompareInput(IProgressMonitor aMonitor) {

		if (null != aMonitor) {
			aMonitor.beginTask("R4E Compare", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
		}

		// Set the label values for the compare editor
		initLabels();

		// Build the diff node to compare the files		
		final Differencer differencer = new Differencer();

		//Store the differences here, we might need them later
		final Object differences = differencer.findDifferences(false, aMonitor, null, fAncestor, fLeft, fRight);

		/* We might want to do something here in the future
		node.addCompareInputChangeListener(new ICompareInputChangeListener() {
			@Override
			public void compareInputChanged(ICompareInput source) {
			}
		});
		*/
		return (ICompareInput) differences;
	}

	/**
	 * Method initLabels.
	 */
	private void initLabels() {
		// Set the label values for the compare editor
		if (null != fLeft) {
			final StringBuilder leftLabel = new StringBuilder("Target: " + fLeft.getName());
			if (fLeft instanceof R4EFileRevisionTypedElement) {
				leftLabel.append(" " + ((R4EFileRevisionTypedElement) fLeft).getFileVersion().getVersionID());
			}
			fConfig.setLeftLabel(leftLabel.toString());
		}
		if (null != fRight) {
			final StringBuilder rightLabel = new StringBuilder("Base: " + fRight.getName());
			if (fRight instanceof R4EFileRevisionTypedElement) {
				rightLabel.append("_" + ((R4EFileRevisionTypedElement) fRight).getFileVersion().getVersionID());
			}
			fConfig.setRightLabel(rightLabel.toString());
		}

		// If the ancestor is not null, just put the file name as the workspace label
		if (null != fAncestor) {
			fConfig.setAncestorLabel(fAncestor.getName());
		}
	}

	/**
	 * Method createContents.
	 * 
	 * @param aParent
	 *            Composite
	 * @return Control
	 * @see org.eclipse.compare.CompareEditorInput#createContents(Composite)
	 */
	@Override
	public Control createContents(Composite aParent) {
		final Control control = super.createContents(aParent);

		//Go to the correct element in the compare editor
		UIUtils.selectElementInEditor(this);
		return control;
	}
}
