package net.sf.jpluck.ui;
import net.sf.jpluck.swing.GUIUtil;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public abstract class Wizard extends JDialog {
protected JButton backButton = new JButton("< Back");
protected JButton nextButton = new JButton();
protected JButton cancelButton = new JButton("Cancel");
protected Map pageMap = new HashMap();
protected WizardPage currentPage;
private boolean cancelled;
protected CardLayout cardLayout = new CardLayout();
protected JPanel pagePanel = new JPanel();
protected JPanel buttonPanel = new JPanel();
protected Wizard(JFrame owner) {
super(owner);
setModal(true);
setResizable(false);
pagePanel.setLayout(cardLayout);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(pagePanel, BorderLayout.CENTER);
getContentPane().add(buttonPanel, BorderLayout.SOUTH);
ButtonBarBuilder buttonBarBuilder = new ButtonBarBuilder(buttonPanel);
buttonBarBuilder.addGlue();
buttonBarBuilder.addGridded(backButton);
//buttonBarBuilder.addRelatedGap();
buttonBarBuilder.addGridded(nextButton);
buttonBarBuilder.addUnrelatedGap();
buttonBarBuilder.addGridded(cancelButton);
buttonBarBuilder.setDefaultDialogBorder();
backButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
gotoPreviousPage();
}
});
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
gotoNextPage();
}
});
getRootPane().setDefaultButton(nextButton);
Action cancelAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
cancel();
}
};
cancelButton.addActionListener(cancelAction);
GUIUtil.configureEscapeKey(getRootPane(), cancelAction);
addComponentListener(new ComponentAdapter() {
public void componentShown(ComponentEvent e) {
cancelled = false;
}
});
}
public void addPage(WizardPage page) {
pagePanel.add(page, page.getName());
pageMap.put(page.getName(), page);
page.initComponents();
}
protected WizardPage page(String name) {
return (WizardPage) pageMap.get(name);
}
protected void setButtonStates() {
if (isLastPageShowing()) {
nextButton.setText("Finish");
} else {
nextButton.setText("Next >");
}
backButton.setEnabled(!isFirstPageShowing());
}
protected final void gotoPreviousPage() {
exitPage();
cardLayout.previous(pagePanel);
setButtonStates();
enterPage();
}
protected final void gotoNextPage() {
if (!validatePage()) {
return;
}
if (isLastPageShowing()) {
finish();
hide();
}
exitPage();
cardLayout.next(pagePanel);
setButtonStates();
enterPage();
}
protected final void gotoPage(String name) {
exitPage();
cardLayout.show(pagePanel, name);
setButtonStates();
enterPage();
}
protected void showError(Component component, String title, String message) {
component.requestFocus();
JOptionPane.showMessageDialog(component, message, title, JOptionPane.ERROR_MESSAGE);
}
protected void start() {
}
protected void enterPage() {
}
protected void exitPage() {
}
protected void cancel() {
cancelled = true;
hide();
}
protected void finish() {
}
protected boolean validatePage() {
return true;
}
public boolean isCancelled() {
return cancelled;
}
protected abstract boolean isFirstPageShowing();
protected abstract boolean isLastPageShowing();
}