| /******************************************************************************* |
| * Copyright (c) 2000, 2003 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jface.wizard; |
| |
| import org.eclipse.jface.dialogs.DialogPage; |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.util.Assert; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.widgets.Shell; |
| |
| /** |
| * An abstract base implementation of a wizard page. |
| * <p> |
| * Subclasses must implement the <code>createControl</code> method |
| * to create the specific controls for the wizard page. |
| * </p> |
| * <p> |
| * Subclasses may call the following methods to configure the wizard page: |
| * <ul> |
| * <li><code>setDescription</code></li> |
| * <li><code>setErrorMessage</code></li> |
| * <li><code>setImageDescriptor</code></li> |
| * <li><code>setMessage</code></li> |
| * <li><code>setPageComplete</code></li> |
| * <li><code>setPreviousPage</code></li> |
| * <li><code>setTitle</code></li> |
| * </ul> |
| * </p> |
| * <p> |
| * Subclasses may override these methods if required: |
| * <ul> |
| * <li><code>performHelp</code> - may be reimplemented to display help for the page</li> |
| * <li><code>canFlipToNextPage</code> - may be extended or reimplemented</li> |
| * <li><code>isPageComplete</code> - may be extended </li> |
| * <li><code>setDescription</code> - may be extended </li> |
| * <li><code>setTitle</code> - may be extended </li> |
| * <li><code>dispose</code> - may be extended to dispose additional allocated SWT resources</li> |
| * </ul> |
| * </p> |
| * <p> |
| * Note that clients are free to implement <code>IWizardPage</code> from scratch |
| * instead of subclassing <code>WizardPage</code>. Correct implementations of |
| * <code>IWizardPage</code> will work with any correct implementation of |
| * <code>IWizard</code>. |
| * </p> |
| */ |
| public abstract class WizardPage extends DialogPage implements IWizardPage { |
| |
| /** |
| * This page's name. |
| */ |
| private String name; |
| |
| /** |
| * The wizard to which this page belongs; <code>null</code> |
| * if this page has yet to be added to a wizard. |
| */ |
| private IWizard wizard = null; |
| |
| /** |
| * Indicates whether this page is complete. |
| */ |
| private boolean isPageComplete = true; |
| |
| /** |
| * The page that was shown right before this page became visible; |
| * <code>null</code> if none. |
| */ |
| private IWizardPage previousPage = null; |
| |
| /** |
| * Creates a new wizard page with the given name, and |
| * with no title or image. |
| * |
| * @param pageName the name of the page |
| */ |
| protected WizardPage(String pageName) { |
| this(pageName, null, (ImageDescriptor) null); |
| } |
| /** |
| * Creates a new wizard page with the given name, title, and image. |
| * |
| * @param pageName the name of the page |
| * @param title the title for this wizard page, |
| * or <code>null</code> if none |
| * @param titleImage the image descriptor for the title of this wizard page, |
| * or <code>null</code> if none |
| */ |
| protected WizardPage( |
| String pageName, |
| String title, |
| ImageDescriptor titleImage) { |
| super(title, titleImage); |
| Assert.isNotNull(pageName); // page name must not be null |
| name = pageName; |
| } |
| /** |
| * The <code>WizardPage</code> implementation of this <code>IWizardPage</code> |
| * method returns <code>true</code> if this page is complete (<code>isPageComplete</code>) |
| * and there is a next page to flip to. Subclasses may override (extend or reimplement). |
| * |
| * @see #getNextPage |
| * @see #isPageComplete |
| */ |
| public boolean canFlipToNextPage() { |
| return isPageComplete() && getNextPage() != null; |
| } |
| /** |
| * Returns the wizard container for this wizard page. |
| * |
| * @return the wizard container, or <code>null</code> if this |
| * wizard page has yet to be added to a wizard, or the |
| * wizard has yet to be added to a container |
| */ |
| protected IWizardContainer getContainer() { |
| if (wizard == null) |
| return null; |
| return wizard.getContainer(); |
| } |
| /** |
| * Returns the dialog settings for this wizard page. |
| * |
| * @return the dialog settings, or <code>null</code> if none |
| */ |
| protected IDialogSettings getDialogSettings() { |
| if (wizard == null) |
| return null; |
| return wizard.getDialogSettings(); |
| } |
| /* (non-Javadoc) |
| * Method declared on IDialogPage. |
| */ |
| public Image getImage() { |
| Image result = super.getImage(); |
| |
| if (result == null && wizard != null) |
| return wizard.getDefaultPageImage(); |
| |
| return result; |
| } |
| /* (non-Javadoc) |
| * Method declared on IWizardPage. |
| */ |
| public String getName() { |
| return name; |
| } |
| /* (non-Javadoc) |
| * Method declared on IWizardPage. |
| * The default behavior is to ask the wizard for the next page. |
| */ |
| public IWizardPage getNextPage() { |
| if (wizard == null) |
| return null; |
| return wizard.getNextPage(this); |
| } |
| /* (non-Javadoc) |
| * Method declared on IWizardPage. |
| * The default behavior is return the cached previous back or, |
| * lacking that, to ask the wizard for the previous page. |
| */ |
| public IWizardPage getPreviousPage() { |
| if (previousPage != null) |
| return previousPage; |
| |
| if (wizard == null) |
| return null; |
| |
| return wizard.getPreviousPage(this); |
| } |
| /** |
| * The <code>WizardPage</code> implementation of this method declared on |
| * <code>DialogPage</code> returns the shell of the container. |
| * The advantage of this implementation is that the shell is accessable |
| * once the container is created even though this page's control may not |
| * yet be created. |
| */ |
| public Shell getShell() { |
| |
| IWizardContainer container = getContainer(); |
| if (container == null) |
| return null; |
| |
| // Ask the wizard since our contents may not have been created. |
| return container.getShell(); |
| } |
| /* (non-Javadoc) |
| * Method declared on IWizardPage. |
| */ |
| public IWizard getWizard() { |
| return wizard; |
| } |
| /** |
| * Returns whether this page is the current one in the wizard's container. |
| * |
| * @return <code>true</code> if the page is active, |
| * and <code>false</code> otherwise |
| */ |
| protected boolean isCurrentPage() { |
| return ( |
| getContainer() != null && this == getContainer().getCurrentPage()); |
| } |
| /** |
| * The <code>WizardPage</code> implementation of this <code>IWizard</code> method |
| * returns the value of an internal state variable set by |
| * <code>setPageComplete</code>. Subclasses may extend. |
| */ |
| public boolean isPageComplete() { |
| return isPageComplete; |
| } |
| /** |
| * The <code>WizardPage</code> implementation of this <code>IDialogPage</code> |
| * method extends the <code>DialogPage</code> implementation to update |
| * the wizard container title bar. Subclasses may extend. |
| */ |
| public void setDescription(String description) { |
| super.setDescription(description); |
| if (isCurrentPage()) |
| getContainer().updateTitleBar(); |
| } |
| /** |
| * The <code>WizardPage</code> implementation of this method |
| * declared on <code>DialogPage</code> updates the container |
| * if this is the current page. |
| */ |
| public void setErrorMessage(String newMessage) { |
| super.setErrorMessage(newMessage); |
| if (isCurrentPage()) { |
| getContainer().updateMessage(); |
| } |
| } |
| /** |
| * The <code>WizardPage</code> implementation of this method |
| * declared on <code>DialogPage</code> updates the container |
| * if this page is the current page. |
| */ |
| public void setImageDescriptor(ImageDescriptor image) { |
| super.setImageDescriptor(image); |
| if (isCurrentPage()) |
| getContainer().updateTitleBar(); |
| } |
| /** |
| * The <code>WizardPage</code> implementation of this method |
| * declared on <code>DialogPage</code> updates the container |
| * if this is the current page. |
| */ |
| public void setMessage(String newMessage, int newType) { |
| super.setMessage(newMessage, newType); |
| if (isCurrentPage()) |
| getContainer().updateMessage(); |
| } |
| /** |
| * Sets whether this page is complete. |
| * <p> |
| * This information is typically used by the wizard to decide |
| * when it is okay to move on to the next page or finish up. |
| * </p> |
| * |
| * @param complete <code>true</code> if this page is complete, and |
| * and <code>false</code> otherwise |
| * @see #isPageComplete |
| */ |
| public void setPageComplete(boolean complete) { |
| isPageComplete = complete; |
| if (isCurrentPage()) |
| getContainer().updateButtons(); |
| } |
| /* (non-Javadoc) |
| * Method declared on IWizardPage. |
| */ |
| public void setPreviousPage(IWizardPage page) { |
| previousPage = page; |
| } |
| /** |
| * The <code>WizardPage</code> implementation of this <code>IDialogPage</code> |
| * method extends the <code>DialogPage</code> implementation to update |
| * the wizard container title bar. Subclasses may extend. |
| */ |
| public void setTitle(String title) { |
| super.setTitle(title); |
| if (isCurrentPage()) { |
| getContainer().updateTitleBar(); |
| } |
| } |
| /* (non-Javadoc) |
| * Method declared on IWizardPage. |
| */ |
| public void setWizard(IWizard newWizard) { |
| wizard = newWizard; |
| } |
| /** |
| * Returns a printable representation of this wizard page suitable |
| * only for debug purposes. |
| */ |
| public String toString() { |
| return name; |
| } |
| } |