View Javadoc

1   /*
2    * Created on 5-Jun-2005
3    */
4   package ca.spaz.wizard;
5   
6   import java.awt.*;
7   import java.awt.event.*;
8   import java.util.*;
9   
10  import javax.swing.*;
11  
12  import com.aimedia.ui.*;
13  
14  import ca.spaz.util.ToolBox;
15  
16  /***
17   * A Wizard Dialog.
18   * 
19   * A Wizard contains one or more Wizard Panels
20   * When a user clicks 'FINISH' on the last panel,
21   * each Wizard Panel will be called in order, to 
22   * commit it's settings. If the user clicks cancel,
23   * nothing will be called.
24   */
25  public class Wizard extends JDialog implements ICancellable {
26     private String title;
27     private JPanel mainPanel;
28     private JPanel outlinePanel;
29     private JPanel titlePanel;
30     private JPanel contentPanel;
31     private JPanel navPanel;   
32     private JLabel curPanelTitle;
33     private CardLayout contentCards;
34     private Vector wizardPanels;
35     private JButton cancelBtn, nextBtn, prevBtn, finishBtn;
36     private HashMap titleMap;
37     
38     private int curPanel = 0;
39     
40     public Wizard(JFrame parent, String title) {
41        super(parent);
42        this.title = title;
43        setModal(true);
44        setTitle(getTitle());
45        getContentPane().setLayout(new BorderLayout(4,4));
46        getContentPane().add(getMainPanel(), BorderLayout.CENTER);      
47     }
48     
49     public void startWizard() {
50        showPanel(0);
51        pack();
52        ToolBox.centerFrame(this);
53        setVisible(true);
54     }
55     
56     public void addWizardPanel(WizardPanel wp) {     
57        getWizardPanels().add(wp);
58        getWizardPanel().add(wp, wp.getWizardPanelTitle());
59        JLabel wpLabel = makeOutlineLabel(wp);
60        getTitleMap().put(wp, wpLabel);
61        
62        getOutlinePanel().add(wpLabel);
63        getOutlinePanel().add(Box.createVerticalStrut(10));
64     }   
65     
66     private HashMap getTitleMap() {
67        if (titleMap == null) {
68           titleMap = new HashMap();
69        }
70        return titleMap;
71     }
72     
73     private JLabel makeOutlineLabel(WizardPanel wp) {     
74        JLabel label = new JLabel(wp.getWizardPanelTitle());
75        label.setForeground(Color.DARK_GRAY);
76        label.setAlignmentX(0.5f);
77        return label;
78     }
79     
80     private WizardPanel getWizardPanel(int i) {
81        return (WizardPanel)getWizardPanels().get(i);
82     }
83     
84     private void showPanel(int i) {
85        WizardPanel wp = getWizardPanel(curPanel);
86        if (wp != null) {
87           JLabel label = (JLabel)getTitleMap().get(wp);
88           if (label != null) {
89              label.setForeground(Color.DARK_GRAY);
90              label.setFont(label.getFont().deriveFont(Font.PLAIN));
91           }
92        }
93  
94        wp = getWizardPanel(i);
95        assert (wp != null);
96        if (wp != null) {
97           getContentCards().show(getWizardPanel(), wp.getWizardPanelTitle());
98           getCurrentPanelTitleLabel().setText(wp.getWizardPanelTitle());
99        }
100       curPanel = i;
101       getPrevButton().setEnabled(i>0);
102       getNextButton().setEnabled(getWizardPanels().size() > i+1);
103       getFinishButton().setEnabled(getWizardPanels().size() == i+1);
104       JLabel label = (JLabel)getTitleMap().get(wp);
105       if (label != null) {
106          label.setForeground(Color.BLACK);
107          label.setFont(label.getFont().deriveFont(Font.BOLD));
108       }
109    }
110    
111    private Vector getWizardPanels() {
112       if (wizardPanels == null) {
113          wizardPanels = new Vector();
114       }
115       return wizardPanels;
116    }
117    
118    public int getNumPanels() {
119       return getWizardPanels().size();
120    }
121    
122    private void showNext() {
123       if (curPanel < getNumPanels() - 1) {
124          showPanel(curPanel+1);
125       }
126    }
127    
128    private void showPrevious() {
129       if (curPanel > 0) {
130          showPanel(curPanel-1);
131       }
132    }
133    
134    private JPanel getMainPanel() {
135       if (mainPanel == null) {
136          mainPanel = new JPanel(new BorderLayout(4,4));
137          mainPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
138          mainPanel.add(getTitlePanel(), BorderLayout.NORTH);
139          mainPanel.add(getOutlinePanel(), BorderLayout.WEST);
140          mainPanel.add(getWizardPanel(), BorderLayout.CENTER);
141          mainPanel.add(getNavPanel(), BorderLayout.SOUTH);
142       }
143       return mainPanel;
144    }
145    
146    private JLabel getCurrentPanelTitleLabel() {
147       if (curPanelTitle == null) {
148          curPanelTitle = new JLabel("", JLabel.CENTER);
149          curPanelTitle.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
150          curPanelTitle.setFont(curPanelTitle.getFont().deriveFont(Font.BOLD));
151          curPanelTitle.setForeground(Color.WHITE);
152       }
153       return curPanelTitle;
154    }
155    
156    private JPanel getTitlePanel() {
157       if (titlePanel == null) {
158          
159          JLabel titleLabel = new JLabel(getTitle());
160          titleLabel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
161          titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD));
162          titleLabel.setForeground(Color.WHITE);
163          
164          titlePanel = new JPanel(new BorderLayout(4,4));
165          titlePanel.setBackground(Color.BLACK);
166          titlePanel.setBorder(BorderFactory.createRaisedBevelBorder());
167          titlePanel.add(titleLabel, BorderLayout.WEST);
168          titlePanel.add(getCurrentPanelTitleLabel(), BorderLayout.CENTER);
169       }
170       return titlePanel;
171    }
172    
173    private JPanel getOutlinePanel() {
174       if (outlinePanel == null) {
175          outlinePanel = new JPanel();
176          outlinePanel.setLayout(new BoxLayout(outlinePanel, BoxLayout.Y_AXIS));
177          outlinePanel.setBackground(Color.LIGHT_GRAY);
178          outlinePanel.setBorder(BorderFactory.createCompoundBorder(
179                BorderFactory.createEtchedBorder(),
180                BorderFactory.createEmptyBorder(8,8,8,8) ));
181          outlinePanel.add(Box.createRigidArea(new Dimension(120,10)), BorderLayout.CENTER);
182       }
183       return outlinePanel;
184    }
185    
186    private JPanel getWizardPanel() {
187       if (contentPanel == null) {
188          contentPanel = new JPanel(getContentCards());
189          contentPanel.setBorder(BorderFactory.createLoweredBevelBorder());
190          contentPanel.add(Box.createRigidArea(new Dimension(400,300)), BorderLayout.CENTER);
191       }
192       return contentPanel;
193    }   
194    
195    private CardLayout getContentCards() {
196       if (contentCards == null) {
197          contentCards = new CardLayout();
198       }
199       return contentCards;
200    }
201    
202    private JPanel getNavPanel() {
203       if (navPanel == null) {
204          navPanel = new JPanel();
205          navPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
206          navPanel.setLayout(new BoxLayout(navPanel, BoxLayout.X_AXIS));
207          navPanel.add(getCancelButton());
208          navPanel.add(Box.createGlue());
209          navPanel.add(Box.createHorizontalStrut(10));
210          navPanel.add(getPrevButton());
211          navPanel.add(Box.createHorizontalStrut(10));
212          navPanel.add(getNextButton());
213          navPanel.add(Box.createHorizontalStrut(40));
214          navPanel.add(getFinishButton());
215       }
216       return navPanel;
217    }
218 
219    public String getTitle() {
220       return title;
221    }
222    
223    public void doCancel() {
224       dispose();
225    }
226    
227    public void doFinish() {
228       Iterator iter = getWizardPanels().iterator();
229       while (iter.hasNext()) {
230          ((WizardPanel)iter.next()).commitChanges();
231       }
232       dispose();
233    }
234    
235    private JButton getCancelButton() {
236       if (cancelBtn == null) {
237          cancelBtn = new JButton(new CancelAction(this));
238       }
239       return cancelBtn;
240    }
241    
242    private JButton getNextButton() {
243       if (nextBtn == null) {
244          nextBtn = new JButton("Next");
245          nextBtn.addActionListener(new ActionListener() {
246             public void actionPerformed(ActionEvent e) {
247                if (getWizardPanel(curPanel).isValid()) {
248                   showNext();
249                }
250             }            
251          });
252       }
253       return nextBtn;
254    }
255    
256    private JButton getPrevButton() {
257       if (prevBtn == null) {
258          prevBtn = new JButton("Back");
259          prevBtn.setEnabled(false);
260          prevBtn.addActionListener(new ActionListener() {
261             public void actionPerformed(ActionEvent e) {
262                showPrevious(); 
263             }  
264          });
265       }
266       return prevBtn;
267    }
268    
269    private JButton getFinishButton() {
270       if (finishBtn == null) {
271          finishBtn = new JButton("Finish");
272          finishBtn.setEnabled(false);
273          finishBtn.addActionListener(new ActionListener() {
274             public void actionPerformed(ActionEvent e) {
275                if (getWizardPanel(curPanel).isValid()) {
276                   doFinish();
277                }
278             }
279          });
280       }
281       return finishBtn;
282    }
283 }