Changeset 3135


Ignore:
Timestamp:
02/03/12 16:50:56 (4 months ago)
Author:
kasper
Message:

Improved UI for "Build map" transformer.

Location:
DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/panels/datastructures/BuildMapJobBuilderPresenter.java

    r3120 r3135  
    2525import org.eobjects.analyzer.beans.datastructures.BuildMapTransformer; 
    2626import org.eobjects.analyzer.configuration.AnalyzerBeansConfiguration; 
     27import org.eobjects.analyzer.data.InputColumn; 
    2728import org.eobjects.analyzer.descriptors.ConfiguredPropertyDescriptor; 
    2829import org.eobjects.analyzer.descriptors.TransformerBeanDescriptor; 
     
    4647        private final Map<ConfiguredPropertyDescriptor, PropertyWidget<?>> _overriddenPropertyWidgets; 
    4748 
    48         public BuildMapJobBuilderPresenter(TransformerJobBuilder<BuildMapTransformer> tjb, WindowContext windowContext, 
    49                         PropertyWidgetFactory propertyWidgetFactory, AnalyzerBeansConfiguration configuration) { 
     49        public BuildMapJobBuilderPresenter( 
     50                        TransformerJobBuilder<BuildMapTransformer> tjb, 
     51                        WindowContext windowContext, 
     52                        PropertyWidgetFactory propertyWidgetFactory, 
     53                        AnalyzerBeansConfiguration configuration) { 
    5054                super(tjb, windowContext, propertyWidgetFactory, configuration); 
    5155 
    5256                _overriddenPropertyWidgets = new HashMap<ConfiguredPropertyDescriptor, PropertyWidget<?>>(); 
    5357 
    54                 final TransformerBeanDescriptor<BuildMapTransformer> descriptor = tjb.getDescriptor(); 
    55                 final ConfiguredPropertyDescriptor valuesProperty = descriptor.getConfiguredProperty("Values"); 
    56                 final ConfiguredPropertyDescriptor keysProperty = descriptor.getConfiguredProperty("Keys"); 
     58                final TransformerBeanDescriptor<BuildMapTransformer> descriptor = tjb 
     59                                .getDescriptor(); 
     60                final ConfiguredPropertyDescriptor valuesProperty = descriptor 
     61                                .getConfiguredProperty("Values"); 
     62                final ConfiguredPropertyDescriptor keysProperty = descriptor 
     63                                .getConfiguredProperty("Keys"); 
    5764 
    58                 MultipleMappedStringsPropertyWidget propertyWidget = new MultipleMappedStringsPropertyWidget(tjb, valuesProperty, 
    59                                 keysProperty); 
     65                MultipleMappedStringsPropertyWidget propertyWidget = new MultipleMappedStringsPropertyWidget( 
     66                                tjb, valuesProperty, keysProperty) { 
     67                        @Override 
     68                        protected String getDefaultMappedString(InputColumn<?> inputColumn) { 
     69                                return inputColumn.getName(); 
     70                        } 
     71                }; 
    6072                _overriddenPropertyWidgets.put(valuesProperty, propertyWidget); 
    61                 _overriddenPropertyWidgets.put(keysProperty, propertyWidget.getMappedStringsPropertyWidget()); 
     73                _overriddenPropertyWidgets.put(keysProperty, 
     74                                propertyWidget.getMappedStringsPropertyWidget()); 
    6275        } 
    6376 
    6477        @Override 
    65         protected PropertyWidget<?> createPropertyWidget(AbstractBeanJobBuilder<?, ?, ?> beanJobBuilder, 
     78        protected PropertyWidget<?> createPropertyWidget( 
     79                        AbstractBeanJobBuilder<?, ?, ?> beanJobBuilder, 
    6680                        ConfiguredPropertyDescriptor propertyDescriptor) { 
    6781                if (_overriddenPropertyWidgets.containsKey(propertyDescriptor)) { 
  • DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/panels/datastructures/KeysAndTypesPropertyWidget.java

    r3120 r3135  
    4848        private final MinimalPropertyWidget<Class<?>[]> _typesPropertyWidget; 
    4949 
    50         public KeysAndTypesPropertyWidget(ConfiguredPropertyDescriptor keysProperty, ConfiguredPropertyDescriptor typesProperty, 
     50        public KeysAndTypesPropertyWidget( 
     51                        ConfiguredPropertyDescriptor keysProperty, 
     52                        ConfiguredPropertyDescriptor typesProperty, 
    5153                        AbstractBeanJobBuilder<?, ?, ?> beanJobBuilder) { 
    5254                super(keysProperty, beanJobBuilder); 
    5355                _comboBoxes = new ArrayList<DCComboBox<Class<?>>>(); 
    5456                _typesProperty = typesProperty; 
    55                 _typesPropertyWidget = new MinimalPropertyWidget<Class<?>[]>(getBeanJobBuilder(), _typesProperty) { 
     57                _typesPropertyWidget = new MinimalPropertyWidget<Class<?>[]>( 
     58                                getBeanJobBuilder(), _typesProperty) { 
    5659 
    5760                        @Override 
     
    8083        @Override 
    8184        protected JComponent decorateTextField(JXTextField textField) { 
    82                 final DCPanel panel = new DCPanel(); 
    83                 panel.setLayout(new BorderLayout()); 
    84                 panel.add(textField, BorderLayout.CENTER); 
    85  
    86                 final DCComboBox<Class<?>> comboBox = SingleClassPropertyWidget.createClassComboBox(true); 
     85                final DCComboBox<Class<?>> comboBox = SingleClassPropertyWidget 
     86                                .createClassComboBox(true); 
    8787                comboBox.addListener(new Listener<Class<?>>() { 
    8888                        @Override 
     
    9191                        } 
    9292                }); 
     93 
    9394                _comboBoxes.add(comboBox); 
    9495 
     96                final DCPanel panel = new DCPanel(); 
     97                panel.setLayout(new BorderLayout()); 
     98                panel.add(textField, BorderLayout.CENTER); 
    9599                panel.add(comboBox, BorderLayout.EAST); 
    96100 
  • DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/widgets/properties/MultipleMappedStringsPropertyWidget.java

    r3120 r3135  
    4747 * @author Kasper SÞrensen 
    4848 */ 
    49 public class MultipleMappedStringsPropertyWidget extends MultipleInputColumnsPropertyWidget { 
     49public class MultipleMappedStringsPropertyWidget extends 
     50                MultipleInputColumnsPropertyWidget { 
    5051 
    5152        private final WeakHashMap<InputColumn<?>, JXTextField> _mappedTextFields; 
    5253        private final ConfiguredPropertyDescriptor _mappedStringsProperty; 
    5354        private final MinimalPropertyWidget<String[]> _mappedStringPropertyWidget; 
     55 
     56        // indicates whether there is currently undergoing a string listener action 
     57        private volatile boolean _stringsUpdating; 
    5458 
    5559        /** 
     
    6468         *            the property representing the mapped strings (String[]) 
    6569         */ 
    66         public MultipleMappedStringsPropertyWidget(AbstractBeanJobBuilder<?, ?, ?> beanJobBuilder, 
    67                         ConfiguredPropertyDescriptor inputColumnsProperty, ConfiguredPropertyDescriptor mappedStringsProperty) { 
     70        public MultipleMappedStringsPropertyWidget( 
     71                        AbstractBeanJobBuilder<?, ?, ?> beanJobBuilder, 
     72                        ConfiguredPropertyDescriptor inputColumnsProperty, 
     73                        ConfiguredPropertyDescriptor mappedStringsProperty) { 
    6874                super(beanJobBuilder, inputColumnsProperty); 
    6975                _mappedTextFields = new WeakHashMap<InputColumn<?>, JXTextField>(); 
     
    7278                _mappedStringPropertyWidget = createMappedStringsPropertyWidget(); 
    7379 
    74                 InputColumn<?>[] currentValue = getCurrentValue(); 
    75                 if (currentValue != null) { 
     80                _stringsUpdating = false; 
     81 
     82                final InputColumn<?>[] currentValue = getCurrentValue(); 
     83                final String[] currentMappedStringsValue = (String[]) beanJobBuilder 
     84                                .getConfiguredProperty(mappedStringsProperty); 
     85                if (currentValue != null && currentMappedStringsValue != null) { 
     86                        // first create combo's, then set value (so combo is ready before it 
     87                        // is requested) 
     88 
     89                        _mappedStringPropertyWidget.setValue(currentMappedStringsValue); 
     90                        final int minLength = Math.min(currentValue.length, 
     91                                        currentMappedStringsValue.length); 
     92                        for (int i = 0; i < minLength; i++) { 
     93                                final InputColumn<?> inputColumn = currentValue[i]; 
     94                                final String mappedString = currentMappedStringsValue[i]; 
     95                                createTextField(inputColumn, mappedString); 
     96                        } 
     97 
    7698                        setValue(currentValue); 
    77                 } 
    78  
    79                 String[] currentMappedStrings = (String[]) beanJobBuilder.getConfiguredProperty(mappedStringsProperty); 
    80                 if (currentValue != null && currentMappedStrings != null) { 
    81                         int minLength = Math.min(currentValue.length, currentMappedStrings.length); 
    82                         for (int i = 0; i < minLength; i++) { 
    83                                 InputColumn<?> inputColumn = currentValue[i]; 
    84                                 String mappedString = currentMappedStrings[i]; 
    85                                 createTextField(inputColumn, mappedString); 
    86                         } 
    8799                } 
    88100        } 
     
    93105        } 
    94106 
    95         private JXTextField createTextField(InputColumn<?> inputColumn, String mappedString) { 
     107        private JXTextField createTextField(InputColumn<?> inputColumn, 
     108                        String mappedString) { 
    96109                final JXTextField textField = WidgetFactory.createTextField(); 
    97110                _mappedTextFields.put(inputColumn, textField); 
     111 
     112                if (mappedString == null) { 
     113                        mappedString = getDefaultMappedString(inputColumn); 
     114                } 
    98115                if (mappedString != null) { 
    99116                        textField.setText(mappedString); 
    100117                } 
    101118                textField.getDocument().addDocumentListener(new DCDocumentListener() { 
    102  
    103119                        @Override 
    104120                        protected void onChange(DocumentEvent event) { 
     121                                _stringsUpdating = true; 
    105122                                fireValueChanged(); 
    106123                                _mappedStringPropertyWidget.fireValueChanged(); 
     124                                _stringsUpdating = false; 
    107125                        } 
    108126                }); 
     
    110128        } 
    111129 
    112         @Override 
    113         protected JComponent decorateCheckBox(final DCCheckBox<InputColumn<?>> checkBox) { 
     130        /** 
     131         * Subclasses can override this method to set a default value for a column 
     132         * when it is selected. 
     133         *  
     134         * @param inputColumn 
     135         * @return 
     136         */ 
     137        protected String getDefaultMappedString(InputColumn<?> inputColumn) { 
     138                return ""; 
     139        } 
     140 
     141        @Override 
     142        protected JComponent decorateCheckBox( 
     143                        final DCCheckBox<InputColumn<?>> checkBox) { 
    114144                final JXTextField textField; 
    115145                if (_mappedTextFields.containsKey(checkBox.getValue())) { 
     
    118148                        textField = createTextField(checkBox.getValue(), null); 
    119149                } 
    120                 checkBox.addListener(new DCCheckBox.Listener<InputColumn<?>>() { 
     150                checkBox.addListenerToHead(new DCCheckBox.Listener<InputColumn<?>>() { 
    121151                        @Override 
    122152                        public void onItemSelected(InputColumn<?> item, boolean selected) { 
    123153                                textField.setVisible(selected); 
     154                                updateUI(); 
     155                        } 
     156                }); 
     157                checkBox.addListener(new DCCheckBox.Listener<InputColumn<?>>() { 
     158                        @Override 
     159                        public void onItemSelected(InputColumn<?> item, boolean selected) { 
     160                                _mappedStringPropertyWidget.fireValueChanged(); 
    124161                        } 
    125162                }); 
     
    129166                final DCPanel panel = new DCPanel(); 
    130167                panel.setLayout(new BorderLayout()); 
    131                 panel.add(checkBox, BorderLayout.WEST); 
     168                panel.add(checkBox, BorderLayout.CENTER); 
    132169                panel.add(textField, BorderLayout.EAST); 
    133170                return panel; 
     
    139176 
    140177        private MinimalPropertyWidget<String[]> createMappedStringsPropertyWidget() { 
    141                 return new MinimalPropertyWidget<String[]>(getBeanJobBuilder(), _mappedStringsProperty) { 
     178                return new MinimalPropertyWidget<String[]>(getBeanJobBuilder(), 
     179                                _mappedStringsProperty) { 
    142180 
    143181                        @Override 
     
    149187                        @Override 
    150188                        public boolean isSet() { 
    151                                 final InputColumn<?>[] inputColumns = MultipleMappedStringsPropertyWidget.this.getValue(); 
     189                                final InputColumn<?>[] inputColumns = MultipleMappedStringsPropertyWidget.this 
     190                                                .getValue(); 
    152191                                for (InputColumn<?> inputColumn : inputColumns) { 
    153192                                        JXTextField textField = _mappedTextFields.get(inputColumn); 
     
    166205                        @Override 
    167206                        protected void setValue(String[] value) { 
     207                                if (_stringsUpdating) { 
     208                                        // setValue of the strings will be called prematurely 
     209                                        // (with previous value) by change notifications of the 
     210                                        // input columns property. 
     211                                        return; 
     212                                } 
     213 
    168214                                if (EqualsBuilder.equals(value, getValue())) { 
    169215                                        return; 
    170216                                } 
    171                                 final InputColumn<?>[] inputColumns = MultipleMappedStringsPropertyWidget.this.getValue(); 
     217                                final InputColumn<?>[] inputColumns = MultipleMappedStringsPropertyWidget.this 
     218                                                .getValue(); 
     219 
     220                                if (value != null && inputColumns.length != value.length) { 
     221                                        // disregard this invalid value update 
     222                                        return; 
     223                                } 
     224 
    172225                                for (int i = 0; i < inputColumns.length; i++) { 
    173226                                        final InputColumn<?> inputColumn = inputColumns[i]; 
    174                                         final String mappedColumnName; 
     227                                        final String mappedString; 
    175228                                        if (value == null) { 
    176                                                 mappedColumnName = ""; 
     229                                                mappedString = getDefaultMappedString(inputColumn); 
    177230                                        } else if (i < value.length) { 
    178                                                 mappedColumnName = value[i]; 
     231                                                mappedString = value[i]; 
    179232                                        } else { 
    180                                                 mappedColumnName = ""; 
     233                                                mappedString = getDefaultMappedString(inputColumn); 
    181234                                        } 
    182                                         final JXTextField textField = _mappedTextFields.get(inputColumn); 
    183                                         textField.setText(mappedColumnName); 
     235                                        final JXTextField textField = _mappedTextFields 
     236                                                        .get(inputColumn); 
     237 
     238                                        final String previousText = textField.getText(); 
     239                                        if (!mappedString.equals(previousText)) { 
     240                                                textField.setText(mappedString); 
     241                                        } 
    184242                                } 
    185243                        } 
     
    194252                        // exclude input columns that have not been mapped yet 
    195253                        final JXTextField textField = _mappedTextFields.get(inputColumn); 
    196                         if (textField != null) { 
     254                        if (textField != null && textField.isVisible()) { 
    197255                                if (!StringUtils.isNullOrEmpty(textField.getText())) { 
    198256                                        result.add(inputColumn); 
     
    204262 
    205263        private String[] getMappedStrings() { 
    206                 final InputColumn<?>[] inputColumns = MultipleMappedStringsPropertyWidget.this.getValue(); 
     264                final InputColumn<?>[] inputColumns = MultipleMappedStringsPropertyWidget.this 
     265                                .getValue(); 
    207266                final List<String> result = new ArrayList<String>(); 
    208267                for (InputColumn<?> inputColumn : inputColumns) { 
Note: See TracChangeset for help on using the changeset viewer.