/*******************************************************************************
 * Copyright (c) 2000, 2006 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
 *******************************************************************************/
package org.eclipse.mylyn.internal.commons.repositories.ui.wizards;

import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.activities.ws.WorkbenchTriggerPoints;
import org.eclipse.ui.internal.dialogs.WorkbenchWizardSelectionPage;
import org.eclipse.ui.wizards.IWizardCategory;
import org.eclipse.ui.wizards.IWizardDescriptor;

/**
 * New wizard selection tab that allows the user to either select a registered 'New' wizard to be launched, or to select
 * a solution or projects to be retrieved from an available server. This page contains two visual tabs that allow the
 * user to perform these tasks. Temporarily has two inner pages. The new format page is used if the system is currently
 * aware of activity categories.
 */
@SuppressWarnings("restriction")
class NewRepositoryWizardSelectionPage extends WorkbenchWizardSelectionPage {

	private final IWizardCategory wizardCategories;

	// widgets
	private NewRepositoryWizardNewPage newResourcePage;

	private final IWizardDescriptor[] primaryWizards;

	private final boolean projectsOnly;

	private boolean canFinishEarly = false, hasPages = true;

	/**
	 * Create an instance of this class.
	 * 
	 * @param workbench
	 *            the workbench
	 * @param selection
	 *            the current selection
	 * @param root
	 *            the wizard root element
	 * @param primary
	 *            the primary wizard elements
	 * @param projectsOnly
	 *            if only projects should be shown
	 */
	public NewRepositoryWizardSelectionPage(IWorkbench workbench, IStructuredSelection selection, IWizardCategory root,
			IWizardDescriptor[] primary, boolean projectsOnly) {
		super("newWizardSelectionPage", workbench, selection, null, WorkbenchTriggerPoints.NEW_WIZARDS);//$NON-NLS-1$

		setTitle(WorkbenchMessages.NewWizardSelectionPage_description);
		wizardCategories = root;
		primaryWizards = primary;
		this.projectsOnly = projectsOnly;
	}

	/**
	 * Makes the next page visible.
	 */
	public void advanceToNextPageOrFinish() {
		if (canFlipToNextPage()) {
			getContainer().showPage(getNextPage());
		} else if (canFinishEarly()) {
			if (getWizard().performFinish()) {
				((WizardDialog) getContainer()).close();
			}
		}
	}

	/**
	 * (non-Javadoc) Method declared on IDialogPage.
	 */
	public void createControl(Composite parent) {
		IDialogSettings settings = getDialogSettings();
		newResourcePage = new NewRepositoryWizardNewPage(this, wizardCategories, primaryWizards, projectsOnly);
		newResourcePage.setDialogSettings(settings);

		Control control = newResourcePage.createControl(parent);
		getWorkbench().getHelpSystem().setHelp(control, IWorkbenchHelpContextIds.NEW_WIZARD_SELECTION_WIZARD_PAGE);
		setControl(control);
	}

	/**
	 * Since Finish was pressed, write widget values to the dialog store so that they will persist into the next
	 * invocation of this wizard page
	 */
	protected void saveWidgetValues() {
		newResourcePage.saveWidgetValues();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.wizard.IWizardPage#canFlipToNextPage()
	 */
	@Override
	public boolean canFlipToNextPage() {
		// if the current page advertises that it does have pages then ask it via the super call
		if (hasPages) {
			return super.canFlipToNextPage();
		}
		return false;
	}

	/**
	 * Sets whether the selected wizard advertises that it does provide pages.
	 * 
	 * @param newValue
	 *            whether the selected wizard has pages
	 * @since 3.1
	 */
	public void setHasPages(boolean newValue) {
		hasPages = newValue;
	}

	/**
	 * Sets whether the selected wizard advertises that it can finish early.
	 * 
	 * @param newValue
	 *            whether the selected wizard can finish early
	 * @since 3.1
	 */
	public void setCanFinishEarly(boolean newValue) {
		canFinishEarly = newValue;
	}

	/**
	 * Answers whether the currently selected page, if any, advertises that it may finish early.
	 * 
	 * @return whether the page can finish early
	 * @since 3.1
	 */
	public boolean canFinishEarly() {
		return canFinishEarly;
	}
}
