/*******************************************************************************
 * 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
 *     Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog font should be
 *     activated and used by other components.
 *******************************************************************************/
package org.eclipse.ui.internal.ide.dialogs;

import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
import org.eclipse.ui.internal.ide.misc.WizardStepGroup;

/**
 * This page allows the user to review the steps to be done.
 * <p>
 * Example usage:
 * <pre>
 * mainPage = new MultiStepReviewWizardPage("multiStepReviewPage");
 * mainPage.setTitle("Project");
 * mainPage.setDescription("Review project.");
 * </pre>
 * </p>
 */
public class MultiStepReviewWizardPage extends WizardPage {
    private Text detailsField;

    private Label instructionLabel;

    private WizardStepGroup stepGroup;

    private MultiStepWizard stepWizard;

    /**
     * Creates a new step review wizard page.
     *
     * @param pageName the name of this page
     * @param stepWizard the wizard
     */
    public MultiStepReviewWizardPage(String pageName, MultiStepWizard stepWizard) {
        super(pageName);
        this.stepWizard = stepWizard;
    }

    /* (non-Javadoc)
     * Method declared on IWizardPage
     */
    public boolean canFlipToNextPage() {
        // Already know there is a next page...
        return isPageComplete() && !stepWizard.canFinishOnReviewPage();
    }

    /* (non-Javadoc)
     * Method declared on IDialogPage.
     */
    public void createControl(Composite parent) {
        Composite composite = new Composite(parent, SWT.NULL);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));

        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
                IIDEHelpContextIds.NEW_PROJECT_REVIEW_WIZARD_PAGE);

        createStepGroup(composite);
        createDetailsGroup(composite);
        createInstructionsGroup(composite);

        setControl(composite);
    }

    /**
     * Creates the control for the details
     */
    private void createDetailsGroup(Composite parent) {
        Font font = parent.getFont();
        // Create a composite to hold everything together
        Composite composite = new Composite(parent, SWT.NULL);
        composite.setLayout(new GridLayout());
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));

        // Add a label to identify the details text field
        Label label = new Label(composite, SWT.LEFT);
        label.setText(IDEWorkbenchMessages.MultiStepReviewWizardPage_detailsLabel);
        GridData data = new GridData();
        data.verticalAlignment = SWT.TOP;
        label.setLayoutData(data);
        label.setFont(font);

        // Text field to display the step's details
        detailsField = new Text(composite, SWT.WRAP | SWT.MULTI | SWT.V_SCROLL
                | SWT.BORDER);
        detailsField.setText("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); // prefill to show 15 lines //$NON-NLS-1$
        detailsField.setEditable(false);
        detailsField.setLayoutData(new GridData(GridData.FILL_BOTH));
        detailsField.setFont(font);
    }

    /**
     * Creates the control for the instructions
     */
    private void createInstructionsGroup(Composite parent) {
        instructionLabel = new Label(parent, SWT.LEFT);
        instructionLabel.setText(IDEWorkbenchMessages.MultiStepReviewWizardPage_instructionFinishLabel);
        GridData data = new GridData();
        data.verticalAlignment = SWT.TOP;
        data.horizontalSpan = 2;
        instructionLabel.setLayoutData(data);
        instructionLabel.setFont(parent.getFont());
    }

    /**
     * Creates the control for the step list
     */
    private void createStepGroup(Composite parent) {
        stepGroup = new WizardStepGroup();
        stepGroup.createContents(parent);
        stepGroup.setSelectionListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                if (event.getSelection() instanceof IStructuredSelection) {
                    IStructuredSelection sel = (IStructuredSelection) event
                            .getSelection();
                    WizardStep step = (WizardStep) sel.getFirstElement();
                    if (step != null) {
						detailsField.setText(step.getDetails());
					}
                }
            }
        });
    }

    /**
     * Returns the steps to be displayed.
     */
    /* package */WizardStep[] getSteps() {
        if (stepGroup != null) {
			return stepGroup.getSteps();
		}

        return new WizardStep[0];
    }

    /**
     * Sets the steps to be displayed. Has no effect if
     * the page is not yet created.
     * 
     * @param steps the collection of steps
     */
    /* package */void setSteps(WizardStep[] steps) {
        if (stepGroup != null) {
			stepGroup.setSteps(steps);
		}
    }

    /* (non-Javadoc)
     * Method declared on IDialogPage.
     */
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        if (visible) {
            if (stepWizard.canFinishOnReviewPage()) {
				instructionLabel.setText(IDEWorkbenchMessages.MultiStepReviewWizardPage_instructionFinishLabel);
			} else {
				instructionLabel.setText(IDEWorkbenchMessages.MultiStepReviewWizardPage_instructionNextLabel);
			}
            ((Composite) getControl()).layout(true);
        }
    }
}
