/*******************************************************************************
 * Copyright (c) 2004, 2005 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.jsf.facesconfig.ui.pageflow.command;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.window.Window;
import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;

/**
 * This is the creation command for pageflow editpart
 * 
 * @author Xiao-guang Zhang
 */
public class CreateNodeCommand extends Command implements IPreExecuteCommand {
	private static final String UNNAMED_NODE = "unnamed"; //$NON-NLS-1$

	/** new pageflow node */
	private PageflowNode child;

	/** size of pageflow node figure */
	private Rectangle rect;

	/** parent pageflow */
	private Pageflow parent;

	/** index of pageflow nodes */
	// private int _index = -1;
	public CreateNodeCommand() {
		// Pageflow.Commands.CreateNodeCommand.Label = Create new node
		super(PageflowMessages.Pageflow_Commands_CreateNodeCommand_Label);

	}

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

	/*
	 * (non-Javadoc)
	 * 
	 * @see Command#execute()
	 */
	public void execute() {
		if (rect != null) {
			child.setX(rect.x);
			child.setY(rect.y);
			if (!rect.isEmpty()) {
				child.setHeight(rect.getSize().height);
				child.setWidth(rect.getSize().width);
			}
		}

		if (child.getName() == UNNAMED_NODE) {
			child.setName(parent.getDefaultNodeName(child.getClass()));
		}

		parent.getNodes().add(child);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see Command#redo()
	 */
	public void redo() {
		if (rect != null) {
			child.setX(rect.x);
			child.setY(rect.y);
			if (!rect.isEmpty()) {
				child.setHeight(rect.getSize().height);
				child.setWidth(rect.getSize().width);
			}
		}

		parent.getNodes().add(child);

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see Command#undo()
	 */
	public void undo() {
		parent.getNodes().remove(child);
	}

	/**
	 * select a jsp page in current project.
	 * 
	 * @return
	 */
	private boolean selectJSPPage() {

		Shell shell = null;
		IWorkbenchWindow workbenchWindow = EditorPlugin
				.getActiveWorkbenchWindow();
		if (workbenchWindow.getShell() != null) {
			shell = workbenchWindow.getShell();
		} else {
			shell = new Shell();
		}
		IProject project = WebrootUtil.getProject(getParent());

		CommonResourceDialog dialog = new CommonResourceDialog(shell, project,
				SWT.NONE);

		dialog
				.setTitle(PageflowMessages.Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Title);
		// no suffix filter
		dialog.setSuffixs(null);
		dialog
				.setResourceDescription(PageflowMessages.Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Description);

		if (dialog.open() == Window.OK) {
			Object[] result = dialog.getResult();
			if (result != null) {
				IFile jspFile = (IFile) result[0];
				if (jspFile != null) {
					// get the project path for the new created file, i.e.,
					// /project/webroot/*.jsp
					String jsfSelection = WebrootUtil.getWebPath(jspFile
							.getFullPath());
					if (jsfSelection != null && jsfSelection.length() > 0) {
						if (PageflowValidation.getInstance().isExistedPage(
								this.parent, jsfSelection)) {
							// Pageflow.PageflowEditor.Alert.DNDResourceTitle =
							// Pageflow Creation Error
							// Pageflow.PageflowEditor.Alert.ExistingPage = The
							// web page {0} is already existed in current
							// PageFlow.
							EditorPlugin
									.getAlerts()
									.error(
											"Pageflow.PageflowEditor.Alert.DNDResourceTitle", //$NON-NLS-1$
											"Pageflow.PageflowEditor.Alert.ExistingPage", //$NON-NLS-1$
											jsfSelection);
							return false;
						}

						((PageflowPage) (child)).setPath(jsfSelection);
						((PageflowPage) (child)).setName(WebrootUtil
								.getPageNameFromWebPath(jsfSelection));
					}

					return true;
				}
			}
		}
		return false;
	}

	/**
	 * call the JSF wizard to create a new jsf page.
	 * @return the parent
	 * 
	 */
	public Pageflow getParent() {
		return parent;
	}

	/**
	 * set the child node
	 * 
	 * @param subpart -
	 *            new child pageflow node
	 */
	public void setChild(PageflowNode subpart) {
		child = subpart;
	}

	/**
	 * set the location of the new pageflow node
	 * 
	 * @param r -
	 *            location of the new pageflow node
	 */
	public void setLocation(Rectangle r) {
		rect = r;
	}

	/**
	 * set the parent pageflow
	 * 
	 * @param newParent -
	 *            the new parent pageflow
	 */
	public void setParent(Pageflow newParent) {
		parent = newParent;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sybase.stf.jmt.editors.pageflow.commands.IPreExecuteCommand#preExecute()
	 */
	public boolean preExecute() {
		// note that the model adds the ports to the node in this call
		// pop up the new the wizard to create the new jsf file
		if (child instanceof PageflowPage) {
			// if the new page's file path is not empty, i.e., drag a file from
			// resource navigator view
			if (null != ((PageflowPage) child).getPath()) {
				if (PageflowValidation.getInstance().isExistedPage(parent,
						(PageflowPage) child)) {
					// Pageflow.PageflowEditor.Alert.DNDResourceTitle = Pageflow
					// Creation Error
					// Pageflow.PageflowEditor.Alert.ExistingPage = The web page
					// {0} is already existed in current PageFlow.
					EditorPlugin.getAlerts().error(
							"Pageflow.PageflowEditor.Alert.DNDResourceTitle", //$NON-NLS-1$
							"Pageflow.PageflowEditor.Alert.ExistingPage", //$NON-NLS-1$
							((PageflowPage) child).getPath());
					return false;
				}
			} else
			// create a new jsf page from scratch
			{
				// return createNewJSFPage();
				return selectJSPPage();
			}
		}
		return true;
	}
}
