package org.eclipse.papyrus.infra.widgets.databinding; import org.eclipse.core.databinding.observable.value.AbstractObservableValue; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.ValueDiff; import org.eclipse.papyrus.infra.tools.databinding.AggregatedObservable; import org.eclipse.papyrus.infra.widgets.providers.UnchangedObject; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; /** * An ObservableValue for Text field, with support for AggregatedObservable * * @author Camille Letavernier */ public class TextObservableValue extends AbstractObservableValue implements Listener { private Text text; private int eventType; private Object currentValue; /** * If the Text field may represent more than one value, * use an AggregatedObservable * * May be null */ protected AggregatedObservable modelProperty; /** * Constructor * * @param text * The Text field to observe * @param modelProperty * The model IObservableValue * @param eventType * The eventType to listen to. When the event is fired by the Text * widget, this IObservableValue will fire a ChangeEvent */ public TextObservableValue(Text text, IObservableValue modelProperty, int eventType) { this.text = text; this.eventType = eventType; if(modelProperty instanceof AggregatedObservable) { this.modelProperty = (AggregatedObservable)modelProperty; } this.text.addListener(eventType, this); } public Object getValueType() { return String.class; } @Override protected Object doGetValue() { if(UnchangedObject.instance.toString().equals(text.getText())) { return null; } else { return text.getText(); } } @Override protected void doSetValue(Object value) { if(modelProperty != null && modelProperty.hasDifferentValues()) { this.text.setText(UnchangedObject.instance.toString()); this.currentValue = UnchangedObject.instance; } else { if(value instanceof String) { this.text.setText((String)value); this.currentValue = value; } else if(value == null) { this.text.setText(""); //$NON-NLS-1$ this.currentValue = null; } } } public void handleEvent(Event event) { final Object oldValue = currentValue; final Object newValue = getValue(); if(newValue == null) { return; } currentValue = newValue; if((eventType & event.type) != 0) { fireValueChange(new ValueDiff() { @Override public Object getOldValue() { return oldValue; } @Override public Object getNewValue() { return newValue; } }); } } }