/**
 * Copyright (c) 2012 committers of YAKINDU 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:
 * 	committers of YAKINDU - initial API and implementation
 * 
 */
package org.yakindu.sct.ui.editor.commands;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.OperationHistoryFactory;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
import org.eclipse.gmf.runtime.notation.NotationFactory;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.handlers.HandlerUtil;
import org.yakindu.sct.ui.editor.editparts.StateEditPart;
import org.yakindu.sct.ui.editor.factories.StateViewFactory;
import org.yakindu.sct.ui.editor.utils.GMFNotationUtil;

/**
 * 
 * @author andreas muelder - Initial contribution and API
 * 
 */
public class ToggleSubRegionLayoutCommand extends AbstractHandler {

	private View view;

	public Object execute(ExecutionEvent event) throws ExecutionException {
		view = unwrap(HandlerUtil.getCurrentSelection(event));

		TransactionalEditingDomain editingDomain = TransactionUtil
				.getEditingDomain(view);
		ToggleCommand toggleCommand = new ToggleCommand(editingDomain, view);

		try {
			OperationHistoryFactory.getOperationHistory().execute(
					toggleCommand, new NullProgressMonitor(), null);
		} catch (ExecutionException e) {
			e.printStackTrace();
		}

		return null;
	}

	protected View unwrap(ISelection selection) {
		IStructuredSelection structuredSelection = (IStructuredSelection) selection;
		Object firstElement = structuredSelection.getFirstElement();
		if (firstElement == null)
			return null;
		return ((StateEditPart) firstElement).getNotationView();
	}

	/**
	 * GMF command class...
	 * 
	 * @author terfloth
	 */
	protected static class ToggleCommand extends AbstractTransactionalCommand {

		protected static final String TOGGLE_REGION_ALIGNMENT = "Toggle Region Alignment";

		protected View view;

		public ToggleCommand(TransactionalEditingDomain editingDomain, View view) {
			super(editingDomain, TOGGLE_REGION_ALIGNMENT, null);
			this.view = view;
		}

		@SuppressWarnings({ "rawtypes", "unchecked" })
		public List getAffectedFiles() {

			if (view != null) {
				List result = new ArrayList();
				IFile file = WorkspaceSynchronizer.getFile(view.eResource());

				if (file != null) {
					result.add(file);
				}
				return result;
			}

			return super.getAffectedFiles();
		}

		/**
		 * Executes the command that switches the subregion layout orientation.
		 */
		@SuppressWarnings("unchecked")
		protected CommandResult doExecuteWithResult(IProgressMonitor monitor,
				IAdaptable info) throws ExecutionException {
			BooleanValueStyle style = GMFNotationUtil.getBooleanValueStyle(
					view, StateViewFactory.ALIGNMENT_ORIENTATION);
			if (style == null) {
				style = NotationFactory.eINSTANCE.createBooleanValueStyle();
				style.setBooleanValue(true);
				style.setName(StateViewFactory.ALIGNMENT_ORIENTATION);
				view.getStyles().add(style);
			} else {
				style.setBooleanValue(!style.isBooleanValue());
			}
			return CommandResult.newOKCommandResult(view);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.gmf.runtime.common.core.command.ICommand#getLabel()
		 */
		public String getLabel() {
			return TOGGLE_REGION_ALIGNMENT;
		}

	}

}
