//------------------------------------------------------------------------------
// 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.util.Iterator;

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.utils.PerspectiveUtil;
import org.eclipse.epf.library.LibraryManagerFactory;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.ui.LibraryUIPlugin;
import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
import org.eclipse.epf.library.ui.wizards.NewLibraryWizardPage;
import org.eclipse.epf.library.ui.wizards.NewLibraryWizardPageFactory;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
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.2
 */
public class NewLibraryWizard2 extends Wizard implements INewWizard {

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

	// The main wizard page.
	private NewLibraryMainPage mainPage;

	/**
	 * Creates a new instance.
	 */
	public NewLibraryWizard2() {
		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);

		for (Iterator it = LibraryManagerFactory.getInstance()
				.getLibraryTypes().keySet().iterator(); it.hasNext();) {
			String persistenceId = (String) it.next();
			String pageId = persistenceId + "Page"; //$NON-NLS-1$
			NewLibraryWizardPage page = NewLibraryWizardPageFactory
					.getInstance().createWizardPage(pageId, persistenceId);
			if (page != null) {
				page.setImageDescriptor(AuthoringUIPlugin.getDefault()
						.getImageDescriptor("full/wizban/New.gif")); //$NON-NLS-1$					
				addPage(page);
			}
		}
	}

	/**
	 * @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#canFinish()
	 */
	public boolean canFinish() {
		IWizardPage[] pages = getPages();
		for (int i = 1; i < pages.length; i++) {
			if (!pages[i].isPageComplete()) {
				return false;
			}
		}
		return getContainer().getCurrentPage() != mainPage;
	}

	/**
	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
	 */
	public boolean performFinish() {
		String name = mainPage.getLibraryName();
		String type = mainPage.getLibraryType();
		NewLibraryWizardPage page = NewLibraryWizardPageFactory.getInstance()
				.getWizardPage(type);
		try {
			MethodLibrary library = LibraryService.getInstance()
					.createMethodLibrary(name, type, page.getSelections());
			if (library != null) {
				addRecentlyOpenedLibrary(library);
				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;
	}

	/**
	 * Adds the newly opened or created method library to the recently opened
	 * method libraries preference.
	 * 
	 * @param library
	 *            a method library
	 */
	protected void addRecentlyOpenedLibrary(MethodLibrary library) {
		if (library != null) {
			String libraryURI = LibraryService.getInstance().getLibraryManager(
					library).getMethodLibraryURI().toString();
			LibraryUIPreferences.addOpenLibraryURI(libraryURI);
		}
	}

}
