org.eclipse.ui.preferences.WizardPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ui.preferences.WizardPropertyPage.java

Source

/*******************************************************************************
 * Copyright (c) 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 API and implementation
 *******************************************************************************/
package org.eclipse.ui.preferences;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.PropertyPage;

/**
 * The wizard property page can wrap a property page around a wizard.
 * The property page shows the first page of the wizard. It is therefore
 * required, that the wizard consists of exactly one page.
 * 
 * @since 3.4
 */
public abstract class WizardPropertyPage extends PropertyPage {

    private static final class PropertyPageWizardContainer implements IWizardContainer {

        private final IWizard fWizard;
        private final PropertyPage fPage;
        private String fMessage;

        private PropertyPageWizardContainer(PropertyPage page, IWizard wizard) {
            Assert.isLegal(wizard.getPageCount() == 1);

            fPage = page;
            fWizard = wizard;
        }

        public IWizardPage getCurrentPage() {
            return fWizard.getPages()[0];
        }

        public Shell getShell() {
            return fPage.getShell();
        }

        public void showPage(IWizardPage page) {
        }

        public void updateButtons() {
            fPage.setValid(fWizard.canFinish());
        }

        public void updateMessage() {
            IWizardPage page = getCurrentPage();

            String message = fPage.getMessage();
            if (message != null && fMessage == null)
                fMessage = message;

            if (page.getErrorMessage() != null) {
                fPage.setMessage(page.getErrorMessage(), ERROR);
            } else if (page instanceof IMessageProvider) {
                IMessageProvider messageProvider = (IMessageProvider) page;
                if (messageProvider.getMessageType() != IMessageProvider.NONE) {
                    fPage.setMessage(messageProvider.getMessage(), messageProvider.getMessageType());
                } else {
                    if (messageProvider.getMessage() != null && fMessage == null)
                        fMessage = messageProvider.getMessage();

                    fPage.setMessage(fMessage, NONE);
                }
            } else {
                fPage.setErrorMessage(null);
            }
        }

        public void updateTitleBar() {
            IWizardPage page = getCurrentPage();
            String name = page.getTitle();
            if (name == null)
                name = page.getName();

            fPage.setMessage(name);
        }

        public void updateWindowTitle() {
        }

        public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable)
                throws InvocationTargetException, InterruptedException {
            ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell());
            dialog.run(fork, cancelable, runnable);
        }
    }

    private IWizard fWizard;
    private Composite fWizardPageContainer;

    public WizardPropertyPage() {
    }

    /**
     * @return the wizard which is wrapped by this page or <b>null</b> if not yet created
     */
    public IWizard getWizard() {
        return fWizard;
    }

    /**
     * Return a wizard.
     * 
     * @return an instance of the wizard to be wrapped or <b>null</b> if creation failed
     */
    protected abstract IWizard createWizard();

    /**
     * Apply the changes made on the property page
     */
    protected abstract void applyChanges();

    /**
     * {@inheritDoc}
     */
    protected Control createContents(final Composite parent) {
        fWizardPageContainer = new Composite(parent, SWT.NONE);
        fWizardPageContainer.setFont(parent.getFont());
        fWizardPageContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        GridLayout layout = new GridLayout(1, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        fWizardPageContainer.setLayout(layout);

        createWizardPageContent(fWizardPageContainer);

        return fWizardPageContainer;
    }

    private void createWizardPageContent(Composite parent) {
        fWizard = createWizard();
        if (fWizard == null)
            return;

        fWizard.addPages();

        PropertyPageWizardContainer wizardContainer = new PropertyPageWizardContainer(this, fWizard);
        wizardContainer.updateButtons();
        wizardContainer.updateMessage();
        fWizard.setContainer(wizardContainer);

        Composite messageComposite = new Composite(parent, SWT.NONE);
        messageComposite.setFont(parent.getFont());
        messageComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
        GridLayout layout = new GridLayout(1, false);
        layout.marginHeight = 0;
        messageComposite.setLayout(layout);

        Label messageLabel = new Label(messageComposite, SWT.WRAP);
        messageLabel.setFont(messageComposite.getFont());
        messageLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        fWizard.createPageControls(parent);

        IWizardPage page = fWizard.getPages()[0];
        if (page.getControl() == null)
            page.createControl(parent);

        Control pageControl = page.getControl();
        pageControl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        setPageName(page);
        setDescription(page, messageLabel);

        page.setVisible(true);

        setValid(fWizard.canFinish());
    }

    private void setPageName(IWizardPage page) {
        String name = page.getTitle();
        if (name == null)
            name = page.getName();

        setMessage(name);
    }

    private void setDescription(IWizardPage page, Label messageLabel) {
        String description = null;
        if (page.getDescription() != null) {
            description = page.getDescription();
        } else if (page instanceof IMessageProvider) {
            IMessageProvider messageProvider = (IMessageProvider) page;
            if (messageProvider.getMessageType() == IMessageProvider.NONE) {
                description = messageProvider.getMessage();
            }
        }

        if (description != null) {
            messageLabel.setText(description);
        } else {
            messageLabel.setVisible(false);
        }
    }

    /**
     * {@inheritDoc}
     */
    public boolean performOk() {
        fWizard.performFinish();
        applyChanges();
        fWizard.dispose();

        return super.performOk();
    }

    /**
     * {@inheritDoc}
     */
    public boolean performCancel() {
        fWizard.performCancel();
        fWizard.dispose();

        return super.performCancel();
    }

    /**
     * {@inheritDoc}
     */
    protected void performApply() {
        fWizard.performFinish();
        applyChanges();
        fWizard.dispose();

        rebuildWizardPage();

        super.performApply();
    }

    /**
     * {@inheritDoc}
     */
    protected void performDefaults() {
        fWizard.performCancel();
        fWizard.dispose();

        rebuildWizardPage();

        super.performDefaults();
    }

    /**
     * Rebuilds the wizard page
     */
    private void rebuildWizardPage() {
        Control[] children = fWizardPageContainer.getChildren();
        for (int i = 0; i < children.length; i++) {
            children[i].dispose();
        }

        createWizardPageContent(fWizardPageContainer);
        fWizardPageContainer.getParent().layout(true, true);
    }
}