/*******************************************************************************
 * Copyright (c) 2002 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.xml.ui.internal.wizards;

import java.lang.reflect.InvocationTargetException;
import java.net.URL;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
import org.eclipse.ui.dialogs.IOverwriteQuery;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
import org.eclipse.wst.xml.ui.internal.Logger;
import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;

public class ExampleProjectCreationWizard extends Wizard implements INewWizard, IExecutableExtension {

	private class ImportOverwriteQuery implements IOverwriteQuery {

		private int openDialog(final String file) {
			final int[] result = {IDialogConstants.CANCEL_ID};
			getShell().getDisplay().syncExec(new Runnable() {
				public void run() {
					String title = XMLWizardsMessages.ExampleProjectCreationWizard_overwritequery_title;
					String msg = NLS.bind(XMLWizardsMessages.ExampleProjectCreationWizard_overwritequery_message, file);
					String[] options = {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.YES_TO_ALL_LABEL, IDialogConstants.CANCEL_LABEL};
					MessageDialog dialog = new MessageDialog(getShell(), title, null, msg, MessageDialog.QUESTION, options, 0);
					result[0] = dialog.open();
				}
			});
			return result[0];
		}

		public String queryOverwrite(String file) {
			String[] returnCodes = {YES, NO, ALL, CANCEL};
			int returnVal = openDialog(file);
			return returnVal < 0 ? CANCEL : returnCodes[returnVal];
		}
	}

	private IConfigurationElement wizardConfigElement;
	private IConfigurationElement exampleConfigElement;

	private String EXAMPLE_WIZARD_XP_ID = "org.eclipse.wst.common.ui.exampleProjectCreationWizard"; //$NON-NLS-1$

	private ExampleProjectCreationWizardPage[] pages;

	private final String WEB_BROWSER_ID = "org.eclipse.ui.browser.editor"; //$NON-NLS-1$

	public ExampleProjectCreationWizard() {
		super();
		setDialogSettings(XMLUIPlugin.getDefault().getDialogSettings());
		setWindowTitle(XMLWizardsMessages.ExampleProjectCreationWizard_title);
		setNeedsProgressMonitor(true);
	}

	/*
	 * @see Wizard#addPages
	 */
	public void addPages() {
		super.addPages();

		if (exampleConfigElement == null) {
			return;
		}
		IConfigurationElement[] children = exampleConfigElement.getChildren("projectsetup"); //$NON-NLS-1$
		if ((children == null) || (children.length == 0)) {
			Logger.log(Logger.ERROR, "descriptor must contain one ore more projectsetup tags"); //$NON-NLS-1$
			return;
		}

		pages = new ExampleProjectCreationWizardPage[children.length];

		for (int i = 0; i < children.length; i++) {
			pages[i] = new ExampleProjectCreationWizardPage(i, children[i]);
			addPage(pages[i]);
		}
	}

	public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
		if (exampleConfigElement != null) {
			String banner = exampleConfigElement.getAttribute("banner"); //$NON-NLS-1$
			if (banner != null) {
				URL imageURL = Platform.find(Platform.getBundle(exampleConfigElement.getDeclaringExtension().getNamespace()), new Path(banner));
				ImageDescriptor desc = ImageDescriptor.createFromURL(imageURL);
				setDefaultPageImageDescriptor(desc);
			}
		}
	}

	protected IConfigurationElement[] getExtendedConfigurationElements() {
		IExtensionRegistry registry = Platform.getExtensionRegistry();
		IExtensionPoint exampleWizardXP = registry.getExtensionPoint(EXAMPLE_WIZARD_XP_ID);
		if (exampleWizardXP == null) {
			return new IConfigurationElement[0];
		}
		IExtension extension = exampleWizardXP.getExtension(getWizardExtensionId());
		if (extension != null) {
			return extension.getConfigurationElements();
		}
		IConfigurationElement[] exampleWizardCEs = exampleWizardXP.getConfigurationElements();
		return exampleWizardCEs;
	}

	private void handleException(Throwable target) {
		String title = XMLWizardsMessages.ExampleProjectCreationWizard_op_error_title;
		String message = XMLWizardsMessages.ExampleProjectCreationWizard_op_error_message;
		if (target instanceof CoreException) {
			IStatus status = ((CoreException) target).getStatus();
			ErrorDialog.openError(getShell(), title, message, status);
			Logger.logException(status.getMessage(), status.getException());
		}
		else {
			MessageDialog.openError(getShell(), title, target.getMessage());
			Logger.logException(target);
		}
	}

	private void openResource(final IResource resource) {
		if (resource.getType() != IResource.FILE) {
			return;
		}
		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
		if (window == null) {
			return;
		}
		final IWorkbenchPage activePage = window.getActivePage();
		if (activePage != null) {
			final Display display = getShell().getDisplay();
			display.asyncExec(new Runnable() {
				public void run() {
					try {
						IDE.openEditor(activePage, (IFile) resource, WEB_BROWSER_ID, true);
					}
					catch (PartInitException e) {
						Logger.logException(e);
					}
				}
			});
			BasicNewResourceWizard.selectAndReveal(resource, activePage.getWorkbenchWindow());
		}
	}

	/*
	 * @see Wizard#performFinish
	 */
	public boolean performFinish() {
		ExampleProjectCreationOperation runnable = new ExampleProjectCreationOperation(pages, new ImportOverwriteQuery());

		IRunnableWithProgress op = new WorkspaceModifyDelegatingOperation(runnable);
		try {
			getContainer().run(false, true, op);
		}
		catch (InvocationTargetException e) {
			handleException(e.getTargetException());
			return false;
		}
		catch (InterruptedException e) {
			return false;
		}
		BasicNewProjectResourceWizard.updatePerspective(wizardConfigElement);
		IResource res = runnable.getElementToOpen();
		if (res != null) {
			openResource(res);
		}
		return true;
	}

	/**
	 * Stores the configuration element for the wizard. The config element
	 * will be used in <code>performFinish</code> to set the result
	 * perspective.
	 */
	public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) {
		wizardConfigElement = cfig;
		String title = wizardConfigElement.getAttribute("name"); //$NON-NLS-1$
		if (title != null) {
			setWindowTitle(title);
		}
		String wizardId = getWizardExtensionId();
		IConfigurationElement[] exampleWizardCEs = getExtendedConfigurationElements();
		for (int i = 0; i < exampleWizardCEs.length; i++) {
			IConfigurationElement element = exampleWizardCEs[i];
			String extWizardId = element.getAttribute("id"); //$NON-NLS-1$
			if ((wizardId != null) && (extWizardId != null) && wizardId.equals(extWizardId)) {
				exampleConfigElement = element;
			}
		}
		// initializeDefaultPageImageDescriptor();
	}

	public String getWizardExtensionId() {
		return wizardConfigElement.getAttribute("id"); //$NON-NLS-1$
	}

}