in model/src/main/java/jetbrains/jetpad/model/property/Properties.java [255:337]
public static <SourceT, TargetT> Property<TargetT> selectRw(final ReadableProperty<SourceT> source, final Function<SourceT, Property<TargetT>> fun) {
final Supplier<TargetT> calc = new Supplier<TargetT>() {
@Override
public TargetT get() {
SourceT value = source.get();
if (value == null) return null;
ReadableProperty<TargetT> prop = fun.apply(value);
if (prop == null) return null;
return prop.get();
}
};
class MyProperty extends BaseDerivedProperty<TargetT> implements Property<TargetT> {
private Property<TargetT> myTargetProperty;
private Registration mySourceRegistration;
private Registration myTargetRegistration;
MyProperty() {
super(calc.get());
}
@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 void set(TargetT value) {
if (myTargetProperty == null) return;
myTargetProperty.set(value);
}
@Override
public String getPropExpr() {
return "select(" + source.getPropExpr() + ", " + fun + ")";
}
}
return new MyProperty();
}