public void actionPerformed(ActionEvent e) {
   if (e.getSource() == labelField) {
     String newLabel = labelField.getText();
     if (newLabel.equals(parameter.getLabel())) return;
     nodeAttributesDialog.setParameterLabel(parameter, labelField.getText());
   } else if (e.getSource() == helpTextField) {
     String newHelpText = helpTextField.getText();
     if (newHelpText.equals(parameter.getHelpText())) return;
     nodeAttributesDialog.setParameterHelpText(parameter, helpTextField.getText());
   } else if (e.getSource() == widgetBox) {
     HumanizedWidget newWidget = (HumanizedWidget) widgetBox.getSelectedItem();
     if (parameter.getWidget() == newWidget.getWidget()) return;
     nodeAttributesDialog.setParameterWidget(parameter, newWidget.getWidget());
   } else if (e.getSource() == valueField) {
     String newValue = valueField.getText();
     if (parameter.getValue() != null && parameter.getValue().toString().equals(newValue)) return;
     try {
       nodeAttributesDialog.setParameterValue(
           parameter, parameter.parseValue(valueField.getText()));
     } catch (IllegalArgumentException e1) {
       showError("Value " + valueField.getText() + " is invalid: " + e1.getMessage());
     }
   } else if (e.getSource() == enableIfField) {
     String newEnableExpression = enableIfField.getText();
     if (newEnableExpression.equals(parameter.getEnableExpression())) return;
     nodeAttributesDialog.setParameterEnableExpression(parameter, newEnableExpression);
   } else if (e.getSource() == boundingMethodBox) {
     Parameter.BoundingMethod newMethod =
         Parameter.BoundingMethod.valueOf(
             boundingMethodBox.getSelectedItem().toString().toUpperCase(Locale.US));
     if (parameter.getBoundingMethod().equals(newMethod)) return;
     nodeAttributesDialog.setParameterBoundingMethod(parameter, newMethod);
   } else if (e.getSource() == minimumValueCheck) {
     if (minimumValueCheck.isSelected() && parameter.getMinimumValue() != null) return;
     nodeAttributesDialog.setParameterMinimumValue(
         parameter, minimumValueCheck.isSelected() ? 0f : null);
   } else if (e.getSource() == minimumValueField) {
     try {
       float v = Float.parseFloat(minimumValueField.getText());
       if (v == parameter.getMinimumValue()) return;
       nodeAttributesDialog.setParameterMinimumValue(parameter, v);
     } catch (Exception e1) {
       showError("Value " + minimumValueField.getText() + " is invalid: " + e1.getMessage());
     }
   } else if (e.getSource() == maximumValueCheck) {
     if (maximumValueCheck.isSelected() && parameter.getMaximumValue() != null) return;
     nodeAttributesDialog.setParameterMaximumValue(
         parameter, maximumValueCheck.isSelected() ? 0f : null);
   } else if (e.getSource() == maximumValueField) {
     try {
       float v = Float.parseFloat(maximumValueField.getText());
       if (v == parameter.getMaximumValue()) return;
       nodeAttributesDialog.setParameterMaximumValue(parameter, v);
     } catch (Exception e1) {
       showError("Value " + maximumValueField.getText() + " is invalid: " + e1.getMessage());
     }
   } else if (e.getSource() == displayLevelBox) {
     Parameter.DisplayLevel newDisplayLevel =
         Parameter.DisplayLevel.valueOf(
             displayLevelBox.getSelectedItem().toString().toUpperCase(Locale.US));
     if (parameter.getDisplayLevel() == newDisplayLevel) return;
     nodeAttributesDialog.setParameterDisplayLevel(parameter, newDisplayLevel);
   } else if (e.getSource() == addButton) {
     MenuItemDialog dialog = new MenuItemDialog((Dialog) SwingUtilities.getRoot(this));
     dialog.setVisible(true);
     if (dialog.isSuccessful()) {
       nodeAttributesDialog.addParameterMenuItem(parameter, dialog.getKey(), dialog.getLabel());
       menuItemsTable.tableChanged(new TableModelEvent(menuItemsTable.getModel()));
     }
   } else if (e.getSource() == removeButton) {
     Parameter.MenuItem item = parameter.getMenuItems().get(menuItemsTable.getSelectedRow());
     nodeAttributesDialog.removeParameterMenuItem(parameter, item);
   } else if (e.getSource() == upButton) {
     moveItemUp();
   } else if (e.getSource() == downButton) {
     moveItemDown();
   } else {
     throw new AssertionError("Unknown source " + e.getSource());
   }
   updateValues();
 }