Click
Click Examples

Source Viewer : WEB-INF/classes/org/apache/click/examples/page/wizard/WizardPage.java

package org.apache.click.examples.page.wizard;

import java.util.List;
import org.apache.click.element.CssImport;
import org.apache.click.examples.page.BorderPage;
import org.apache.click.util.HtmlStringBuffer;

/**
 * This Page manages steps in a wizard process.
 */
public class WizardPage extends BorderPage {

    private static final long serialVersionUID = 1L;

    /** Current step in the process. */
    private Step currentStep;

    public static final String STEP1_DESC = "Client";
    public static final String STEP2_DESC = "Address";
    public static final String STEP3_DESC = "Confirmation";

    public static final String STEP1_LABEL = "Step 1";
    public static final String STEP2_LABEL = "Step 2";
    public static final String STEP3_LABEL = "Step 3";

    public String[] stepDescriptions = {STEP1_DESC, STEP2_DESC, STEP3_DESC};
    public String[] stepLabels = {STEP1_LABEL, STEP2_LABEL, STEP3_LABEL};

    private int numberOfSteps = stepDescriptions.length;

    private int currentStepIndex = 0;

    // Constructor ------------------------------------------------------------

    /**
     * Default constructor.
     */
    public WizardPage() {
        // Lookup step ID; defaults to "0"
        int stepId = WizardUils.restoreActiveStepIndex();
        setCurrentStepIndex(stepId);

        //setCurrentStep(steps.get(stepIndex));

        // Initialize all the steps
        /*
        Iterator it = steps.iterator();
        while(it.hasNext()) {
            Step step = (Step) it.next();
            step.init();
        }
         *
         */
    }

    // Public Methods ---------------------------------------------------------

    /**
     * Return the current step.
     *
     * @return the current step
     */
    public Step getCurrentStep() {
        return currentStep;
    }

    /**
     * Sets the current Step to the specified Step.
     *
     * @param stepIndex the current step index to set
     */
    public void setCurrentStepIndex(int stepIndex) {
        // Store step index for subsequent requests
        WizardUils.saveActiveStepIndex(stepIndex);
        currentStepIndex = stepIndex;

        if (currentStep != null) {
            removeControl(currentStep);
        }
        getModel().remove("heading");

        if (stepIndex == 0) {
            currentStep = new Step1("step", STEP1_LABEL, STEP1_DESC, this);

        } else if (stepIndex == 1) {
            currentStep = new Step2("step", STEP2_LABEL, STEP2_DESC, this);

        } else if (stepIndex == 2) {
            currentStep = new Step3("step", STEP3_LABEL, STEP3_DESC, this);
        }
        currentStep.init();

        // Add the new step to the page list of controls
        addControl(currentStep);
        addModel("heading", getHeading());
    }

    /**
     * Return true if there is another step before the specified step.
     *
     * @return true if there is another step before the specified step
     */
    public boolean hasPreviousStep() {
        return currentStepIndex > 0;
    }

    /**
     * Return true if there is another step after the specified step.
     *
     * @return true if there is another step after the specified step
     */
    public boolean hasNextStep() {
        return !isLastStep();
    }

    /**
     * Return true if the specified step is the last step in the process.
     *
     * @return true if the specified step is the last step in the process
     */
    public boolean isLastStep() {
        // currentStepIndex is a zero based index. Add 1 when comparing to
        // numberOfSteps
        return (numberOfSteps == currentStepIndex + 1);
    }

    /**
     * Goto previous step.
     */
    public void previous() {
        if (currentStepIndex > 0) {
            setCurrentStepIndex(--currentStepIndex);
        }
    }

    /**
     * Goto next step.
     */
    public void next() {
        if (currentStepIndex < numberOfSteps - 1) {
            setCurrentStepIndex(++currentStepIndex);
        }
    }

    /**
     * Return the page stylesheet: wizard.css.
     *
     * @return the page stylesheet
     */
    @Override
    public List getHeadElements() {
        if (headElements == null) {
            headElements = super.getHeadElements();
            headElements.add(new CssImport("/wizard/wizard.css"));
        }
        return headElements;
    }

    // Private Methods --------------------------------------------------------

    /**
     * Return an HTML representation of the wizard steps as an Html List <ul>.
     * The current step is assigned a special CSS class so it can be highlighted
     * through CSS.
     */
    private String getHeading() {
        HtmlStringBuffer buffer = new HtmlStringBuffer();
        buffer.append("<ul id=\"steps\">");
        for (int i = 0; i < stepDescriptions.length; i++) {
            String stepDescription = stepDescriptions[i];
            String stepLabel = stepLabels[i];

            buffer.elementStart("li");
            if (stepDescription.equals(currentStep.getDescription())) {
                buffer.appendAttribute("class", "current");
            }
            buffer.closeTag();
            buffer.append(stepDescription);
            buffer.elementStart("span");
            buffer.closeTag();
            buffer.append(stepLabel);
            buffer.elementEnd("span");
            buffer.elementEnd("li");
        }
        buffer.append("</ul>");
        return buffer.toString();
    }
}