/*******************************************************************************
 * Copyright (c) 2000, 2008 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.ltk.ui.refactoring;

import org.eclipse.core.runtime.Assert;

import org.eclipse.jface.dialogs.DialogSettings;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardPage;

import org.eclipse.ltk.core.refactoring.Refactoring;

/**
 * An abstract base implementation of a refactoring wizard page. The class
 * provides access to the refactoring wizard and to the refactoring itself.
 * Refactoring wizard pages can only be added to a
 * {@link org.eclipse.ltk.ui.refactoring.RefactoringWizard RefactoringWizard}.
 * Adding them to a normal {@linkplain org.eclipse.jface.wizard.Wizard wizard}
 * result in an exception.
 * <p>
 * Note: this class is not intended to be subclassed by clients. Clients should
 * extend {@link org.eclipse.ltk.ui.refactoring.UserInputWizardPage}.
 * </p>
 *
 * @see RefactoringWizard
 * @see org.eclipse.ltk.core.refactoring.Refactoring
 *
 * @noextend This class is not intended to be subclassed by clients.
 */
public abstract class RefactoringWizardPage extends WizardPage {

	public static final String REFACTORING_SETTINGS= "org.eclipse.ltk.ui.refactoring.settings"; //$NON-NLS-1$

	/** Does the page belong to a conventional wizard? */
	private final boolean fConventionalWizard;

	/**
	 * Creates a new refactoring wizard page.
	 * <p>
	 * Note: this constructor is not intended to be used outside the refactoring
	 * framework.
	 * </p>
	 *
	 * @param name
	 *            the page's name.
	 * @param wizard
	 *            <code>true</code> if the page belongs to a conventional wizard, <code>false</code> otherwise
	 * @see org.eclipse.jface.wizard.IWizardPage#getName()
	 *
	 * @since 3.2
	 */
	protected RefactoringWizardPage(String name, boolean wizard) {
		super(name);
		fConventionalWizard= wizard;
	}

	/**
	 * Creates a new refactoring wizard page.
	 *
	 * @param name the page's name.
	 * @see org.eclipse.jface.wizard.IWizardPage#getName()
	 */
	protected RefactoringWizardPage(String name) {
		super(name);
		fConventionalWizard= false;
	}

	/**
	 * {@inheritDoc}
	 *
	 * This method asserts that the wizard passed as a parameter is of
	 * type <code>RefactoringWizard</code>.
	 */
	public void setWizard(IWizard newWizard) {
		Assert.isTrue(fConventionalWizard || newWizard instanceof RefactoringWizard);
		super.setWizard(newWizard);
	}

	/**
	 * Returns the refactoring associated with this wizard page. Returns
	 * <code>null</code> if the page isn't been added to any refactoring
	 * wizard yet.
	 *
	 * @return the refactoring associated with this refactoring wizard page
	 *  or <code>null</code>
	 */
	protected Refactoring getRefactoring() {
		RefactoringWizard wizard= getRefactoringWizard();
		if (wizard == null)
			return null;
		return wizard.getRefactoring();
	}

	/**
	 * Returns the page's refactoring wizard.
	 *
	 * @return the page's refactoring wizard or <code>null</code> if the
	 *         wizard hasn't been set yet
	 */
	protected RefactoringWizard getRefactoringWizard() {
		IWizard wizard= getWizard();
		if (wizard instanceof RefactoringWizard)
			return (RefactoringWizard) wizard;
		return null;
	}

	/**
	 * Performs any actions appropriate in response to the user having pressed
	 * the Finish button, or refuse if finishing now is not permitted. This
	 * method is called by the refactoring wizard on the currently active
	 * refactoring wizard page.
	 *
	 * @return <code>true</code> to indicate the finish request was accepted,
	 *         and <code>false</code> to indicate that the finish request was
	 *         refused
	 */
	protected boolean performFinish() {
		return true;
	}

	/**
	 * Returns the refactoring wizard's dialog settings.
	 *
	 * @return the refactoring wizard's dialog settings or <code>null</code>
	 *  if no settings are associated with the refactoring wizard dialog
	 */
	protected IDialogSettings getRefactoringSettings() {
		IDialogSettings settings= getDialogSettings();
		if (settings == null)
			return null;
		IDialogSettings result= settings.getSection(REFACTORING_SETTINGS);
		if (result == null) {
			result= new DialogSettings(REFACTORING_SETTINGS);
			settings.addSection(result);
		}
		return result;
	}
}
