/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.mappingsplugin.ui.descriptor; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.NumberFormat; import java.util.Iterator; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import org.eclipse.persistence.tools.workbench.framework.action.AbstractFrameworkAction; import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContext; import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContextHolder; import org.eclipse.persistence.tools.workbench.framework.resources.ResourceRepository; import org.eclipse.persistence.tools.workbench.framework.ui.chooser.DefaultListChooser; import org.eclipse.persistence.tools.workbench.framework.ui.dialog.AbstractDialog; import org.eclipse.persistence.tools.workbench.framework.ui.view.AbstractPanel; import org.eclipse.persistence.tools.workbench.framework.uitools.SwingComponentFactory; import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWColumn; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWAbstractClassIndicatorPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWClassIndicatorFieldPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWClassIndicatorValue; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWMappingDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWTypeDeclaration; import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.common.cell.DescriptorCellRendererAdapter; import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.common.cell.TypeDeclarationCellRendererAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.CollectionAspectAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.CollectionValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.FilteringPropertyValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.ItemPropertyListValueModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.ListValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.PropertyAspectAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.PropertyValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.ValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.ValuePropertyPropertyValueModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ColumnAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ComboBoxModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ListModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ObjectListSelectionModel; import org.eclipse.persistence.tools.workbench.uitools.app.swing.TableModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.cell.AdaptableListCellRenderer; import org.eclipse.persistence.tools.workbench.uitools.cell.AdaptableTableCellRenderer; import org.eclipse.persistence.tools.workbench.uitools.cell.CheckBoxTableCellRenderer; import org.eclipse.persistence.tools.workbench.uitools.cell.TableCellEditorAdapter; import org.eclipse.persistence.tools.workbench.uitools.chooser.ListChooser; import org.eclipse.persistence.exceptions.ConversionException; public abstract class ClassIndicatorDictionarySubPanel extends AbstractPanel implements RootListener, IndicatorFieldListener, IndicatorDictionaryListener { private JButton editButton; private ObjectListSelectionModel rowSelectionModel; private TableModel classIndicatorTableModel; private ValueModel classIndicatorFieldPolicyHolder; protected ListChooser indicatorTypeListChooser; protected JLabel typeLabel; protected JScrollPane tableScrollPane; private boolean isRoot; private boolean isIndicatorField; private boolean isIndicatorDictionary; protected ClassIndicatorDictionarySubPanel(PropertyValueModel classIndicatorPolicyHolder, WorkbenchContextHolder contextHolder) { super(contextHolder); initialize(classIndicatorPolicyHolder); } protected void initialize(PropertyValueModel classIndicatorPolicyHolder) { this.classIndicatorFieldPolicyHolder = buildClassIndicatorFieldPolicyHolder(classIndicatorPolicyHolder); this.rowSelectionModel = buildRowSelectionModel(); this.editButton = buildEditButton(); } protected PropertyValueModel buildClassIndicatorFieldPolicyHolder(PropertyValueModel classIndicatorPolicyHolder) { return new FilteringPropertyValueModel(classIndicatorPolicyHolder) { protected boolean accept(Object value) { return value instanceof MWClassIndicatorFieldPolicy; } }; } protected ValueModel buildUseClassIndicatorDictionaryBooleanHolder() { return new PropertyAspectAdapter(this.classIndicatorFieldPolicyHolder, MWClassIndicatorFieldPolicy.CLASS_NAME_IS_INDICATOR_PROPERTY) { protected Object getValueFromSubject() { return Boolean.valueOf(!((MWClassIndicatorFieldPolicy) this.subject).classNameIsIndicator()); } }; } private JButton buildEditButton() { JButton editButton = buildButton("EDIT"); editButton.addActionListener(buildEditAction()); editButton.setEnabled(false); return editButton; } protected ListChooser buildIndicatorTypeChooser() { ListChooser indicatorTypeChooser = new DefaultListChooser( new ComboBoxModelAdapter( buildIndicatorTypeChooserValueModel(), buildIndicatorTypeChooserPropertyAdapter()), getWorkbenchContextHolder()); indicatorTypeChooser.setRenderer(buildIndicatorTypeChooserRenderer()); indicatorTypeChooser.setLongListSize(30); return indicatorTypeChooser; } private ListCellRenderer buildIndicatorTypeChooserRenderer() { return new AdaptableListCellRenderer(new TypeDeclarationCellRendererAdapter(resourceRepository())); } private TableCellRenderer buildClassColumnRenderer() { return new AdaptableTableCellRenderer(new DescriptorCellRendererAdapter(resourceRepository())); } private CollectionValueModel buildIndicatorTypeChooserValueModel() { return new CollectionAspectAdapter(this.classIndicatorFieldPolicyHolder) { protected Iterator getValueFromSubject() { MWAbstractClassIndicatorPolicy policy = (MWAbstractClassIndicatorPolicy) this.subject; return policy.buildBasicTypes().iterator(); } }; } private PropertyValueModel buildIndicatorTypeChooserPropertyAdapter() { return new PropertyAspectAdapter(this.classIndicatorFieldPolicyHolder, MWClassIndicatorFieldPolicy.INDICATOR_TYPE_PROPERTY) { protected Object getValueFromSubject() { return ((MWClassIndicatorFieldPolicy) this.subject).getIndicatorType(); } protected void setValueOnSubject(Object value) { ((MWClassIndicatorFieldPolicy) this.subject).setIndicatorType((MWTypeDeclaration) value); } }; } private static class ClassIndicatorValueColumnAdapter implements ColumnAdapter { private ResourceRepository resourceRepository; private ClassIndicatorDictionarySubPanel parentPanel; public static final int COLUMN_COUNT = 3; public static final int INCLUDE_COLUMN = 0; public static final int CLASS_COLUMN = 1; public static final int VALUE_COLUMN = 2; private static final String[] COLUMN_NAME_KEYS = new String[] { "INCLUDE_COLUMN_HEADER", "CLASS_COLUMN_HEADER", "VALUE_COLUMN_HEADER", }; protected ClassIndicatorValueColumnAdapter(ResourceRepository repository, ClassIndicatorDictionarySubPanel parentPanel) { super(); this.parentPanel = parentPanel; this.resourceRepository = repository; } public int getColumnCount() { return COLUMN_COUNT; } public String getColumnName(int index) { return this.resourceRepository.getString(COLUMN_NAME_KEYS[index]); } public Class getColumnClass(int index) { switch (index) { case INCLUDE_COLUMN: return Boolean.class; case CLASS_COLUMN: return Object.class; case VALUE_COLUMN: return Object.class; default: return Object.class; } } public boolean isColumnEditable(int index) { return index == INCLUDE_COLUMN; } public PropertyValueModel[] cellModels(Object subject) { MWClassIndicatorValue indicatorValue = (MWClassIndicatorValue)subject; PropertyValueModel[] result = new PropertyValueModel[COLUMN_COUNT]; //need to add these listeners here so that we can enable/disable the edit button according to the include checkbox PropertyValueModel includeAdapter = this.buildIncludeAdapter(indicatorValue); includeAdapter.addPropertyChangeListener(parentPanel.buildIncludePropertyChangeListener()); result[INCLUDE_COLUMN] = includeAdapter; result[CLASS_COLUMN] = this.buildClassAdapter(indicatorValue); result[VALUE_COLUMN] = this.buildValueAdapter(indicatorValue); return result; } private PropertyValueModel buildIncludeAdapter(MWClassIndicatorValue indicatorValue) { return new PropertyAspectAdapter(MWClassIndicatorValue.INCLUDE_PROPERTY, indicatorValue) { protected Object getValueFromSubject() { return Boolean.valueOf(((MWClassIndicatorValue) this.subject).isInclude()); } protected void setValueOnSubject(Object value) { ((MWClassIndicatorValue) this.subject).setInclude(((Boolean)value).booleanValue()); } }; } private PropertyValueModel buildClassAdapter(MWClassIndicatorValue indicatorValue) { PropertyValueModel adapter = new PropertyAspectAdapter(MWClassIndicatorValue.DESCRIPTOR_PROPERTY, indicatorValue) { protected Object getValueFromSubject() { return ((MWClassIndicatorValue) this.subject).getDescriptorValue(); } }; return new ValuePropertyPropertyValueModelAdapter(adapter, MWDescriptor.NAME_PROPERTY); } private PropertyValueModel buildValueAdapter(MWClassIndicatorValue indicatorValue) { return new PropertyAspectAdapter(MWClassIndicatorValue.INDICATOR_VALUE_PROPERTY, indicatorValue) { protected Object getValueFromSubject() { return ((MWClassIndicatorValue) this.subject).getIndicatorValueAsString(); } }; } } private static class MWClassIndicatorValueDialog extends AbstractDialog { private Object originalIndicatorValue; private JTextField indicatorValueTextField; private MWClassIndicatorFieldPolicy policy; private MWMappingDescriptor descriptor; private MWClassIndicatorValueDialog(WorkbenchContext context, ValueModel model, MWMappingDescriptor descriptor, Object indicatorValue) { super(context); this.originalIndicatorValue = indicatorValue; this.descriptor = descriptor; this.policy = (MWClassIndicatorFieldPolicy) model.getValue(); } private String getStringValue(Object object) { if (object == null) return ""; else return object.toString(); } protected String helpTopicId() { return "descriptor.inheritance.indicator.editDialog"; } protected Component buildMainPanel() { JPanel panel = new JPanel(new GridBagLayout()); setTitle(resourceRepository().getString("ENTER_INDICATOR_VALUE")); GridBagConstraints constraints = new GridBagConstraints(); // Create the Database type label and textfield/ label JLabel indicatorTypeLabel = new JLabel(resourceRepository().getString("INDICATOR_TYPE")); indicatorTypeLabel.setDisplayedMnemonic(resourceRepository().getMnemonic("INDICATOR_TYPE")); constraints.gridx = 0; constraints.gridy = 0; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 0; constraints.weighty = 0; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.anchor = GridBagConstraints.NORTHWEST; constraints.insets = new Insets(5, 5, 5, 5); panel.add(indicatorTypeLabel, constraints); JLabel indicatorType = new JLabel(this.policy.getIndicatorType().displayStringWithPackage(), resourceRepository().getIcon("class.public"), SwingConstants.CENTER); JPanel indicatorTypePanel = new JPanel(new BorderLayout()); indicatorTypePanel.setMinimumSize(new Dimension(0, 20)); indicatorTypePanel.setBorder(BorderFactory.createEtchedBorder()); indicatorTypePanel.add(indicatorType, BorderLayout.WEST); constraints.gridx = 1; constraints.gridy = 0; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 1; constraints.weighty = 0; constraints.fill = GridBagConstraints.BOTH; constraints.anchor = GridBagConstraints.NORTHWEST; constraints.insets = new Insets(5, 5, 5, 5); panel.add(indicatorTypePanel, constraints); // Create the indicator value label and textfield JLabel indicatorValueLabel = new JLabel(resourceRepository().getString("INDICATOR_VALUE")); indicatorValueLabel.setDisplayedMnemonic(resourceRepository().getMnemonic("INDICATOR_VALUE")); constraints.gridx = 0; constraints.gridy = 1; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 0; constraints.weighty = 0; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.anchor = GridBagConstraints.NORTHWEST; constraints.insets = new Insets(5, 5, 5, 5); panel.add(indicatorValueLabel, constraints); this.indicatorValueTextField = new JTextField(getStringValue(this.originalIndicatorValue)); helpManager().addTopicID(this.indicatorValueTextField, helpTopicId() + ".indicatorValue"); this.indicatorValueTextField.setColumns(20); this.indicatorValueTextField.getDocument().addDocumentListener(new CVDocumentListener()); indicatorValueLabel.setLabelFor(this.indicatorValueTextField); constraints.gridx = 1; constraints.gridy = 1; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 1; constraints.weighty = 0; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.anchor = GridBagConstraints.NORTHWEST; constraints.insets = new Insets(5, 5, 5, 5); panel.add(this.indicatorValueTextField, constraints); updateOKButton(); return panel; } public boolean preConfirm() { String indicatorValueText = this.indicatorValueTextField.getText(); Object indicatorValue = null; try { indicatorValue = this.policy.buildIndicatorValueFromString(indicatorValueText); } catch (ConversionException ce) { showInvalidConversionDialog(ce); return false; } if (indicatorValue.equals(this.originalIndicatorValue)) { return true; } else { if (this.policy.isRepeatedIndicatorValue(indicatorValue)) { showRepeatedIndicatorValueDialog(indicatorValueText); return false; } else { this.policy.getClassIndicatorValueForDescriptor(descriptor).setIndicatorValue(indicatorValue); return true; } } } protected String getInvalidInputMessage(Class javaClass) { String javaClassName = javaClass.getName(); if (javaClassName.equals("java.lang.Boolean")) return resourceRepository().getString("BE_EITHER_TRUE_OR_FALSE", javaClassName); else if (javaClassName.equals("java.lang.Byte")) return resourceRepository().getString("BE_BETWEEN_0_AND_127", javaClassName); else if (javaClassName.equals("java.lang.Character")) return resourceRepository().getString("BE_SINGLE_CHARACTER", javaClassName); else if (javaClassName.equals("java.lang.Double")) return resourceRepository().getString("BE_BETWEEN_DOUBLE", new Object[] { javaClassName, NumberFormat.getInstance().format(Double.MIN_VALUE), NumberFormat.getInstance().format(Double.MAX_VALUE)}); else if (javaClassName.equals("java.lang.Float")) return resourceRepository().getString("BE_BETWEEN_FLOAT", new Object[] { javaClassName, NumberFormat.getInstance().format(Float.MIN_VALUE), NumberFormat.getInstance().format(Float.MAX_VALUE)}); else if (javaClassName.equals("java.lang.Integer")) return resourceRepository().getString("BE_BETWEEN_INT", new Object[] { javaClassName, NumberFormat.getInstance().format(Integer.MIN_VALUE), NumberFormat.getInstance().format(Integer.MAX_VALUE)}); else if (javaClassName.equals("java.lang.Long")) return resourceRepository().getString("BE_BETWEEN_LONG", new Object[] { javaClassName, NumberFormat.getInstance().format(Long.MIN_VALUE), NumberFormat.getInstance().format(Long.MAX_VALUE)}); else if (javaClassName.equals("java.lang.Short")) return resourceRepository().getString("BE_BETWEEN_SHORT", new Object[] { javaClassName, NumberFormat.getInstance().format(Short.MIN_VALUE), NumberFormat.getInstance().format(Short.MAX_VALUE)}); else if (javaClassName.equals("java.lang.String")) return resourceRepository().getString("BE_A_STRING", javaClassName); else if (javaClassName.equals("java.math.BigDecimal")) return resourceRepository().getString("CONTAINS_ONLY_DIGITS", javaClassName); else if (javaClassName.equals("java.math.BigInteger")) return resourceRepository().getString("CONTAINS_ONLY_DIGITS_AND", javaClassName); else if (javaClassName.equals("java.sql.Date")) return resourceRepository().getString("BE_IN_FORMAT1", javaClassName); else if (javaClassName.equals("java.sql.Time")) return resourceRepository().getString("BE_IN_FORMAT2", javaClassName); else if (javaClassName.equals("java.sql.Timestamp")) return resourceRepository().getString("BE_IN_FORMAT3", javaClassName); else if (javaClassName.equals("java.util.Date")) return resourceRepository().getString("BE_IN_FORMAT4", javaClassName); else if (javaClassName.equals("java.util.Calendar")) return resourceRepository().getString("BE_IN_FORMAT5", javaClassName); else if (javaClass == byte[].class || javaClass == Byte[].class) { return resourceRepository().getString("BE_IN_FORMAT_BYTE_ARRAY", javaClassName); } else if (javaClass == char[].class || javaClass == Character[].class) { return resourceRepository().getString("BE_A_STRING", javaClassName); } else return resourceRepository().getString("ILLEGAL_FORMAT"); } private void showInvalidConversionDialog(ConversionException ce) { JOptionPane.showMessageDialog(getWorkbenchContext().getCurrentWindow(), getInvalidInputMessage(ce.getClassToConvertTo()), resourceRepository().getString("ILLEGAL_FORMAT"), JOptionPane.WARNING_MESSAGE); } private void showRepeatedIndicatorValueDialog(String valueString) { JOptionPane.showMessageDialog(getWorkbenchContext().getCurrentWindow(), resourceRepository().getString("INDICATOR_VALUE_ALLREADY_EXISTS", valueString), resourceRepository().getString("REPEATED_INDICATOR_VALUE"), JOptionPane.WARNING_MESSAGE); } private void updateOKButton() { boolean enableOKButton = this.indicatorValueTextField.getText() != null && !this.indicatorValueTextField.getText().equals(""); getOKAction().setEnabled(enableOKButton); } private class CVDocumentListener implements DocumentListener { public void changedUpdate(DocumentEvent de) { updateOKButton(); } public void insertUpdate(DocumentEvent de) { updateOKButton(); } public void removeUpdate(DocumentEvent de) { updateOKButton(); } } } protected MWClassIndicatorFieldPolicy getClassIndicatorPolicy() { return (MWClassIndicatorFieldPolicy) this.classIndicatorFieldPolicyHolder.getValue(); } protected String helpTopicId() { return "descriptor.inheritance.classIndicator.classIndicatorDictionary"; } protected JTable buildClassIndicatorValuesTable() { // Create the table view this.classIndicatorTableModel = buildClassIndicatorValuesTableModel(); JTable classIndicatorValuesTable = SwingComponentFactory.buildTable(this.classIndicatorTableModel, this.rowSelectionModel); classIndicatorValuesTable.setPreferredScrollableViewportSize(new Dimension(400, 75)); // include column TableColumn column = classIndicatorValuesTable.getColumnModel().getColumn(ClassIndicatorValueColumnAdapter.INCLUDE_COLUMN); column.setPreferredWidth(25); CheckBoxTableCellRenderer includeRenderer = new CheckBoxTableCellRenderer(); column.setCellRenderer(includeRenderer); column.setCellEditor(new TableCellEditorAdapter(new CheckBoxTableCellRenderer())); // database type column (combo-box) column = classIndicatorValuesTable.getColumnModel().getColumn(ClassIndicatorValueColumnAdapter.CLASS_COLUMN); column.setPreferredWidth(100); TableCellRenderer classRenderer = buildClassColumnRenderer(); column.setCellRenderer(classRenderer); // size column (spinner) column = classIndicatorValuesTable.getColumnModel().getColumn(ClassIndicatorValueColumnAdapter.VALUE_COLUMN); column.setPreferredWidth(100); return classIndicatorValuesTable; } private TableModel buildClassIndicatorValuesTableModel() { return new TableModelAdapter(buildClassIndicatorValueAdapter(), buildClassIndicatorValueTableColumnAdapter()); } private ColumnAdapter buildClassIndicatorValueTableColumnAdapter() { return new ClassIndicatorValueColumnAdapter(resourceRepository(), this); } private ObjectListSelectionModel buildRowSelectionModel() { ObjectListSelectionModel rowSelectionModel = new ObjectListSelectionModel(new ListModelAdapter(buildClassIndicatorValuesHolder())); rowSelectionModel.addListSelectionListener(this.buildRowSelectionListener(rowSelectionModel)); rowSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); return rowSelectionModel; } private ListValueModel buildClassIndicatorValueAdapter() { return new ItemPropertyListValueModelAdapter(buildClassIndicatorValuesHolder(), MWClassIndicatorValue.INDICATOR_VALUE_PROPERTY); } private CollectionValueModel buildClassIndicatorValuesHolder() { return new CollectionAspectAdapter(this.classIndicatorFieldPolicyHolder, MWClassIndicatorFieldPolicy.CLASS_INDICATOR_VALUES_COLLECTION) { protected Iterator getValueFromSubject() { return ((MWClassIndicatorFieldPolicy) this.subject).classIndicatorValues(); } }; } private Action buildEditAction() { return new AbstractFrameworkAction(getApplicationContext()) { public void actionPerformed(ActionEvent e) { editIndicator(); } }; } private void editIndicator() { Object indicatorValue = null; MWMappingDescriptor descriptor = null; for (int row = this.classIndicatorTableModel.getRowCount() - 1; row >= 0; row--) { if (this.rowSelectionModel.isSelectedIndex(row)) { indicatorValue = this.classIndicatorTableModel.getValueAt(row, ClassIndicatorValueColumnAdapter.VALUE_COLUMN); descriptor = (MWMappingDescriptor) this.classIndicatorTableModel.getValueAt(row, ClassIndicatorValueColumnAdapter.CLASS_COLUMN); } } MWClassIndicatorValueDialog dlg = new MWClassIndicatorValueDialog(getWorkbenchContext(), this.classIndicatorFieldPolicyHolder, descriptor, indicatorValue); dlg.show(); // if(dlg.wasConfirmed()) } private ListSelectionListener buildRowSelectionListener(final ListSelectionModel selectionModel) { return new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if ( ! e.getValueIsAdjusting()) { editButton.getModel().setEnabled( editButtonShouldBeEnabled() && ! (selectionModel.isSelectionEmpty() && selectionModel.getMinSelectionIndex() == selectionModel.getMaxSelectionIndex())); } } }; } private PropertyChangeListener buildIncludePropertyChangeListener() { return new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { updateEditButton(); } }; } private void updateEditButton() { editButton.setEnabled(editButtonShouldBeEnabled()); } private boolean editButtonShouldBeEnabled() { return getRowSelectionModel().getSelectedValue() != null && ((MWClassIndicatorValue)rowSelectionModel.getSelectedValue()).isInclude(); } protected ObjectListSelectionModel getRowSelectionModel() { return this.rowSelectionModel; } protected JButton getEditButton() { return this.editButton; } public void updateRootStatus(boolean newValue) { this.isRoot = newValue; updateEnablementStatus(); } public void updateIndicatorFieldStatus(boolean newValue) { this.isIndicatorField = newValue; updateEnablementStatus(); } public void updateIndicatorDictionaryStatus(boolean newValue) { this.isIndicatorDictionary = newValue; updateEnablementStatus(); } protected void updateEnablementStatus() { this.indicatorTypeListChooser.setEnabled(this.isRoot() && this.isIndicatorField() && this.isIndicatorDictionary()); this.typeLabel.setEnabled(this.isRoot() && this.isIndicatorField() && this.isIndicatorDictionary()); this.tableScrollPane.setEnabled(this.isRoot() && this.isIndicatorField() && this.isIndicatorDictionary()); } public boolean isRoot() { return this.isRoot; } public boolean isIndicatorField() { return this.isIndicatorField; } public boolean isIndicatorDictionary() { return this.isIndicatorDictionary; } }