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 ; 9 import java.util.Iterator ; 10 import java.util.Enumeration ; 11 import java.util.ArrayList ; 12 import javax.swing.*; 13 import com.toedter.calendar.JCalendar; 14 15 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 CARD_NAME_SINGLE = "single"; 27 protected static final String CARD_NAME_SINGLE_BOOL = "single-bool"; 28 protected static final String CARD_NAME_RANGE = "range"; 29 protected static final String CARD_NAME_LIST = "list"; 30 protected static final String 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 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 74 protected void buildWindow() { 75 getContentPane().add(buildPromptPanel(), BorderLayout.NORTH); 77 getContentPane().add(buildCenterPanel(), BorderLayout.CENTER); 78 79 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 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 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 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 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 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 JPanel fieldPanel = new JPanel(); 215 fieldPanel.setLayout(new GridLayout(0, 1)); 216 217 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 258 protected JRadioButton addRadioButton(String 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 271 protected void fillEditWidgets() { 272 nameField.setText(param.getName()); 273 questionField.setText(param.getQuestion()); 274 275 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 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(); } 310 311 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 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 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 368 protected void selectAndFillCard() { 369 enableLegalArityButtons(); 370 371 CardLayout cardLayout = (CardLayout)cardPanel.getLayout(); 372 Object 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 val = null; 382 val = (objVal instanceof Boolean ) ? (Boolean )objVal 383 : (Boolean )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 DefaultListModel model = (DefaultListModel)list.getModel(); 412 model.clear(); 413 for (Iterator iter = param.defaultValues(); iter.hasNext(); ) 414 model.addElement(iter.next()); 415 break; 416 } 417 } 418 419 427 protected void setField(JTextField f, int which) { 428 Object obj = param.getDefaultValue(which); f.setText(obj == null ? "" : obj.toString()); 430 } 431 432 435 public void actionPerformed(ActionEvent e) { 436 String cmd = e.getActionCommand(); 437 int type = typeFromWidgets(); 438 int arity = arityFromWidgets(); 439 boolean refill = false; 440 441 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 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 defaultValues = new ArrayList (); 480 int type = typeFromWidgets(); 481 int arity = arityFromWidgets(); 482 483 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 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 |