package org.eclipse.papyrus.uml.tools.databinding; import org.eclipse.core.databinding.observable.ChangeEvent; import org.eclipse.core.databinding.observable.IChangeListener; import org.eclipse.core.databinding.observable.value.AbstractObservableValue; import org.eclipse.core.databinding.observable.value.ValueDiff; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.papyrus.uml.tools.Activator; import org.eclipse.uml2.uml.Extension; public class ExtensionRequiredObservableValue extends AbstractObservableValue implements IChangeListener { private Extension extension; private MultiplicityObservableValue observable; private boolean currentValue; public ExtensionRequiredObservableValue(Extension extension, EditingDomain domain) { this.extension = extension; if(!this.extension.getOwnedEnds().isEmpty()) { observable = new MultiplicityObservableValue(this.extension.getOwnedEnds().get(0), domain); observable.addChangeListener(this); } currentValue = extension.isRequired(); } public Object getValueType() { return Boolean.class; } @Override protected Boolean doGetValue() { return extension.isRequired(); } @Override protected void doSetValue(Object value) { if(!(value instanceof Boolean)) { return; } Boolean required = (Boolean)value; if(extension.getOwnedEnds().isEmpty()) { Activator.log.warn("Unable to change the extension \"isRequired\" property"); } observable.setValue(required ? MultiplicityObservableValue.ONE : MultiplicityObservableValue.OPTIONAL); currentValue = required; } @Override public void dispose() { observable.removeChangeListener(this); observable.dispose(); observable = null; super.dispose(); } public void handleChange(ChangeEvent event) { final boolean oldValue = currentValue; final boolean newValue = doGetValue(); currentValue = newValue; fireValueChange(new ValueDiff() { @Override public Object getOldValue() { return oldValue; } @Override public Object getNewValue() { return newValue; } }); } }