/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2013 Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.gui.swing.parameters.creator; import org.geotoolkit.gui.swing.etl.JClassCellRenderer; import org.geotoolkit.gui.swing.parameters.ParameterType; import java.awt.BorderLayout; import java.awt.Color; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import javax.swing.SpinnerNumberModel; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.apache.sis.feature.FeatureExt; import org.geotoolkit.gui.swing.propertyedit.JAttributeEditor; import org.geotoolkit.gui.swing.propertyedit.featureeditor.PropertyValueEditor; import org.geotoolkit.gui.swing.resource.MessageBundle; import org.geotoolkit.processing.chain.model.ChainDataTypes; import org.jdesktop.swingx.combobox.ListComboBoxModel; import org.opengis.parameter.ParameterDescriptor; /** * * @author Quentin Boileau (Geomatys) */ public class JParameterDescriptorEditorPanel extends javax.swing.JPanel implements DocumentListener, ChangeListener, PropertyChangeListener { private GeneralParameterDescriptorPanel parameterPanel; private ParameterType type; // Last value for class private Class oldType = null; private boolean editable = true; public JParameterDescriptorEditorPanel(final List<PropertyValueEditor> availableEditors) { initComponents(); guiGroupRemarkTA.setLineWrap(true); guiRemarkTA.setLineWrap(true); guiTypeCB.setModel(new ListComboBoxModel(ChainDataTypes.VALID_TYPES)); guiTypeCB.setSelectedItem(String.class); guiTypeCB.setRenderer(new JClassCellRenderer()); //if avaibleEditors is defined and not empty, use them. if (availableEditors != null && !availableEditors.isEmpty()) { defaultValueEditor.getEditors().clear(); defaultValueEditor.getEditors().addAll(availableEditors); } guiMinOccursSp.setModel(new SpinnerNumberModel(1, 0, Integer.MAX_VALUE, 1)); guiMaxOccursSp.setModel(new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 1)); setEditableParameter(editable); addListeners(); } /** * Enable/disable fields. * * @param editable */ private final void setEditableParameter(boolean editable) { this.editable = editable; guiCodeTF.setEnabled(editable); guiRemarkTA.setEnabled(editable); guiMandatory.setEnabled(editable); guiTypeCB.setEnabled(editable); defaultValueEditor.setEnabled(editable); guiGroupCodeTF.setEnabled(editable); guiGroupRemarkTA.setEnabled(editable); guiMaxOccursSp.setEnabled(editable); guiMinOccursSp.setEnabled(editable); } /** * Remove change listeners from all fields */ private void removeListeners() { guiCodeTF.getDocument().removeDocumentListener(this); guiRemarkTA.getDocument().removeDocumentListener(this); guiMandatory.removeChangeListener(this); defaultValueEditor.removePropertyChangeListener(this); guiGroupCodeTF.getDocument().removeDocumentListener(this); guiGroupRemarkTA.getDocument().removeDocumentListener(this); guiMaxOccursSp.removeChangeListener(this); guiMinOccursSp.removeChangeListener(this); } /** * Add change listeners to all fields */ private void addListeners() { //bind Creator panel to fields changes guiCodeTF.getDocument().putProperty("source", "guiCodeTF"); guiCodeTF.getDocument().addDocumentListener(this); guiRemarkTA.getDocument().putProperty("source", "guiRemarkTA"); guiRemarkTA.getDocument().addDocumentListener(this); guiMandatory.addChangeListener(this); defaultValueEditor.addPropertyChangeListener(this); guiGroupCodeTF.getDocument().putProperty("source", "guiGroupCodeTF"); guiGroupCodeTF.getDocument().addDocumentListener(this); guiGroupRemarkTA.getDocument().putProperty("source", "guiGroupRemarkTA"); guiGroupRemarkTA.getDocument().addDocumentListener(this); guiMaxOccursSp.addChangeListener(this); guiMinOccursSp.addChangeListener(this); } public void editParameter(final GeneralParameterDescriptorPanel parameterPanel, boolean editable) { this.parameterPanel = parameterPanel; this.type = (parameterPanel instanceof JParameterDescriptorGroupPanel) ? ParameterType.GROUP : ParameterType.SIMPLE; removeListeners(); updateCreatorForm(); setEditableParameter(editable); addListeners(); } private void updateCreatorForm() { contentPanel.removeAll(); if (type.equals(ParameterType.SIMPLE)) { final JParameterDescriptorPanel param = (JParameterDescriptorPanel) parameterPanel; oldType = param.getType(); guiCodeTF.setText(param.getCode()); guiRemarkTA.setText(param.getRemarks()); guiMandatory.setSelected(param.isMandatory()); guiTypeCB.setSelectedItem(param.getType()); defaultValueEditor.setProperty(FeatureExt.toProperty(((ParameterDescriptor)param.getDescriptor()).createValue())); contentPanel.add(BorderLayout.CENTER,parameterEditPanel); } else { final JParameterDescriptorGroupPanel paramGroup = (JParameterDescriptorGroupPanel) parameterPanel; guiGroupCodeTF.setText(paramGroup.getCode()); guiGroupRemarkTA.setText(paramGroup.getRemarks()); guiMinOccursSp.setValue(paramGroup.getMinOccurs()); guiMaxOccursSp.setValue(paramGroup.getMaxOccurs()); contentPanel.add(BorderLayout.CENTER,parameterGroupEditPanel); } revalidate(); repaint(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { parameterEditPanel = new javax.swing.JPanel(); guiCodeLbl = new javax.swing.JLabel(); guiCodeTF = new javax.swing.JTextField(); guiClassLbl = new javax.swing.JLabel(); guiTypeCB = new javax.swing.JComboBox(); guiRemarkLbl = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); guiRemarkTA = new javax.swing.JTextArea(); guiMandatory = new javax.swing.JCheckBox(); guiMandatoryLbl = new javax.swing.JLabel(); guiDefaultValueLbl = new javax.swing.JLabel(); defaultValueEditor = new org.geotoolkit.gui.swing.propertyedit.JAttributeEditor(); parameterGroupEditPanel = new javax.swing.JPanel(); guiGroupCodeTF = new javax.swing.JTextField(); guiGroupCodeLbl = new javax.swing.JLabel(); jScrollPane2 = new javax.swing.JScrollPane(); guiGroupRemarkTA = new javax.swing.JTextArea(); guiGroupRemarkLbl = new javax.swing.JLabel(); guiGroupMinOccurs = new javax.swing.JLabel(); guiGroupMaxOccurs = new javax.swing.JLabel(); guiMinOccursSp = new javax.swing.JSpinner(); guiMaxOccursSp = new javax.swing.JSpinner(); guiGroupOccurencesLbl = new javax.swing.JLabel(); contentPanel = new javax.swing.JPanel(); guiCodeLbl.setLabelFor(guiCodeTF); org.openide.awt.Mnemonics.setLocalizedText(guiCodeLbl, MessageBundle.format("parameters_code")); // NOI18N guiCodeLbl.setFocusable(false); guiClassLbl.setLabelFor(guiTypeCB); org.openide.awt.Mnemonics.setLocalizedText(guiClassLbl, MessageBundle.format("parameters_type")); // NOI18N guiClassLbl.setFocusable(false); guiTypeCB.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { guiTypeCBActionPerformed(evt); } }); guiRemarkLbl.setLabelFor(guiRemarkTA); org.openide.awt.Mnemonics.setLocalizedText(guiRemarkLbl, MessageBundle.format("parameters_description")); // NOI18N guiRemarkLbl.setFocusable(false); guiRemarkTA.setColumns(20); guiRemarkTA.setRows(5); jScrollPane1.setViewportView(guiRemarkTA); guiMandatory.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING); guiMandatoryLbl.setLabelFor(guiMandatory); org.openide.awt.Mnemonics.setLocalizedText(guiMandatoryLbl, MessageBundle.format("parameters_mandatory")); // NOI18N guiMandatoryLbl.setFocusable(false); org.openide.awt.Mnemonics.setLocalizedText(guiDefaultValueLbl, MessageBundle.format("parameters_defaultValue")); // NOI18N defaultValueEditor.setBorder(null); javax.swing.GroupLayout parameterEditPanelLayout = new javax.swing.GroupLayout(parameterEditPanel); parameterEditPanel.setLayout(parameterEditPanelLayout); parameterEditPanelLayout.setHorizontalGroup( parameterEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(parameterEditPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(parameterEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(guiCodeLbl) .addComponent(guiClassLbl) .addComponent(guiRemarkLbl) .addComponent(guiDefaultValueLbl) .addComponent(guiMandatoryLbl)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(parameterEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(guiCodeTF) .addComponent(guiMandatory, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(guiTypeCB, 0, 1, Short.MAX_VALUE) .addComponent(jScrollPane1) .addComponent(defaultValueEditor, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); parameterEditPanelLayout.setVerticalGroup( parameterEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(parameterEditPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(parameterEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(guiMandatoryLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(guiMandatory)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(parameterEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(guiCodeTF, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(guiCodeLbl)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(parameterEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(guiTypeCB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(guiClassLbl)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(parameterEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(guiRemarkLbl) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(parameterEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(guiDefaultValueLbl) .addComponent(defaultValueEditor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); parameterEditPanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {guiCodeLbl, guiCodeTF}); parameterEditPanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {guiClassLbl, guiTypeCB}); parameterEditPanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {defaultValueEditor, guiDefaultValueLbl}); guiGroupCodeLbl.setLabelFor(guiGroupCodeTF); org.openide.awt.Mnemonics.setLocalizedText(guiGroupCodeLbl, MessageBundle.format("parameters_code")); // NOI18N guiGroupCodeLbl.setFocusable(false); guiGroupRemarkTA.setColumns(20); guiGroupRemarkTA.setRows(5); jScrollPane2.setViewportView(guiGroupRemarkTA); guiGroupRemarkLbl.setLabelFor(guiGroupRemarkTA); org.openide.awt.Mnemonics.setLocalizedText(guiGroupRemarkLbl, MessageBundle.format("parameters_description")); // NOI18N guiGroupMinOccurs.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); guiGroupMinOccurs.setLabelFor(guiMinOccursSp); org.openide.awt.Mnemonics.setLocalizedText(guiGroupMinOccurs, MessageBundle.format("parameters_min")); // NOI18N guiGroupMinOccurs.setFocusable(false); guiGroupMaxOccurs.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); guiGroupMaxOccurs.setLabelFor(guiMaxOccursSp); org.openide.awt.Mnemonics.setLocalizedText(guiGroupMaxOccurs, MessageBundle.format("parameters_max")); // NOI18N guiGroupMaxOccurs.setFocusable(false); org.openide.awt.Mnemonics.setLocalizedText(guiGroupOccurencesLbl, MessageBundle.format("parameters_occurences")); // NOI18N javax.swing.GroupLayout parameterGroupEditPanelLayout = new javax.swing.GroupLayout(parameterGroupEditPanel); parameterGroupEditPanel.setLayout(parameterGroupEditPanelLayout); parameterGroupEditPanelLayout.setHorizontalGroup( parameterGroupEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(parameterGroupEditPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(parameterGroupEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(guiGroupOccurencesLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(parameterGroupEditPanelLayout.createSequentialGroup() .addGroup(parameterGroupEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(guiGroupCodeLbl, javax.swing.GroupLayout.Alignment.LEADING) .addComponent(guiGroupRemarkLbl, javax.swing.GroupLayout.Alignment.LEADING)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(parameterGroupEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane2) .addComponent(guiGroupCodeTF))) .addGroup(parameterGroupEditPanelLayout.createSequentialGroup() .addComponent(guiGroupMinOccurs) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(guiMinOccursSp)) .addGroup(parameterGroupEditPanelLayout.createSequentialGroup() .addComponent(guiGroupMaxOccurs) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(guiMaxOccursSp))) .addContainerGap()) ); parameterGroupEditPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {guiGroupCodeLbl, guiGroupMaxOccurs, guiGroupMinOccurs, guiGroupRemarkLbl}); parameterGroupEditPanelLayout.setVerticalGroup( parameterGroupEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(parameterGroupEditPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(parameterGroupEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(guiGroupCodeTF, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(guiGroupCodeLbl)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(parameterGroupEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(guiGroupRemarkLbl) .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(guiGroupOccurencesLbl) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(parameterGroupEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(guiGroupMinOccurs) .addComponent(guiMinOccursSp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(parameterGroupEditPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(guiGroupMaxOccurs) .addComponent(guiMaxOccursSp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); parameterGroupEditPanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {guiGroupCodeLbl, guiGroupCodeTF}); setLayout(new java.awt.BorderLayout()); contentPanel.setLayout(new java.awt.BorderLayout()); add(contentPanel, java.awt.BorderLayout.CENTER); }// </editor-fold>//GEN-END:initComponents private void guiTypeCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guiTypeCBActionPerformed if (editable) { if (oldType != null && !oldType.equals(guiTypeCB.getSelectedItem())) { oldType = (Class)guiTypeCB.getSelectedItem(); ((JParameterDescriptorPanel)parameterPanel).setType(oldType); ((JParameterDescriptorPanel)parameterPanel).setDefaultValue(null); updateCreatorForm(); } } }//GEN-LAST:event_guiTypeCBActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel contentPanel; private org.geotoolkit.gui.swing.propertyedit.JAttributeEditor defaultValueEditor; private javax.swing.JLabel guiClassLbl; private javax.swing.JLabel guiCodeLbl; private javax.swing.JTextField guiCodeTF; private javax.swing.JLabel guiDefaultValueLbl; private javax.swing.JLabel guiGroupCodeLbl; private javax.swing.JTextField guiGroupCodeTF; private javax.swing.JLabel guiGroupMaxOccurs; private javax.swing.JLabel guiGroupMinOccurs; private javax.swing.JLabel guiGroupOccurencesLbl; private javax.swing.JLabel guiGroupRemarkLbl; private javax.swing.JTextArea guiGroupRemarkTA; private javax.swing.JCheckBox guiMandatory; private javax.swing.JLabel guiMandatoryLbl; private javax.swing.JSpinner guiMaxOccursSp; private javax.swing.JSpinner guiMinOccursSp; private javax.swing.JLabel guiRemarkLbl; private javax.swing.JTextArea guiRemarkTA; private javax.swing.JComboBox guiTypeCB; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JPanel parameterEditPanel; private javax.swing.JPanel parameterGroupEditPanel; // End of variables declaration//GEN-END:variables @Override public void insertUpdate(DocumentEvent e) { textFieldValueChange(e); } @Override public void removeUpdate(DocumentEvent e) { textFieldValueChange(e); } @Override public void changedUpdate(DocumentEvent e) { textFieldValueChange(e); } /** * Event attached to code/remarks TextField and TextArea. * @param event */ private void textFieldValueChange(DocumentEvent event) { final String eventSource = (String)event.getDocument().getProperty("source"); if (editable) { if ("guiCodeTF".equals(eventSource)) { //validate parameter code if (parameterPanel.getParentPanel().isValidCode(guiCodeTF.getText().trim(), parameterPanel)) { parameterPanel.setCode(guiCodeTF.getText().trim()); guiCodeTF.setForeground(UIManager.getColor("TextField.foreground")); } else { guiCodeTF.setForeground(Color.red); } } else if ("guiRemarkTA".equals(eventSource)) { parameterPanel.setRemarks(guiRemarkTA.getText().trim()); } else if ("guiGroupCodeTF".equals(eventSource)) { if (parameterPanel.getParentPanel() != null) { //validate parameter code if (parameterPanel.getParentPanel().isValidCode(guiGroupCodeTF.getText().trim(), parameterPanel)) { parameterPanel.setCode(guiGroupCodeTF.getText().trim()); guiGroupCodeTF.setForeground(UIManager.getColor("TextField.foreground")); } else { guiGroupCodeTF.setForeground(Color.red); } } else { parameterPanel.setCode(guiGroupCodeTF.getText().trim()); guiGroupCodeTF.setForeground(UIManager.getColor("TextField.foreground")); } } else if ("guiGroupRemarkTA".equals(eventSource)) { parameterPanel.setRemarks(guiGroupRemarkTA.getText().trim()); } parameterPanel.updateContent(); firePropertyChange(JParameterDescriptorsEditor.DESCIPTOR_CHANGE_EVENT, null, parameterPanel); } } /** * Event attached to mandatory checkbox, min/max occurs spinners. * @param e */ @Override public void stateChanged(ChangeEvent e) { if (editable) { if (type.equals(ParameterType.SIMPLE)) { if (e.getSource().equals(guiMandatory)) { ((JParameterDescriptorPanel)parameterPanel).setMandatory(guiMandatory.isSelected()); } } else { final JParameterDescriptorGroupPanel group = (JParameterDescriptorGroupPanel)parameterPanel; if (e.getSource().equals(guiMaxOccursSp)) { group.setMaxOccurs((Integer)guiMaxOccursSp.getValue()); //maximum can't be lower than minimum occurences. if (group.getMinOccurs() > group.getMaxOccurs()) { guiMaxOccursSp.setValue(group.getMinOccurs()); } } else if (e.getSource().equals(guiMinOccursSp)) { group.setMinOccurs((Integer)guiMinOccursSp.getValue()); //maximum can't be lower than minimum occurences. if (group.getMinOccurs() > group.getMaxOccurs()) { guiMaxOccursSp.setValue(group.getMinOccurs()); } } } parameterPanel.updateContent(); firePropertyChange(JParameterDescriptorsEditor.DESCIPTOR_CHANGE_EVENT, null, parameterPanel); } } @Override public void propertyChange(PropertyChangeEvent evt) { if (editable) { //devault value editor changed if (JAttributeEditor.VALUE_CHANGE_EVENT.equals(evt.getPropertyName())) { ((JParameterDescriptorPanel)parameterPanel).setDefaultValue(defaultValueEditor.getProperty().getValue()); } parameterPanel.updateContent(); firePropertyChange(JParameterDescriptorsEditor.DESCIPTOR_CHANGE_EVENT, null, parameterPanel); } } }