package name.abuchen.portfolio.ui.util.viewers; import name.abuchen.portfolio.money.Values; import name.abuchen.portfolio.ui.util.CurrencyToStringConverter; import name.abuchen.portfolio.ui.util.NumberVerifyListener; import name.abuchen.portfolio.ui.util.StringToCurrencyConverter; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; public class ValueEditingSupport extends PropertyEditingSupport { private final StringToCurrencyConverter stringToLong; private final CurrencyToStringConverter longToString; public ValueEditingSupport(Class<?> subjectType, String attributeName, Values<? extends Number> valueType) { super(subjectType, attributeName); Class<?> propertyType = descriptor().getPropertyType(); if (!long.class.isAssignableFrom(propertyType) && !int.class.isAssignableFrom(propertyType)) throw new UnsupportedOperationException(String.format( "Property %s needs to be of type long or int to serve as decimal", attributeName)); //$NON-NLS-1$ this.stringToLong = new StringToCurrencyConverter(valueType); this.longToString = new CurrencyToStringConverter(valueType); } @Override public CellEditor createEditor(Composite composite) { TextCellEditor textEditor = new TextCellEditor(composite); ((Text) textEditor.getControl()).setTextLimit(20); ((Text) textEditor.getControl()).addVerifyListener(new NumberVerifyListener()); return textEditor; } @Override public final Object getValue(Object element) throws Exception { return longToString.convert(descriptor().getReadMethod().invoke(adapt(element))); } @Override public void setValue(Object element, Object value) throws Exception { Object subject = adapt(element); Number newValue = (Number) stringToLong.convert(String.valueOf(value)); if (int.class.isAssignableFrom(descriptor().getPropertyType()) || Integer.class.isAssignableFrom(descriptor().getPropertyType())) newValue = Integer.valueOf(newValue.intValue()); Number oldValue = (Number) descriptor().getReadMethod().invoke(subject); if (!newValue.equals(oldValue)) { descriptor().getWriteMethod().invoke(subject, newValue); notify(element, newValue, oldValue); } } }