/*******************************************************************************
 * Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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:
 *     Soyatec - initial API and implementation
 *******************************************************************************/
package org.eclipse.xwt.tools.ui.designer.editor.outline.commands;

import java.util.Iterator;

import org.eclipse.xwt.tools.ui.palette.Entry;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.dnd.DND;
import org.eclipse.xwt.tools.ui.xaml.XamlNode;

/**
 * @author jliu (jin.liu@soyatec.com)
 */
public abstract class MoveCommand extends Command {

	private IStructuredSelection source;
	private Object target;

	private Command command;
	
	private int operation;

	public MoveCommand(IStructuredSelection source, Object target, int operation) {
		this.setSource(source);
		this.setTarget(target);
		this.setOperation(operation);		
	}

	public int getOperation() {
		return operation;
	}

	public void setOperation(int operation) {
		this.operation = operation;
	}

	protected boolean isMove() {
		return operation == DND.DROP_MOVE;
	}
	
	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.commands.Command#canExecute()
	 */
	public boolean canExecute() {
		boolean state = source != null && target != null && target instanceof XamlNode;
		if (!state) {
			return false;
		}
		
		IStructuredSelection sourceNodes = getSource();
		XamlNode parent = null;
		for (Iterator iterator = sourceNodes.iterator(); iterator.hasNext();) {
			Object element = iterator.next();
			XamlNode sourceNode = null;
			if (element instanceof Entry) {
				continue;
			}
			else if (!(element instanceof XamlNode)) {
				return false;
			}
			else {
				sourceNode = (XamlNode) element;
				XamlNode sourceParent = sourceNode.getParent();
				if (sourceParent == null) {
					return false;
				}
				if (parent == null) {
					parent = sourceParent;
				}
				else if (parent != sourceParent) {
					return false;
				}
			}
		}
		
		if (isMove() && sourceNodes.size() == 1 && sourceNodes.getFirstElement() == target) {
			return false;
		}
		return true;
	}

	/**
	 * @param source
	 *            the source to set
	 */
	public void setSource(IStructuredSelection source) {
		this.source = source;
	}

	/**
	 * @return the source
	 */
	public IStructuredSelection getSource() {
		return source;
	}

	/**
	 * @param target
	 *            the target to set
	 */
	public void setTarget(Object target) {
		this.target = target;
	}

	/**
	 * @return the target
	 */
	public XamlNode getTarget() {
		return (XamlNode) target;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.commands.Command#execute()
	 */
	public final void execute() {
		CompoundCommand cmd = new CompoundCommand();
		collectCommands(cmd);
		command = cmd.unwrap();
		if (command.canExecute()) {
			command.execute();
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.commands.Command#canUndo()
	 */
	public boolean canUndo() {
		return command != null && command.canUndo();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.commands.Command#undo()
	 */
	public void undo() {
		command.undo();
	}

	protected abstract void collectCommands(CompoundCommand command);
}
