blob: 3468df0b1888ff33ecb229839f7e2a0cbec1fe80 [file] [log] [blame]
package org.eclipse.emf.henshin.variability.ui.views;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.IDisposeListener;
import org.eclipse.core.databinding.observable.IStaleListener;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.IValueChangeListener;
import org.eclipse.emf.databinding.internal.EMFObservableValueDecorator;
import org.eclipse.emf.henshin.model.Rule;
import org.eclipse.emf.henshin.variability.wrapper.TransactionalVariabilityFactory;
import org.eclipse.emf.henshin.variability.wrapper.VariabilityConstants;
import org.eclipse.emf.henshin.variability.wrapper.VariabilityFactory;
import org.eclipse.emf.henshin.variability.wrapper.VariabilityRule;
import org.eclipse.emf.henshin.variability.wrapper.VariabilityTransactionHelper;
/**
* Provides an observable value for the Feature Model {@link org.eclipse.emf.henshin.model.Annotation Annotation} of variability-aware {@link Rule}s.
*
* @author Stefan Schulz
*
* @param <T>
*/
public class ObservableFeatureModelValue<T> implements IObservableValue<String>{
IObservableValue<String> value;
boolean shouldUpdate;
ObservableFeatureModelValue(IObservableValue<String> value) {
this.value = value;
}
@Override
public Realm getRealm() {
return value.getRealm();
}
@Override
public void addChangeListener(IChangeListener listener) {
value.addChangeListener(listener);
}
@Override
public void removeChangeListener(IChangeListener listener) {
value.removeChangeListener(listener);
}
@Override
public void addStaleListener(IStaleListener listener) {
value.addStaleListener(listener);
}
@Override
public void removeStaleListener(IStaleListener listener) {
value.removeStaleListener(listener);
}
@Override
public boolean isStale() {
return value.isStale();
}
@Override
public void addDisposeListener(IDisposeListener listener) {
value.addDisposeListener(listener);
}
@Override
public void removeDisposeListener(IDisposeListener listener) {
value.removeDisposeListener(listener);
}
@Override
public boolean isDisposed() {
return value.isDisposed();
}
@Override
public void dispose() {
value.dispose();
}
@Override
public Object getValueType() {
return value.getValueType();
}
@Override
public String getValue() {
VariabilityRule rule = getTargetVariabilityRule();
if (rule != null) {
return getTargetVariabilityRule().getFeatureModel();
} else {
return value.getValue().toString();
}
}
@Override
public void setValue(String value) {
shouldUpdate = false;
VariabilityRule rule = getTargetVariabilityRule();
if (rule != null) {
VariabilityTransactionHelper.setAnnotationValue(rule, VariabilityConstants.FEATURE_MODEL, value);
}
shouldUpdate = true;
}
@Override
public void addValueChangeListener(IValueChangeListener<? super String> listener) {
value.addValueChangeListener(listener);
}
@Override
public void removeValueChangeListener(IValueChangeListener<? super String> listener) {
value.removeValueChangeListener(listener);
}
private VariabilityRule getTargetVariabilityRule() {
if (this.value instanceof EMFObservableValueDecorator) {
EMFObservableValueDecorator emfValue = (EMFObservableValueDecorator) this.value;
if (emfValue.getObserved() != null && emfValue.getObserved() instanceof Rule) {
return TransactionalVariabilityFactory.INSTANCE.createVariabilityRule((Rule) emfValue.getObserved());
}
}
return null;
}
public boolean shouldUpdate() {
return shouldUpdate;
}
}