// $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
/*******************************************************************************
 * Copyright (c) 2011, 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 implements the context-sensitive command to add a child element
 * to the navigator view/model
 * 
 * Contributors:
 *   Sebastien Dubois - Created for Mylyn Review R4E project
 *   
 ******************************************************************************/
package org.eclipse.mylyn.reviews.r4e.ui.internal.commands.handlers;

import java.util.List;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.mylyn.reviews.core.model.IReviewComponent;
import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.CompatibilityException;
import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.OutOfSyncException;
import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.ResourceHandlingException;
import org.eclipse.mylyn.reviews.r4e.ui.R4EUIPlugin;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIModelController;
import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.R4EUIConstants;
import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.UIUtils;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Widget;

/**
 * @author Sebastien Dubois
 * @version $Revision: 1.0 $
 */
public class NewChildElementHandler extends AbstractHandler {

	// ------------------------------------------------------------------------
	// Constants
	// ------------------------------------------------------------------------

	/**
	 * Field COMMAND_MESSAGE. (value is ""Adding New Child Element..."")
	 */
	private static final String COMMAND_MESSAGE = "Adding New Child Element...";

	// ------------------------------------------------------------------------
	// Methods
	// ------------------------------------------------------------------------

	/**
	 * Method execute.
	 * 
	 * @param aEvent
	 *            ExecutionEvent
	 * @return Object
	 * @see org.eclipse.core.commands.IHandler#execute(ExecutionEvent)
	 */
	public Object execute(final ExecutionEvent aEvent) {

		final IR4EUIModelElement element = getParentElement(aEvent);

		//Get data from user
		if (null != element) {
			try {
				final List<IReviewComponent> tempModelComponents = element.createChildModelDataElement();

				//Create actual model element
				final Job job = new Job(COMMAND_MESSAGE) {
					public String familyName = R4EUIConstants.R4E_UI_JOB_FAMILY;

					@Override
					public boolean belongsTo(Object family) {
						return familyName.equals(family);
					}

					@Override
					public IStatus run(IProgressMonitor monitor) {
						R4EUIModelController.setJobInProgress(true);
						monitor.beginTask(COMMAND_MESSAGE, IProgressMonitor.UNKNOWN);

						for (final IReviewComponent tempModelComponent : tempModelComponents) {
							R4EUIPlugin.Ftracer.traceInfo("Adding child to element " + element.getName());
							IR4EUIModelElement newElement = null;
							try {
								newElement = element.createChildren(tempModelComponent);
								R4EUIModelController.setJobInProgress(false);
								UIUtils.setNavigatorViewFocus(newElement, AbstractTreeViewer.ALL_LEVELS);
							} catch (ResourceHandlingException e) {
								UIUtils.displayResourceErrorDialog(e);

								//Remove object if partially created
								try {
									element.removeChildren(newElement, true);
								} catch (ResourceHandlingException e1) {
									UIUtils.displayResourceErrorDialog(e1);
								} catch (OutOfSyncException e1) {
									UIUtils.displaySyncErrorDialog(e1);
								} catch (CompatibilityException e1) {
									UIUtils.displayCompatibilityErrorDialog(e1);
								}

							} catch (CompatibilityException e) {
								UIUtils.displayCompatibilityErrorDialog(e);

								//Remove object if partially created
								try {
									element.removeChildren(newElement, true);
								} catch (ResourceHandlingException e1) {
									UIUtils.displayResourceErrorDialog(e1);
								} catch (OutOfSyncException e1) {
									UIUtils.displaySyncErrorDialog(e1);
								} catch (CompatibilityException e1) {
									UIUtils.displayCompatibilityErrorDialog(e1);
								}
							} catch (OutOfSyncException e) {
								UIUtils.displaySyncErrorDialog(e);

								//Remove object if partially created
								try {
									element.removeChildren(newElement, true);
								} catch (ResourceHandlingException e1) {
									UIUtils.displayResourceErrorDialog(e1);
								} catch (OutOfSyncException e1) {
									UIUtils.displaySyncErrorDialog(e1);
								} catch (CompatibilityException e1) {
									UIUtils.displayCompatibilityErrorDialog(e1);
								}
							}
						}
						R4EUIModelController.setJobInProgress(false);
						monitor.done();
						return Status.OK_STATUS;
					}
				};
				job.setUser(true);
				job.schedule();
			} catch (ResourceHandlingException e) {
				UIUtils.displayResourceErrorDialog(e);
			}
		}
		return null;
	}

	/**
	 * Method getParentElement.
	 * 
	 * @param event
	 *            ExecutionEvent
	 * @return IR4EUIModelElement
	 */
	private IR4EUIModelElement getParentElement(ExecutionEvent event) {
		final Widget triggerObject = ((Event) event.getTrigger()).widget;
		IR4EUIModelElement element = null;

		if (triggerObject instanceof ToolItem) {
			Object data = ((ToolItem) triggerObject).getParent().getData(R4EUIConstants.ANNOTATION_TOOLBAR);
			if (null == data || !(Boolean) data) {
				//Add element to the root of the tree
				return R4EUIModelController.getRootElement();
			}
		}
		final IStructuredSelection selection = (IStructuredSelection) R4EUIModelController.getNavigatorView()
				.getTreeViewer()
				.getSelection();
		if (!selection.isEmpty()) {
			element = (IR4EUIModelElement) selection.getFirstElement();
		} else {
			//Add element to the root of the tree
			element = R4EUIModelController.getRootElement();
		}
		return element;
	}
}
