Changeset 3138
- Timestamp:
- 02/04/12 22:30:55 (4 months ago)
- Files:
-
- 6 edited
-
AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/beans/datastructures/SelectFromMapTransformer.java (modified) (2 diffs)
-
DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/panels/datastructures/KeysAndTypesPropertyWidget.java (modified) (8 diffs)
-
DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/widgets/properties/MinimalPropertyWidget.java (modified) (6 diffs)
-
DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/widgets/properties/MultipleStringPropertyWidget.java (modified) (4 diffs)
-
DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/widgets/properties/PropertyWidgetFactory.java (modified) (1 diff)
-
DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/widgets/properties/SingleFilePropertyWidget.java (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
AnalyzerBeans/trunk/core/src/main/java/org/eobjects/analyzer/beans/datastructures/SelectFromMapTransformer.java
r3118 r3138 20 20 package org.eobjects.analyzer.beans.datastructures; 21 21 22 import java.util.Arrays; 22 23 import java.util.Map; 23 24 … … 81 82 @Override 82 83 public OutputColumns getOutputColumns() { 84 String[] keys = this.keys; 85 Class<?>[] types = this.types; 86 if (keys.length != types.length) { 87 // odd case sometimes encountered with invalid configurations or 88 // while building a job 89 final int length = Math.min(keys.length, types.length); 90 keys = Arrays.copyOf(keys, length); 91 types = Arrays.copyOf(types, length); 92 } 83 93 return new OutputColumns(keys, types); 84 94 } -
DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/panels/datastructures/KeysAndTypesPropertyWidget.java
r3136 r3138 25 25 26 26 import javax.swing.JComponent; 27 import javax.swing.SwingUtilities; 27 28 import javax.swing.event.DocumentEvent; 28 29 … … 30 31 import org.eobjects.analyzer.descriptors.ConfiguredPropertyDescriptor; 31 32 import org.eobjects.analyzer.job.builder.AbstractBeanJobBuilder; 33 import org.eobjects.analyzer.util.StringUtils; 32 34 import org.eobjects.datacleaner.panels.DCPanel; 33 35 import org.eobjects.datacleaner.util.DCDocumentListener; … … 49 51 private final ConfiguredPropertyDescriptor _typesProperty; 50 52 private final List<DCComboBox<Class<?>>> _comboBoxes; 51 private final MinimalPropertyWidget<Class<?>[]> _typesPropertyWidget; 52 53 54 @SuppressWarnings("rawtypes") 55 private final MinimalPropertyWidget<Class[]> _typesPropertyWidget; 56 57 @SuppressWarnings("rawtypes") 53 58 public KeysAndTypesPropertyWidget( 54 59 ConfiguredPropertyDescriptor keysProperty, … … 58 63 _comboBoxes = new ArrayList<DCComboBox<Class<?>>>(); 59 64 _typesProperty = typesProperty; 60 _typesPropertyWidget = new MinimalPropertyWidget<Class <?>[]>(65 _typesPropertyWidget = new MinimalPropertyWidget<Class[]>( 61 66 getBeanJobBuilder(), _typesProperty) { 62 67 … … 67 72 68 73 @Override 69 public Class <?>[] getValue() {74 public Class[] getValue() { 70 75 final String[] keys = KeysAndTypesPropertyWidget.this 71 76 .getValue(); 72 final Class<?>[] result = new Class<?>[keys.length]; 73 for (int i = 0; i < result.length; i++) { 74 final DCComboBox<Class<?>> comboBox = _comboBoxes.get(i); 75 result[i] = comboBox.getSelectedItem(); 76 } 77 return result; 77 final List<Class<?>> result = new ArrayList<Class<?>>(); 78 for (int i = 0; i < keys.length; i++) { 79 if (!StringUtils.isNullOrEmpty(keys[i])) { 80 final DCComboBox<Class<?>> comboBox = _comboBoxes 81 .get(i); 82 result.add(comboBox.getSelectedItem()); 83 } 84 } 85 return result.toArray(new Class[result.size()]); 78 86 } 79 87 … … 92 100 93 101 @Override 94 protected void setValue(Class <?>[] value) {102 protected void setValue(Class[] value) { 95 103 if (EqualsBuilder.equals(value, getValue())) { 96 104 return; … … 116 124 }; 117 125 118 // TODO: Initialize value 119 } 120 121 @Override 122 protected JComponent decorateTextField(JXTextField textField) { 126 final String[] currentKeysValue = getCurrentValue(); 127 final Class[] currentTypesValue = (Class[]) beanJobBuilder 128 .getConfiguredProperty(typesProperty); 129 if (currentTypesValue != null) { 130 // first create textfields, then set keys value 131 132 for (int i = 0; i < currentTypesValue.length; i++) { 133 final Class<?> type = currentTypesValue[i]; 134 createComboBox(type); 135 } 136 137 setValue(currentKeysValue); 138 _typesPropertyWidget.onValueTouched(currentTypesValue); 139 } 140 } 141 142 private DCComboBox<Class<?>> createComboBox(Class<?> type) { 123 143 final DCComboBox<Class<?>> comboBox = SingleClassPropertyWidget 124 144 .createClassComboBox(true); 145 if (type != null) { 146 comboBox.setSelectedItem(type); 147 } 148 _comboBoxes.add(comboBox); 149 return comboBox; 150 } 151 152 @Override 153 protected JComponent decorateTextField(JXTextField textField, int index) { 154 final DCComboBox<Class<?>> comboBox; 155 156 if (index < _comboBoxes.size()) { 157 comboBox = _comboBoxes.get(index); 158 } else { 159 comboBox = createComboBox(null); 160 } 161 125 162 comboBox.addListener(new Listener<Class<?>>() { 126 163 @Override … … 133 170 @Override 134 171 protected void onChange(DocumentEvent event) { 135 _typesPropertyWidget.fireValueChanged(); 172 // invoke later, because document events are fired before the 173 // textfield.getText() returns the new value 174 SwingUtilities.invokeLater(new Runnable() { 175 @Override 176 public void run() { 177 setUpdating(true); 178 _typesPropertyWidget.fireValueChanged(); 179 setUpdating(false); 180 } 181 }); 136 182 } 137 183 }); 138 139 _comboBoxes.add(comboBox);140 184 141 185 final DCPanel panel = new DCPanel(); -
DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/widgets/properties/MinimalPropertyWidget.java
r2843 r3138 31 31 * 32 32 * @author Kasper SÞrensen 33 * 33 * 34 34 * @param <E> 35 35 */ 36 36 public abstract class MinimalPropertyWidget<E> implements PropertyWidget<E> { 37 37 38 private static final Logger logger = LoggerFactory.getLogger(AbstractPropertyWidget.class); 38 private static final Logger logger = LoggerFactory 39 .getLogger(AbstractPropertyWidget.class); 39 40 40 41 private final AbstractBeanJobBuilder<?, ?, ?> _beanJobBuilder; 41 42 private final ConfiguredPropertyDescriptor _propertyDescriptor; 42 43 43 public MinimalPropertyWidget(AbstractBeanJobBuilder<?, ?, ?> beanJobBuilder, 44 private transient volatile int _updating; 45 46 public MinimalPropertyWidget( 47 AbstractBeanJobBuilder<?, ?, ?> beanJobBuilder, 44 48 ConfiguredPropertyDescriptor propertyDescriptor) { 45 49 _beanJobBuilder = beanJobBuilder; 46 50 _propertyDescriptor = propertyDescriptor; 51 _updating = 0; 47 52 } 48 53 … … 76 81 @Override 77 82 public void onValueTouched(E value) { 83 if (isUpdating()) { 84 // prevent update loops from a widget's own configuration change 85 // notification 86 return; 87 } 78 88 E existingValue = getValue(); 79 89 if (EqualsBuilder.equals(value, existingValue)) { … … 81 91 } 82 92 setValue(value); 93 } 94 95 /** 96 * Determines whether a property widget is currently updating/setting it's 97 * property value. When true, this property will not treat incoming 98 * notifications, since they will be triggered by itself. 99 * 100 * @return 101 */ 102 protected boolean isUpdating() { 103 return _updating == 0; 104 } 105 106 /** 107 * Provides a method for setting the "updating" flag (see 108 * {@link #isUpdating()}). 109 * 110 * @param updating 111 */ 112 protected void setUpdating(boolean updating) { 113 if (updating) { 114 _updating++; 115 } else { 116 assert _updating > 0; 117 _updating--; 118 } 83 119 } 84 120 … … 90 126 @SuppressWarnings("unchecked") 91 127 protected E getCurrentValue() { 92 return (E) getBeanJobBuilder().getConfiguredProperty(getPropertyDescriptor()); 128 return (E) getBeanJobBuilder().getConfiguredProperty( 129 getPropertyDescriptor()); 93 130 } 94 131 … … 96 133 97 134 protected final void fireValueChanged(Object newValue) { 135 setUpdating(true); 98 136 try { 99 _beanJobBuilder.setConfiguredProperty(_propertyDescriptor, newValue); 137 _beanJobBuilder 138 .setConfiguredProperty(_propertyDescriptor, newValue); 100 139 } catch (Exception e) { 101 140 // an exception will be thrown here if setting an invalid property … … 103 142 // fuzz about it) 104 143 if (logger.isWarnEnabled()) { 105 logger.warn("Exception thrown when setting configured property " + _propertyDescriptor, e); 144 logger.warn( 145 "Exception thrown when setting configured property " 146 + _propertyDescriptor, e); 106 147 } 148 } finally { 149 setUpdating(false); 107 150 } 108 151 } -
DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/widgets/properties/MultipleStringPropertyWidget.java
r3136 r3138 24 24 import java.awt.event.ActionEvent; 25 25 import java.awt.event.ActionListener; 26 import java.util.ArrayList; 26 27 import java.util.IdentityHashMap; 28 import java.util.List; 27 29 import java.util.Map; 28 30 … … 161 163 }); 162 164 163 JComponent decoration = decorateTextField(textField); 165 final int index = _textFieldPanel.getComponentCount(); 166 final JComponent decoration = decorateTextField(textField, index); 164 167 _textFieldDecorations.put(decoration, textField); 165 168 … … 170 173 } 171 174 172 protected JComponent decorateTextField(JXTextField textField ) {175 protected JComponent decorateTextField(JXTextField textField, int index) { 173 176 return textField; 174 177 } … … 177 180 public String[] getValue() { 178 181 Component[] components = _textFieldPanel.getComponents(); 179 String[] result = new String[components.length];182 List<String> result = new ArrayList<String>(); 180 183 for (int i = 0; i < components.length; i++) { 181 Component decoration = components[i]; 182 JXTextField textField = _textFieldDecorations.get(decoration); 183 result[i] = textField.getText(); 184 } 185 return result; 184 final Component decoration = components[i]; 185 final JXTextField textField = _textFieldDecorations.get(decoration); 186 final String text = textField.getText(); 187 if (isEmptyStringValid() || text.length() != 0) { 188 result.add(text); 189 } 190 } 191 return result.toArray(new String[result.size()]); 186 192 } 187 193 -
DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/widgets/properties/PropertyWidgetFactory.java
r3099 r3138 202 202 */ 203 203 public void onConfigurationChanged() { 204 Collection<PropertyWidget<?>> widgets = getWidgets();204 final Collection<PropertyWidget<?>> widgets = getWidgets(); 205 205 206 206 for (PropertyWidget<?> widget : widgets) { 207 207 @SuppressWarnings("unchecked") 208 PropertyWidget<Object> objectWidget = (PropertyWidget<Object>) widget; 209 Object value = _beanJobBuilder.getConfiguredProperty(objectWidget.getPropertyDescriptor()); 208 final PropertyWidget<Object> objectWidget = (PropertyWidget<Object>) widget; 209 final ConfiguredPropertyDescriptor propertyDescriptor = objectWidget.getPropertyDescriptor(); 210 final Object value = _beanJobBuilder.getConfiguredProperty(propertyDescriptor); 210 211 objectWidget.onValueTouched(value); 211 212 } -
DataCleaner/trunk/core/src/main/java/org/eobjects/datacleaner/widgets/properties/SingleFilePropertyWidget.java
r2941 r3138 40 40 import org.eobjects.datacleaner.widgets.FilenameTextField; 41 41 42 public final class SingleFilePropertyWidget extends AbstractPropertyWidget<File> { 42 public final class SingleFilePropertyWidget extends 43 AbstractPropertyWidget<File> { 43 44 44 45 private final FilenameTextField _filenameField; … … 46 47 47 48 @Inject 48 public SingleFilePropertyWidget(ConfiguredPropertyDescriptor propertyDescriptor, 49 AbstractBeanJobBuilder<?, ?, ?> beanJobBuilder, UserPreferences userPreferences) { 49 public SingleFilePropertyWidget( 50 ConfiguredPropertyDescriptor propertyDescriptor, 51 AbstractBeanJobBuilder<?, ?, ?> beanJobBuilder, 52 UserPreferences userPreferences) { 50 53 super(beanJobBuilder, propertyDescriptor); 51 54 _userPreferences = userPreferences; … … 54 57 String[] extensions = null; 55 58 56 FileProperty fileProperty = propertyDescriptor.getAnnotation(FileProperty.class); 59 FileProperty fileProperty = propertyDescriptor 60 .getAnnotation(FileProperty.class); 57 61 if (fileProperty != null) { 58 62 openFileDialog = fileProperty.accessMode() == FileAccessMode.OPEN; … … 61 65 } 62 66 63 _filenameField = new FilenameTextField(_userPreferences.getConfiguredFileDirectory(), openFileDialog); 67 _filenameField = new FilenameTextField( 68 _userPreferences.getConfiguredFileDirectory(), openFileDialog); 64 69 65 70 if (extensions != null && extensions.length > 0) { 66 List<FileFilter> filters = new ArrayList<FileFilter>(extensions.length); 71 List<FileFilter> filters = new ArrayList<FileFilter>( 72 extensions.length); 67 73 for (String extension : extensions) { 68 FileFilter filter = new ExtensionFilter(extension.toUpperCase() + " file", "." + extension); 74 FileFilter filter = new ExtensionFilter(extension.toUpperCase() 75 + " file", "." + extension); 69 76 filters.add(filter); 70 77 _filenameField.addChoosableFileFilter(filter); … … 73 80 _filenameField.setSelectedFileFilter(filters.get(0)); 74 81 } else { 75 FileFilter filter = FileFilters.combined("All suggested file formats", 82 FileFilter filter = FileFilters.combined( 83 "All suggested file formats", 76 84 filters.toArray(new FileFilter[filters.size()])); 77 85 _filenameField.setSelectedFileFilter(filter); … … 86 94 } 87 95 88 _filenameField.getTextField().getDocument().addDocumentListener(new DCDocumentListener() { 96 _filenameField.getTextField().getDocument() 97 .addDocumentListener(new DCDocumentListener() { 89 98 90 @Override91 protected void onChange(DocumentEvent e) {92 fireValueChanged();93 }94 });99 @Override 100 protected void onChange(DocumentEvent e) { 101 fireValueChanged(); 102 } 103 }); 95 104 96 105 _filenameField.addFileSelectionListener(new FileSelectionListener() { 97 106 @Override 98 public void onSelected(FilenameTextField filenameTextField, File file) { 107 public void onSelected(FilenameTextField filenameTextField, 108 File file) { 99 109 File dir = file.getParentFile(); 100 110 _userPreferences.setConfiguredFileDirectory(dir); … … 104 114 105 115 add(_filenameField); 116 } 117 118 @Override 119 public boolean isSet() { 120 return _filenameField.getFile() != null; 106 121 } 107 122 … … 128 143 129 144 File existingFile = _filenameField.getFile(); 130 if (existingFile != null && existingFile.getAbsoluteFile().equals(value.getAbsoluteFile())) { 145 if (existingFile != null 146 && existingFile.getAbsoluteFile().equals( 147 value.getAbsoluteFile())) { 131 148 return; 132 149 }
Note: See TracChangeset
for help on using the changeset viewer.
