//********************************************************************** // Package //********************************************************************** package org.freixas.jwizard; //********************************************************************** // Import list //********************************************************************** import java.awt.*; import javax.swing.*; /** * This class creates a panel that can be used for a single step in a * Wizard dialog. See the class documentation for JWizardDialog for * more information on using this class together with JWizardDialog. *

* Components added to this panel should be added to the panel * returned by getContentPanel(). *


* This program is free software; you can redistribute it and/or * modify it under the terms of the Artistic License. You should have * received a copy of the Artistic License along with this program. If * not, a copy is available at * * opensource.org. * * @see JWizardDialog * @author Antonio Freixas */ // Copyright © 2004 Antonio Freixas // All Rights Reserved. public class JWizardPanel extends JPanel { //********************************************************************** // Private Members //********************************************************************** // The JWizardDialog parent JWizardDialog dialogParent; // The step title JPanel titlePanel; String stepTitle; JLabel stepTitleLabel; // The content pane JPanel contentPane; // The back and next steps int backStep = -1; int nextStep = -1; // Flags the first time the component is added to a window boolean firstNotify = true; //********************************************************************** // Constructors //********************************************************************** /** * Creates a new JWizardPanel with a double buffer and a flow layout. * The flow layout is assigned to the panel accessed through * getContentPane(). */ public JWizardPanel() { super(); init(new FlowLayout()); } /** * Create a new buffered JWizardPanel with the specified layout * manager. The layout is assigned to the panel accessed through * getContentPane(). * * @param layout The LayoutManager for the content pane. */ public JWizardPanel( LayoutManager layout) { super(); init(layout); } /** * Creates a new JWizardPanel a flow layout and the specified * buffering strategy. If isDoubleBuffered is true, the JWizardPanel * will use a double buffer. The layout is assigned to the panel * accessed through getContentPane(). * * @param isDoubleBuffered True for double-buffering, which uses * additional memory space to achieve fast, flicker-free updates. */ public JWizardPanel( boolean isDoubleBuffered) { super(isDoubleBuffered); init(new FlowLayout()); } /** * Creates a new JWizardPanel with the specified layout manager and * buffering strategy. The layout is assigned to the panel accessed * through getContentPane(). * * @param layout The LayoutManager for the content pane. * @param isDoubleBuffered True for double-buffering, which uses * additional memory space to achieve fast, flicker-free updates. */ public JWizardPanel( LayoutManager layout, boolean isDoubleBuffered) { super(isDoubleBuffered); init(layout); } //********************************************************************** // Public //********************************************************************** /** * Set the title to use for this step. Normally this title would be * unique for each wizards step. * * @param stepTitle The title to use for this step. */ public void setStepTitle( String stepTitle) { this.stepTitle = stepTitle; stepTitleLabel.setText(stepTitle); stepTitleLabel.invalidate(); validate(); } /** * Get the step title to use for this step. * * @return The step title to use for this step. */ public String getStepTitle() { return stepTitle; } /** * Get a JPanel to use for adding your own components to this * WizardPanel. Do not add components directly to the JWizardPanel. * The JPanel uses the layout given in the JWizardPanel constructor. * * @return The JPanel to use for adding components for this wizard * step. */ public JPanel getContentPane() { return contentPane; } /** * Get the wizard step to go to when the Back button is pressed. * * @return The wizard step to go to when the Back button is pressed. */ public int getBackStep() { return backStep; } /** * Set the wizard step to go to when the Back button is pressed. This * should be set in the constructor of the JWizardPanel subclass since * it determines whether the Back button is enabled or not. * * @param backStep The wizard step to go to when the Back button is pressed. */ public void setBackStep( int backStep) { this.backStep = backStep; JWizardDialog dialog = getWizardParent(); if (dialog != null) dialog.setButtonStates(); } /** * Get the wizard step to go to when the Next button is pressed. * * @return The wizard step to go to when the Next button is pressed. */ public int getNextStep() { return nextStep; } /** * Set the wizard step to go to when the Next button is pressed. This * should be set in the constructor of the JWizardPanel subclass since * it determines whether the Next and Finish buttons are enabled or not. * * @param nextStep The wizard step to go to when the Next button is pressed. */ public void setNextStep( int nextStep) { this.nextStep = nextStep; JWizardDialog dialog = getWizardParent(); if (dialog != null) dialog.setButtonStates(); } /** * Returns the JWizardDialog in which this JWizardPanel resides. This * is valid only after the panel has been added to the dialog. * * @return The JWizardDialog in which this JWizardPanel resides. */ public JWizardDialog getWizardParent() { return dialogParent; } /** * Do not call directly. */ public void addNotify() { if (firstNotify) { Font font = stepTitleLabel.getFont(); font = font.deriveFont(Font.BOLD, font.getSize() * 14 / 10); stepTitleLabel.setFont(font); firstNotify = false; } super.addNotify(); } // WizardPanels are equal if they are the same object, so the default // equals() and hashCode() methods are acceptable. I'm not using the // paramString() method for debugging, so the default is OK. //********************************************************************** // Package Public //********************************************************************** /** * Set the JWizardDialog parent for this JWizardPanel. * * @param dialogParent The JWizardPanel parent for this JWizardPanel. */ void setWizardParent( JWizardDialog dialogParent) { this.dialogParent = dialogParent; } /** * Calls makingVisible(). This allows the JWizardDialog to call the * protected method makingVisible(). * * @see #makingVisible() */ void doMakingVisible() { makingVisible(); } /** * Calls back(). This allows the JWizardDialog to call the protected * method back(). * * @see #back() */ void doBack() { back(); } /** * Calls next(). This allows the JWizardDialog to call the protected * method next(). * * @see #next() */ void doNext() { next(); } /** * Calls help(). This allows the JWizardDialog to call the protected * method help(). * * @see #help() */ void doHelp() { help(); } //********************************************************************** // Protected //********************************************************************** /** * Called just prior to making this panel visible. This is a hook in * case information in the panel needs to be created dynamically based * on previous steps. */ protected void makingVisible() { } /** * Called when the Back button is pressed. By default this displays * the wizard step set by setBackStep(). * * @see #setBackStep(int) */ protected void back() { dialogParent.goTo(getBackStep()); } /** * Called when the Next button is pressed. By default this displays * the wizard step set by setNextStep(). * * @see #setNextStep(int) */ protected void next() { dialogParent.goTo(getNextStep()); } /** * Called when the Help button is pressed. By default this does nothing. */ protected void help() { } //********************************************************************** // Private //********************************************************************** /** * Initialize the JWizardPanel. * * @param layout The layout to use. */ private void init( LayoutManager layout) { // Set the layout for the JWizardPanel setLayout(new BorderLayout(0, 5)); // Set the layout for the content area contentPane = new JPanel(layout); // Step title titlePanel = new JPanel(new BorderLayout(0, 5)); titlePanel.add(new JSeparator(), BorderLayout.SOUTH); stepTitleLabel = new JLabel(" "); titlePanel.add(stepTitleLabel); add(titlePanel, BorderLayout.NORTH); add(contentPane); } }