package org.fxmisc.easybind;
import java.lang.ref.WeakReference;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.property.Property;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
@Deprecated
class ConditionalBinding<T> implements Subscription, InvalidationListener,
ChangeListener<Boolean> {
private final WeakReference<Property<T>> target;
private final ObservableValue<? extends T> source;
private final ObservableValue<Boolean> condition;
private boolean unsubscribed = false;
public ConditionalBinding(
Property<T> target,
ObservableValue<? extends T> source,
ObservableValue<Boolean> condition) {
this.target = new WeakReference<>(target);
this.source = source;
this.condition = condition;
// add an empty listener to target just to maintain a strong reference
// to this object for the lifetime of target
target.addListener(this);
condition.addListener((ChangeListener<Boolean>) this);
if(condition.getValue()) {
target.bind(source);
}
}
@Override
public void changed(ObservableValue<? extends Boolean> cond,
Boolean wasTrue, Boolean isTrue) {
Property<T> tgt = this.target.get();
if(tgt == null) {
condition.removeListener((ChangeListener<Boolean>) this);
} else if(isTrue) {
tgt.bind(source);
} else {
tgt.unbind();
}
}
@Override
public void invalidated(Observable obs) {
// do nothing
}
@Override
public void unsubscribe() {
if(!unsubscribed) {
condition.removeListener((ChangeListener<Boolean>) this);
Property<T> tgt = this.target.get();
if(tgt != null) {
tgt.removeListener(this);
tgt.unbind();
}
unsubscribed = true;
}
}
}