in model/src/main/java/jetbrains/jetpad/model/property/Properties.java [339:375]
public static <EventT, ValueT> EventSource<EventT> selectEvent(final ReadableProperty<ValueT> prop, final Function<ValueT, EventSource<EventT>> selector) {
return new EventSource<EventT>() {
@Override
public Registration addHandler(final EventHandler<? super EventT> handler) {
final Value<Registration> esReg = new Value<>(Registration.EMPTY);
final Runnable update = new Runnable() {
@Override
public void run() {
esReg.get().remove();
if (prop.get() != null) {
esReg.set(selector.apply(prop.get()).addHandler(handler));
} else {
esReg.set(Registration.EMPTY);
}
}
};
update.run();
final Registration propReg = prop.addHandler(new EventHandler<PropertyChangeEvent<ValueT>>() {
@Override
public void onEvent(PropertyChangeEvent<ValueT> event) {
update.run();
}
});
return new Registration() {
@Override
protected void doRemove() {
propReg.remove();
esReg.get().remove();
}
};
}
};
}