in model/src/main/java/jetbrains/jetpad/model/property/Properties.java [180:253]
public static <SourceT, TargetT> ReadableProperty<TargetT> select(
final ReadableProperty<SourceT> source, final Function<? super SourceT, ReadableProperty<TargetT>> fun,
final TargetT nullValue
) {
final Supplier<TargetT> calc = new Supplier<TargetT>() {
@Override
public TargetT get() {
SourceT value = source.get();
if (value == null) return nullValue;
ReadableProperty<TargetT> prop = fun.apply(value);
if (prop == null) return null;
return prop.get();
}
};
return new BaseDerivedProperty<TargetT>(null) {
private ReadableProperty<TargetT> myTargetProperty;
private Registration mySourceRegistration;
private Registration myTargetRegistration;
@Override
protected void doAddListeners() {
myTargetProperty = source.get() == null ? null : fun.apply(source.get());
final EventHandler<PropertyChangeEvent<TargetT>> targetHandler = new EventHandler<PropertyChangeEvent<TargetT>>() {
@Override
public void onEvent(PropertyChangeEvent<TargetT> event) {
somethingChanged();
}
};
EventHandler<PropertyChangeEvent<SourceT>> sourceHandler = new EventHandler<PropertyChangeEvent<SourceT>>() {
@Override
public void onEvent(PropertyChangeEvent<SourceT> event) {
if (myTargetProperty != null) {
myTargetRegistration.remove();
}
SourceT sourceValue = source.get();
if (sourceValue != null) {
myTargetProperty = fun.apply(sourceValue);
} else {
myTargetProperty = null;
}
if (myTargetProperty != null) {
myTargetRegistration = myTargetProperty.addHandler(targetHandler);
}
somethingChanged();
}
};
mySourceRegistration = source.addHandler(sourceHandler);
if (myTargetProperty != null) {
myTargetRegistration = myTargetProperty.addHandler(targetHandler);
}
}
@Override
protected void doRemoveListeners() {
if (myTargetProperty != null) {
myTargetRegistration.remove();
}
mySourceRegistration.remove();
}
@Override
protected TargetT doGet() {
return calc.get();
}
@Override
public String getPropExpr() {
return "select(" + source.getPropExpr() + ", " + fun + ")";
}
};
}