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

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.core.CVSTag;
import org.eclipse.team.internal.ccvs.core.ICVSFolder;
import org.eclipse.team.internal.ccvs.core.ICVSResource;
import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants;
import org.eclipse.team.internal.ccvs.ui.MessageDialogWithToggle;
import org.eclipse.team.internal.ccvs.ui.Policy;
import org.eclipse.team.internal.ccvs.ui.TagAsVersionDialog;
import org.eclipse.team.internal.ccvs.ui.operations.ITagOperation;
import org.eclipse.team.internal.ccvs.ui.repo.RepositoryManager;

/**
 * TagAction tags the selected resources with a version tag specified by the user.
 */
public abstract class TagAction extends WorkspaceAction {
	
	// remember if the execute action was cancelled
	private boolean wasCancelled = false;

	/**
	 * @see CVSAction#execute(IAction)
	 */
	public void execute(IAction action) throws InvocationTargetException, InterruptedException {
		setWasCancelled(false);
		if (!performPrompting()) {
			setWasCancelled(true);
			return;
		}
		
		// Prompt for the tag name
		final ITagOperation[] result = new ITagOperation[1];
		getShell().getDisplay().syncExec(new Runnable() {
			public void run() {
				result[0] = configureOperation();
				if (result[0] == null)  {
					return;
				}
			}});
		
		if (result[0] == null)  {
			setWasCancelled(true);
			return;
		}
		
		try {
			result[0].run();
		} catch (CVSException e1) {
			throw new InvocationTargetException(e1);
		}
		
		broadcastTagChange(result[0]);
	}
	
	protected boolean performPrompting()  {
		return true;
	}
	
	/**
	 * Prompts the user for a tag name.
	 * Note: This method is designed to be overridden by test cases.
	 * @return the operation, or null to cancel
	 */
	protected ITagOperation configureOperation() {
		IPreferenceStore store = CVSUIPlugin.getPlugin().getPreferenceStore();
		ITagOperation operation = createTagOperation();
		TagAsVersionDialog dialog = new TagAsVersionDialog(getShell(),
											Policy.bind("TagAction.tagResources"), //$NON-NLS-1$
											operation);
		if (dialog.open() != InputDialog.OK) return null;

		// The user has indicated they want to force a move.  Make sure they really do.		
		if (dialog.shouldMoveTag() && store.getBoolean(ICVSUIConstants.PREF_CONFIRM_MOVE_TAG))  {
			MessageDialogWithToggle confirmDialog = MessageDialogWithToggle.openQuestion(getShell(), 
				Policy.bind("TagAction.moveTagConfirmTitle"),  //$NON-NLS-1$
				Policy.bind("TagAction.moveTagConfirmMessage", dialog.getTagName()),
				null,
				false);
			
			if (confirmDialog.getReturnCode() == IDialogConstants.OK_ID)  {
				store.setValue(ICVSUIConstants.PREF_CONFIRM_MOVE_TAG, !confirmDialog.getToggleState());
			} else  {
				return null;
			}
		}
		
		// The user is a cowboy and wants to do it.
		return dialog.getOperation();
	}
	
	protected abstract ITagOperation createTagOperation();

	protected String getErrorTitle() {
		return Policy.bind("TagAction.tagErrorTitle"); //$NON-NLS-1$
	}
	
	protected String getWarningTitle() {
		return Policy.bind("TagAction.tagWarningTitle"); //$NON-NLS-1$
	}
	
	/**
	 * @see org.eclipse.team.internal.ccvs.ui.actions.WorkspaceAction#isEnabledForAddedResources()
	 */
	protected boolean isEnabledForAddedResources() {
		return false;
	}

	public boolean wasCancelled() {
		return wasCancelled;
	}

	public void setWasCancelled(boolean b) {
		wasCancelled = b;
	}

	protected void broadcastTagChange(final ITagOperation operation) throws InvocationTargetException, InterruptedException {
		final RepositoryManager manager = CVSUIPlugin.getPlugin().getRepositoryManager();
		manager.run(new IRunnableWithProgress() {
			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
				ICVSResource[] resources = operation.getCVSResources();
				for (int i = 0; i < resources.length; i++) {
					ICVSResource resource = resources[i];
					// Cache the new tag creation even if the tag may have had warnings.
					try {
						manager.addTags(getRootParent(resource), new CVSTag[] {operation.getTag()});
					} catch (CVSException e) {
						CVSUIPlugin.log(e);
					}
				}
			}
		}, new NullProgressMonitor());
	}

	private ICVSResource getRootParent(ICVSResource resource) throws CVSException {
		if (!resource.isManaged()) return resource;
		ICVSFolder parent = resource.getParent();
		if (parent == null) return resource;
		// Special check for a parent which is the repository itself
		if (parent.getName().length() == 0) return resource;
		return getRootParent(parent);
	}
}

