package jetbrains.mps.lang.editor.diagram.runtime.jetpad.property;
/*Generated by MPS */
import jetbrains.jetpad.model.property.BaseReadableProperty;
import jetbrains.jetpad.model.event.Listeners;
import jetbrains.jetpad.model.event.EventHandler;
import jetbrains.jetpad.model.property.PropertyChangeEvent;
import jetbrains.jetpad.model.property.ReadableProperty;
import jetbrains.jetpad.base.Registration;
import jetbrains.jetpad.model.event.ListenerCaller;
public class DependentProperty<ValueT> extends BaseReadableProperty<ValueT> {
private Listeners<EventHandler<? super PropertyChangeEvent<ValueT>>> myHandlers;
private ReadableProperty<ValueT> myMainProperty;
private ReadableProperty<?>[] myDependecies;
private Registration[] myRegistrations;
private ValueT myOldValue;
public DependentProperty(ReadableProperty<ValueT> mainProperty, ReadableProperty<?>... dependencies) {
myMainProperty = mainProperty;
myDependecies = new ReadableProperty<?>[dependencies.length + 1];
myDependecies[0] = mainProperty;
System.arraycopy(dependencies, 0, myDependecies, 1, dependencies.length);
}
public ValueT get() {
return myMainProperty.get();
}
public Registration addHandler(EventHandler<? super PropertyChangeEvent<ValueT>> handler) {
if (myHandlers == null) {
myHandlers = new Listeners<EventHandler<? super PropertyChangeEvent<ValueT>>>();
}
if (myHandlers.isEmpty()) {
doAddListeners();
}
final Registration reg = myHandlers.add(handler);
return new Registration() {
public void remove() {
reg.remove();
if (myHandlers.isEmpty()) {
doRemoveListeners();
}
}
};
}
private void doAddListeners() {
EventHandler<PropertyChangeEvent<?>> handler = new EventHandler<PropertyChangeEvent<?>>() {
public void onEvent(PropertyChangeEvent<?> event) {
somethingChange();
}
};
myRegistrations = new Registration[myDependecies.length];
myOldValue = get();
for (int i = 0; i < myDependecies.length; i++) {
myRegistrations[i] = myDependecies[i].addHandler(handler);
}
}
private void doRemoveListeners() {
for (Registration reg : myRegistrations) {
reg.remove();
}
myRegistrations = null;
}
private void somethingChange() {
ValueT newValue = get();
ValueT oldValue = myOldValue;
myOldValue = newValue;
if (myHandlers != null) {
final PropertyChangeEvent<ValueT> event = new PropertyChangeEvent<ValueT>(oldValue, newValue);
myHandlers.fire(new ListenerCaller<EventHandler<? super PropertyChangeEvent<ValueT>>>() {
public void call(EventHandler<? super PropertyChangeEvent<ValueT>> handler) {
handler.onEvent(event);
}
});
}
}
}