//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.wizards;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.epf.authoring.ui.AuthoringPerspective;
import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.common.ui.util.PerspectiveUtil;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.ui.LibraryUIPlugin;
import org.eclipse.epf.library.ui.LibraryUIResources;
import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
import org.eclipse.epf.library.xmi.XMILibraryManager;
import org.eclipse.epf.library.xmi.XMILibraryUtil;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;

/**
 * A wizard that guides the user to create a new method library.
 * 
 * @author Kelvin Low
 * @since 1.0
 */
public class NewLibraryWizard extends Wizard implements INewWizard {

	/**
	 * The wizard ID.
	 */
	public static final String WIZARD_ID = NewLibraryWizard.class.getName();

	// The main wizard page.
	private NewLibraryMainPage mainPage;

	/**
	 * Creates a new instance.
	 */
	public NewLibraryWizard() {
		super();
	}

	/**
	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
	 *      IStructuredSelection)
	 */
	public void init(IWorkbench workbench, IStructuredSelection selection) {
		setWindowTitle(AuthoringUIResources.newLibraryWizard_title);
	}

	/**
	 * @see org.eclipse.jface.wizard.Wizard#addPages()
	 */
	public void addPages() {
		SaveAllEditorsPage.addPageIfNeeded(this, true, null, null, null);
		mainPage = new NewLibraryMainPage();
		addPage(mainPage);
	}

	/**
	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
	 */
	public void createPageControls(Composite pageContainer) {
		super.createPageControls(pageContainer);
		pageContainer.getShell().setImage(
				AuthoringUIPlugin.getDefault().getSharedImage(
						"full/obj16/MethodLibrary.gif")); //$NON-NLS-1$
	}

	/**
	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
	 */
	public boolean performFinish() {
		try {
			String name = mainPage.getLibraryName();
			String desc = mainPage.getLibraryDescription();
			String type = mainPage.getLibraryType();
			Map<String, Object> options = new HashMap<String, Object>();
			File libraryPath = new File(mainPage.getLibraryPath());
			options.put(XMILibraryManager.ARG_LIBRARY_PATH, libraryPath
					.getAbsolutePath());

			if (XMILibraryUtil.containsPluginOrConfigSpecExportFile(libraryPath
					.getAbsolutePath())) {
				throw new Exception(LibraryUIResources.openLibraryError_reason4);
			}

			MethodLibrary library = LibraryService.getInstance()
					.createMethodLibrary(name, type, options);
			if (library != null) {
				if (desc.length() > 0) {
					library.setBriefDescription(desc);
				}
				LibraryUIPreferences.addNewLibraryPath(libraryPath
						.getAbsolutePath());
				PerspectiveUtil
						.openPerspective(AuthoringPerspective.PERSPECTIVE_ID);
				return true;
			}
		} catch (Exception e) {
			String reason = e.getMessage();
			if (reason == null) {
				reason = AuthoringUIResources.newLibraryInternlError_reason;
			}
			reason += "\n\n" + AuthoringUIResources.newLibraryError_advice; //$NON-NLS-1$
			if (e.getMessage() != null) {
				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
						AuthoringUIResources.newLibraryWizard_title,
						AuthoringUIResources.newLibraryError_msg, reason);
			} else {
				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
						AuthoringUIResources.newLibraryWizard_title,
						AuthoringUIResources.newLibraryError_msg, reason, e);
			}
		}
		return false;
	}

}
