KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jimm > datavision > gui > parameter > ParamEditWin


1 package jimm.datavision.gui.parameter;
2 import jimm.datavision.Parameter;
3 import jimm.datavision.gui.Designer;
4 import jimm.datavision.gui.EditWin;
5 import jimm.datavision.gui.cmd.ParamEditCommand;
6 import jimm.util.I18N;
7 import java.awt.*;
8 import java.awt.event.ActionEvent JavaDoc;
9 import java.util.Iterator JavaDoc;
10 import java.util.Enumeration JavaDoc;
11 import java.util.ArrayList JavaDoc;
12 import javax.swing.*;
13 import com.toedter.calendar.JCalendar;
14
15 /**
16  * A parameter editing dialog box.
17  * <p>
18  *
19  * @author Jim Menard, <a HREF="mailto:jimm@io.com">jimm@io.com</a>
20  */

21 public class ParamEditWin extends EditWin {
22
23 protected static final int HORIZ_GAP = 20;
24 protected static final int VERT_GAP = 20;
25 protected static final int TEXT_FIELD_COLS = 24;
26 protected static final String JavaDoc CARD_NAME_SINGLE = "single";
27 protected static final String JavaDoc CARD_NAME_SINGLE_BOOL = "single-bool";
28 protected static final String JavaDoc CARD_NAME_RANGE = "range";
29 protected static final String JavaDoc CARD_NAME_LIST = "list";
30 protected static final String JavaDoc CARD_NAME_DATE = "date";
31
32 protected Parameter param;
33 protected JTextField nameField;
34 protected JTextField questionField;
35 protected JRadioButton boolRButton;
36 protected JRadioButton stringRButton;
37 protected JRadioButton numericRButton;
38 protected JRadioButton dateRButton;
39 protected JRadioButton singleRButton;
40 protected JRadioButton rangeRButton;
41 protected JRadioButton listSingleRButton;
42 protected JRadioButton listMultipleRButton;
43 protected JPanel cardPanel;
44 protected JTextField singleField;
45 protected JCalendar singleDate;
46 protected JTextField rangeFromField;
47 protected JTextField rangeToField;
48 protected JCalendar rangeFromDate;
49 protected JCalendar rangeToDate;
50 protected JRadioButton boolYesRButton;
51 protected JRadioButton boolNoRButton;
52 protected JList list;
53 protected JTextField listAddField;
54
55 /**
56  * Constructor.
57  *
58  * @param designer the design window to which this dialog belongs
59  * @param p a parameter
60  */

61 public ParamEditWin(Designer designer, Parameter p) {
62     super(designer, I18N.get("ParamEditWin.title"), "ParamEditCommand.name");
63
64     param = p;
65
66     buildWindow();
67     pack();
68     setVisible(true);
69 }
70
71 /**
72  * Builds the window contents.
73  */

74 protected void buildWindow() {
75     // Add edit panes and buttons to window
76
getContentPane().add(buildPromptPanel(), BorderLayout.NORTH);
77     getContentPane().add(buildCenterPanel(), BorderLayout.CENTER);
78
79     // Add OK, Apply, Revert, and Cancel Buttons
80
getContentPane().add(closeButtonPanel(), BorderLayout.SOUTH);
81
82     fillEditWidgets();
83 }
84
85 protected JPanel buildPromptPanel() {
86
87     JPanel panel = new JPanel();
88     panel.setLayout(new BorderLayout());
89
90     // Labels
91
JPanel labelPanel = new JPanel();
92     labelPanel.setLayout(new GridLayout(0, 1));
93     JLabel label;
94     labelPanel.add(label = new JLabel(I18N.get("ParamEditWin.name")));
95     label.setHorizontalAlignment(SwingConstants.RIGHT);
96     labelPanel.add(label = new JLabel(I18N.get("ParamEditWin.question")));
97     label.setHorizontalAlignment(SwingConstants.RIGHT);
98
99     // Edit values
100
JPanel fieldPanel = new JPanel();
101     fieldPanel.setLayout(new GridLayout(0, 1));
102     fieldPanel.add(nameField = new JTextField(TEXT_FIELD_COLS));
103     fieldPanel.add(questionField = new JTextField(TEXT_FIELD_COLS));
104
105     panel.add(labelPanel, BorderLayout.WEST);
106     panel.add(fieldPanel, BorderLayout.CENTER);
107
108     JPanel nonStretchyPanel = new JPanel();
109     nonStretchyPanel.add(panel);
110     return nonStretchyPanel;
111 }
112
113 protected JPanel buildCenterPanel() {
114     JPanel panel = new JPanel();
115     Box box = Box.createHorizontalBox();
116
117     box.add(buildRadioButtonsPanel());
118     box.add(buildCardPanel());
119
120     panel.add(box);
121     return panel;
122 }
123
124 protected JPanel buildRadioButtonsPanel() {
125     JPanel panel = new JPanel();
126
127     // Type radio buttons
128
Box box = Box.createVerticalBox();
129     ButtonGroup bg = new ButtonGroup();
130     box.add(new JLabel("Type"));
131     boolRButton = addRadioButton(I18N.get("ParamEditWin.bool"), box, bg);
132     stringRButton = addRadioButton(I18N.get("ParamEditWin.text"), box, bg);
133     numericRButton = addRadioButton(I18N.get("ParamEditWin.number"), box, bg);
134     dateRButton = addRadioButton(I18N.get("ParamEditWin.date"), box, bg);
135     panel.add(box);
136
137     // Arity radio buttons
138
box = Box.createVerticalBox();
139     box.add(new JLabel(I18N.get("ParamEditWin.arity")));
140     bg = new ButtonGroup();
141     singleRButton = addRadioButton(I18N.get("ParamEditWin.single"), box, bg);
142     rangeRButton = addRadioButton(I18N.get("ParamEditWin.range"), box, bg);
143     listSingleRButton = addRadioButton(I18N.get("ParamEditWin.list_single"),
144                        box, bg);
145     listMultipleRButton = addRadioButton(I18N.get("ParamEditWin.list_mult"),
146                      box, bg);
147     panel.add(box);
148
149     return panel;
150 }
151
152 protected JPanel buildCardPanel() {
153     cardPanel = new JPanel();
154     cardPanel.setLayout(new CardLayout(HORIZ_GAP, VERT_GAP));
155
156     cardPanel.add(boolCard(), CARD_NAME_SINGLE_BOOL);
157     cardPanel.add(singleCard(), CARD_NAME_SINGLE);
158     cardPanel.add(rangeCard(), CARD_NAME_RANGE);
159     cardPanel.add(listCard(), CARD_NAME_LIST);
160     cardPanel.add(dateCard(), CARD_NAME_DATE);
161
162     return cardPanel;
163 }
164
165 protected JPanel dateCard() {
166     JPanel panel = new JPanel();
167     panel.add(new JLabel(I18N.get("ParamEditWin.date_default")));
168     return panel;
169 }
170
171 protected JPanel boolCard() {
172     JPanel panel = new JPanel();
173     panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
174
175     Box box = Box.createVerticalBox();
176     ButtonGroup bg = new ButtonGroup();
177
178     boolYesRButton = new JRadioButton(I18N.get("GUI.yes"));
179     box.add(boolYesRButton);
180     bg.add(boolYesRButton);
181
182     boolNoRButton = new JRadioButton(I18N.get("GUI.no"));
183     box.add(boolNoRButton);
184     bg.add(boolNoRButton);
185
186     panel.add(box);
187     return panel;
188 }
189
190 protected JPanel singleCard() {
191     JPanel panel = new JPanel();
192     panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
193
194     panel.add(new JLabel(I18N.get("ParamEditWin.default_value")));
195     panel.add(singleField = new JTextField(TEXT_FIELD_COLS));
196
197     return panel;
198 }
199
200 protected JPanel rangeCard() {
201     JPanel panel = new JPanel();
202     panel.setLayout(new BorderLayout());
203
204     // Labels
205
JPanel labelPanel = new JPanel();
206     labelPanel.setLayout(new GridLayout(0, 1));
207     JLabel label;
208     labelPanel.add(label = new JLabel(I18N.get("GUI.from")));
209     label.setHorizontalAlignment(SwingConstants.RIGHT);
210     labelPanel.add(label = new JLabel(I18N.get("GUI.to")));
211     label.setHorizontalAlignment(SwingConstants.RIGHT);
212
213     // Edit values
214
JPanel fieldPanel = new JPanel();
215     fieldPanel.setLayout(new GridLayout(0, 1));
216
217     // From and to fields
218
fieldPanel.add(rangeFromField = new JTextField(TEXT_FIELD_COLS));
219     fieldPanel.add(rangeToField = new JTextField(TEXT_FIELD_COLS));
220
221     panel.add(labelPanel, BorderLayout.CENTER);
222     panel.add(fieldPanel, BorderLayout.EAST);
223
224     return panel;
225 }
226
227 protected JPanel listCard() {
228     JPanel panel = new JPanel();
229     Box box = Box.createVerticalBox();
230     panel.add(box);
231
232     list = new JList(new DefaultListModel());
233     list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
234     box.add(new JScrollPane(list));
235
236     JPanel addPanel = new JPanel();
237     JButton button = new JButton(I18N.get("ParamEditWin.add_to_list"));
238     button.addActionListener(this);
239     addPanel.add(button);
240     addPanel.add(listAddField = new JTextField(TEXT_FIELD_COLS));
241     box.add(addPanel);
242
243     button = new JButton(I18N.get("ParamEditWin.remove_from_list"));
244     button.addActionListener(this);
245     box.add(button);
246
247     return panel;
248 }
249
250 /**
251  * Creates and adds a radio buton
252  *
253  * @param name the button name (label)
254  * @param parent a container
255  * @param group the button group
256  * @return the new radio button
257  */

258 protected JRadioButton addRadioButton(String JavaDoc name, Container parent,
259                       ButtonGroup group)
260 {
261     JRadioButton button = new JRadioButton(name);
262     button.addActionListener(this);
263     parent.add(button);
264     group.add(button);
265     return button;
266 }
267
268 /**
269  * Fills all widgets except name and question.
270  */

271 protected void fillEditWidgets() {
272     nameField.setText(param.getName());
273     questionField.setText(param.getQuestion());
274
275     // Select type radio button.
276
int type = param.getType();
277     switch (type) {
278     case Parameter.TYPE_BOOLEAN:
279     boolRButton.setSelected(true);
280     break;
281     case Parameter.TYPE_STRING:
282     stringRButton.setSelected(true);
283     break;
284     case Parameter.TYPE_NUMERIC:
285     numericRButton.setSelected(true);
286     break;
287     case Parameter.TYPE_DATE:
288     dateRButton.setSelected(true);
289     break;
290     }
291
292     // Based on arity, select the appropriate radio button.
293
switch (param.getArity()) {
294     case Parameter.ARITY_ONE:
295     singleRButton.setSelected(true);
296     break;
297     case Parameter.ARITY_RANGE:
298     rangeRButton.setSelected(true);
299     break;
300     case Parameter.ARITY_LIST_SINGLE:
301     listSingleRButton.setSelected(true);
302     break;
303     case Parameter.ARITY_LIST_MULTIPLE:
304     listMultipleRButton.setSelected(true);
305     break;
306     }
307
308     selectAndFillCard(); // Select card and fill card contents
309
}
310
311 /**
312  * Returns one of the <code>Parameter</code> constants
313  * <code>TYPE_BOOLEAN</code>, <code>TYPE_STRING</code>,
314  * <code>TYPE_NUMERIC</code>, or <code>TYPE_DATE</code> based on the state
315  * of the GUI.
316  *
317  * @return one of the <code>Parameter</code> constants
318  * <code>TYPE_BOOLEAN</code>, <code>TYPE_STRING</code>,
319  * <code>TYPE_NUMERIC</code>, or <code>TYPE_DATE</code> based on the state
320  * of the GUI
321  */

322 protected int typeFromWidgets() {
323     if (boolRButton.isSelected()) return Parameter.TYPE_BOOLEAN;
324     if (stringRButton.isSelected()) return Parameter.TYPE_STRING;
325     if (numericRButton.isSelected()) return Parameter.TYPE_NUMERIC;
326     else return Parameter.TYPE_DATE;
327 }
328
329 /**
330  * Returns one of the {@link Parameter} constants <code>ARITY_ONE</code>,
331  * <code>ARITY_RANGE</code>, <code>ARITY_LIST_SINGLE</code>, or
332  * <code>ARITY_LIST_MULTIPLE</code> based on the state of the GUI.
333  *
334  * @return one of the <code>Parameter</code> constants <code>ARITY_ONE</code>,
335  * <code>ARITY_RANGE</code>, <code>ARITY_LIST_SINGLE</code>, or
336  * <code>ARITY_LIST_MULTIPLE</code> based on the state of the GUI
337  */

338 protected int arityFromWidgets() {
339     if (singleRButton.isSelected()) return Parameter.ARITY_ONE;
340     if (rangeRButton.isSelected()) return Parameter.ARITY_RANGE;
341     if (listSingleRButton.isSelected()) return Parameter.ARITY_LIST_SINGLE;
342     else return Parameter.ARITY_LIST_MULTIPLE;
343 }
344
345
346 /**
347  * Enables only legal arity radio buttons.
348  */

349 protected void enableLegalArityButtons() {
350     int type = typeFromWidgets();
351     singleRButton.setEnabled(param.isLegal(type, Parameter.ARITY_ONE));
352     rangeRButton.setEnabled(param.isLegal(type, Parameter.ARITY_RANGE));
353     listSingleRButton
354     .setEnabled(param.isLegal(type, Parameter.ARITY_LIST_SINGLE));
355     listMultipleRButton
356     .setEnabled(param.isLegal(type, Parameter.ARITY_LIST_MULTIPLE));
357 }
358
359
360 /**
361  * Based on type and arity, selects proper card and fills card contents.
362  * Enables/disables the arity radion buttons based on legal choices.
363  * <p>
364  * Since we could be switching from one parameter type to another, we
365  * have to do some checking along the way to see if the parameter's default
366  * value is of the correct type.
367  */

368 protected void selectAndFillCard() {
369     enableLegalArityButtons();
370
371     CardLayout cardLayout = (CardLayout)cardPanel.getLayout();
372     Object JavaDoc objVal;
373     int type = typeFromWidgets();
374
375     switch (arityFromWidgets()) {
376     case Parameter.ARITY_ONE:
377     switch (type) {
378     case Parameter.TYPE_BOOLEAN:
379         cardLayout.show(cardPanel, CARD_NAME_SINGLE_BOOL);
380         objVal = param.getDefaultValue(0);
381         Boolean JavaDoc val = null;
382         val = (objVal instanceof Boolean JavaDoc) ? (Boolean JavaDoc)objVal
383         : (Boolean JavaDoc)param.getDefaultForType(type);
384         if (val != null && val.booleanValue())
385         boolYesRButton.setSelected(true);
386         else
387         boolNoRButton.setSelected(true);
388         break;
389     case Parameter.TYPE_DATE:
390         cardLayout.show(cardPanel, CARD_NAME_DATE);
391         break;
392     default:
393         cardLayout.show(cardPanel, CARD_NAME_SINGLE);
394         setField(singleField, 0);
395         break;
396     }
397     break;
398     case Parameter.ARITY_RANGE:
399     if (type == Parameter.TYPE_DATE)
400         cardLayout.show(cardPanel, CARD_NAME_DATE);
401     else
402         cardLayout.show(cardPanel, CARD_NAME_RANGE);
403     setField(rangeFromField, 0);
404     setField(rangeToField, 1);
405     break;
406     case Parameter.ARITY_LIST_SINGLE:
407     case Parameter.ARITY_LIST_MULTIPLE:
408     cardLayout.show(cardPanel, CARD_NAME_LIST);
409
410     // Erase list and re-fill it
411
DefaultListModel model = (DefaultListModel)list.getModel();
412     model.clear();
413     for (Iterator JavaDoc iter = param.defaultValues(); iter.hasNext(); )
414         model.addElement(iter.next());
415     break;
416     }
417 }
418
419 /**
420  * Fills the specified text field with the nth parameter default value.
421  * If the value is <code>null</code>, "fill" the text field with the
422  * empty string.
423  *
424  * @param f the text field
425  * @param which n
426  */

427 protected void setField(JTextField f, int which) {
428     Object JavaDoc obj = param.getDefaultValue(which); // Default value
429
f.setText(obj == null ? "" : obj.toString());
430 }
431
432 /**
433  * Handles radio buttons.
434  */

435 public void actionPerformed(ActionEvent JavaDoc e) {
436     String JavaDoc cmd = e.getActionCommand();
437     int type = typeFromWidgets();
438     int arity = arityFromWidgets();
439     boolean refill = false;
440
441     // Type changes. When the type changes, make sure the new type and
442
// selected arity are a legal combination. If not, change the arity.
443
if (cmd.equals(I18N.get("ParamEditWin.bool"))
444     || cmd.equals(I18N.get("ParamEditWin.text"))
445     || cmd.equals(I18N.get("ParamEditWin.number"))
446     || cmd.equals(I18N.get("ParamEditWin.date")))
447     {
448     refill = true;
449     if (!param.isLegal(type, arity))
450         singleRButton.setSelected(true);
451     }
452
453     // Arity changes. The user can't pick an illegal combination because
454
// we make sure of that in selectAndFillCard().
455
else if (cmd.equals(I18N.get("ParamEditWin.single"))
456          || cmd.equals(I18N.get("ParamEditWin.range"))
457          || cmd.equals(I18N.get("ParamEditWin.list_single"))
458          || cmd.equals(I18N.get("ParamEditWin.list_mult")))
459     refill = true;
460
461     else if (cmd.equals(I18N.get("ParamEditWin.add_to_list"))) {
462     ((DefaultListModel)list.getModel()).addElement(listAddField.getText());
463     listAddField.setText("");
464     }
465
466     else if (cmd.equals(I18N.get("ParamEditWin.remove_from_list"))) {
467     ((DefaultListModel)list.getModel())
468         .removeElement(list.getSelectedValue());
469     }
470     else {
471     super.actionPerformed(e);
472     }
473
474     if (refill)
475     selectAndFillCard();
476 }
477
478 protected void doSave() {
479     ArrayList JavaDoc defaultValues = new ArrayList JavaDoc();
480     int type = typeFromWidgets();
481     int arity = arityFromWidgets();
482
483     // Create list of new default values.
484
switch (arity) {
485     case Parameter.ARITY_ONE:
486     switch (type) {
487     case Parameter.TYPE_BOOLEAN:
488         defaultValues.add(Boolean.valueOf(boolYesRButton.isSelected()));
489     case Parameter.TYPE_DATE:
490         break;
491     default:
492         defaultValues.add(singleField.getText());
493         break;
494     }
495     break;
496     case Parameter.ARITY_RANGE:
497     defaultValues.add(rangeFromField.getText());
498     defaultValues.add(rangeToField.getText());
499     break;
500     case Parameter.ARITY_LIST_SINGLE:
501     case Parameter.ARITY_LIST_MULTIPLE:
502     DefaultListModel model = (DefaultListModel)list.getModel();
503     for (Enumeration JavaDoc e = model.elements(); e.hasMoreElements(); )
504         defaultValues.add(e.nextElement());
505     break;
506     }
507
508     ParamEditCommand cmd =
509     new ParamEditCommand(param, nameField.getText(),
510                  questionField.getText(), type, arity,
511                  defaultValues);
512     cmd.perform();
513     commands.add(cmd);
514 }
515
516 protected void doRevert() {
517     fillEditWidgets();
518 }
519
520 }
521
Popular Tags