//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.actions;

import java.lang.reflect.InvocationTargetException;
import java.util.Collection;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.UnexecutableCommand;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.command.CreateChildCommand;
import org.eclipse.emf.edit.command.CreateChildCommand.Helper;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.ui.action.StaticSelectionCommandAction;
import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
import org.eclipse.epf.library.edit.process.command.CreateProcessComponentCommand;
import org.eclipse.epf.library.edit.util.PracticePropUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.ui.actions.LibraryLockingOperationRunner;
import org.eclipse.epf.uma.Practice;
import org.eclipse.epf.uma.ProcessComponent;
import org.eclipse.epf.uma.util.UserDefinedTypeMeta;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;


/**
 * Method Create Child action.
 * 
 * @author Phong Nguyen Le
 * @since 1.0
 */
public final class MethodCreateChildAction extends StaticSelectionCommandAction {
	/**
	 * This describes the child to be created.
	 */
	protected Object descriptor;

	/**
	 * This constructs an instance of an action that creates a child specified
	 * by <code>descriptor</code> for the single object in the
	 * <code>selection</code>.
	 */
	public MethodCreateChildAction(EditingDomain editingDomain,
			ISelection selection, Object descriptor) {
		super();
		this.editingDomain = editingDomain;
		this.descriptor = descriptor;
		configureAction(selection);
	}

	/**
	 * This creates the command for {@link
	 * StaticSelectionCommandAction#createActionCommand}.
	 */
	protected Command createActionCommand(EditingDomain editingDomain,
			Collection collection) {
		if (collection.size() == 1) {
			Object owner = collection.iterator().next();
			Command cmd = null;

			if (descriptor instanceof CommandParameter
					&& ((CommandParameter) descriptor).getValue() instanceof ProcessComponent) {
				CommandParameter newChildParameter = (CommandParameter) descriptor;
				CreateChildCommand.Helper helper = (Helper) ((AdapterFactoryEditingDomain)editingDomain).getAdapterFactory().adapt(owner, IEditingDomainItemProvider.class);
//				for (Iterator iter = ((EObject) owner).eAdapters().iterator(); iter
//						.hasNext();) {
//					Object o = iter.next();
//					if (o instanceof ProcessPackageItemProvider) {
//						helper = (ProcessPackageItemProvider) o;
//						break;
//					}
//				}
				cmd = new CreateProcessComponentCommand(editingDomain,
						(EObject) owner, newChildParameter
								.getEStructuralFeature(), newChildParameter
								.getValue(), newChildParameter.getIndex(),
						collection, helper) {
				};
			} else {
				cmd = CreateChildCommand.create(editingDomain, owner,
						descriptor, collection);
			}

			if (isUserDefinedType()) {
				return new CreateMethodElementCommand(cmd) {
					public String getText() {
						String name = getNameForUserDefinedType();
						if (name != null) {
							return name;
						} else {
							return super.getText();
						}
					}
					
					public Object getImage() {
						ImageDescriptor img = getImageForUserDefinedType();
						if (img != null) {
							return img;
						} else {
							return super.getImage();
						}
					}
				};
			} else {
				return new CreateMethodElementCommand(cmd);
			}
		}
		return UnexecutableCommand.INSTANCE;
	}
	
	private void superRun() {
		super.run();
	}
	
	/**
	 * @see org.eclipse.emf.edit.ui.action.StaticSelectionCommandAction#run()
	 */
	public void run() {
		LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
		runner.run(new IRunnableWithProgress() {

			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
				superRun();
			}
			
		});
	}

	private boolean isUserDefinedType() {
		try {
			if (descriptor instanceof CommandParameter
					&& ((CommandParameter) descriptor).getValue() instanceof Practice) {
				Practice prac = (Practice)((CommandParameter) descriptor).getValue();
				UserDefinedTypeMeta udtMeta = PracticePropUtil.getPracticePropUtil().getUtdData(prac);
				if (udtMeta != null) {
					return true;
				}
			}
		} catch (Exception e) {
			AuthoringUIPlugin.getDefault().getLogger().logError(e);
		}
		
		return false;
	}
	
	private String getNameForUserDefinedType() {
		try {
			if (isUserDefinedType()) {
				Practice prac = (Practice)((CommandParameter) descriptor).getValue();
				UserDefinedTypeMeta udtMeta = PracticePropUtil.getPracticePropUtil().getUtdData(prac);
				return udtMeta.getRteNameMap().get(UserDefinedTypeMeta._typeName);
			}
		} catch (Exception e) {
			AuthoringUIPlugin.getDefault().getLogger().logError(e);
		}
		
		return null;
	}
	
	private ImageDescriptor getImageForUserDefinedType() {
		if (isUserDefinedType()) {
			Practice prac = (Practice) ((CommandParameter) descriptor).getValue();
			return TngUtil.getImageForUdt(prac);
		}

		return null;
	}
	
}
