/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.dnd.internal;

import java.util.Map;

import org.eclipse.gef.commands.Command;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
import org.eclipse.swt.widgets.Shell;
import org.w3c.dom.Node;

/**
 * This is the command that performs the drop operation. There is no need for
 * this command to go into command stack, it simply open wizards, and let
 * wizards to handle the remaining things.
 * 
 * @author mengbo
 */
public class LocalDropCommand extends Command {
	/**
	 * the map from feedback to ILocalDropHandler
	 */
	private Map _feedbackToHandlers;

	private IHTMLGraphicalViewer _viewer;

	private Object _localObject;

	private Node _widget;

	private IDOMPosition _position;

	/**
	 * constructor
	 * @param viewer 
	 * @param localObject 
	 * @param feedbackHandlers 
	 */
	public LocalDropCommand(IHTMLGraphicalViewer viewer, Object localObject,
			Map feedbackHandlers) {
		_viewer = viewer;
		_localObject = localObject;
		_feedbackToHandlers = feedbackHandlers;
	}

	/**
	 * @param widget
	 */
	public void setWidget(Node widget) {
		_widget = widget;
	}

	/**
	 * @param position
	 */
	public void setDOMPosition(IDOMPosition position) {
		_position = position;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.commands.Command#execute()
	 */
	public void execute() {
		if (_feedbackToHandlers.size() == 1) {
			// only have one choice.
			ILocalDropHandler handler = (ILocalDropHandler) _feedbackToHandlers
					.values().toArray()[0];
			if (handler.useWizard(_localObject, _viewer)) {
				IWizard wizard;
				if (_widget != null) {
					wizard = handler.getWizard(_localObject, _widget, _viewer);
				} else {
					wizard = handler
							.getWizard(_localObject, _position, _viewer);
				}
				CommonWizardDialog wizardDialog = new CommonWizardDialog(
						getShell(), wizard);
				wizardDialog.setTitle(Messages
						.getString("LocalDropCommand.DropHandler"));
				wizardDialog.create();
				wizardDialog.open();
			} else {
				if (_widget != null) {
					handler.doUpdateWidget(_localObject, _widget, _viewer);
				} else {
					handler.doInsertElements(_localObject, _position, _viewer);
				}
			}
		} else {
			CommonWizardDialog wizardDialog = new CommonWizardDialog(
					getShell(), getWizard());
			wizardDialog.setTitle(Messages
					.getString("LocalDropCommand.DropHandler"));
			wizardDialog.setBlockOnOpen(false);
			wizardDialog.create();
			wizardDialog.open();
		}
	}

	/**
	 * @return
	 */
	private IWizard getWizard() {
		if (_widget != null) {
			return new DropSelectionWizard(_viewer, _localObject,
					_feedbackToHandlers, _widget);
		}
        return new DropSelectionWizard(_viewer, _localObject,
        		_feedbackToHandlers, _position);
	}

	/**
	 * @return
	 */
	private Shell getShell() {
		return _viewer.getControl().getShell();
	}
}
