in gwt-util/src/main/java/jetbrains/jetpad/mapper/gwt/DomUtil.java [145:205]
public static Property<Boolean> checkbox(final InputElement element) {
return new Property<Boolean>() {
private Registration myTimerRegistration;
private Listeners<EventHandler<? super PropertyChangeEvent<Boolean>>> myListeners = new Listeners<>();
@Override
public Boolean get() {
return element.isChecked();
}
@Override
public void set(Boolean value) {
element.setChecked(value);
}
@Override
public Registration addHandler(EventHandler<? super PropertyChangeEvent<Boolean>> handler) {
if (myListeners.isEmpty()) {
final Value<Boolean> value = new Value<>(element.isChecked());
final Timer timer = new Timer() {
@Override
public void run() {
final boolean currentValue = element.isChecked();
if (currentValue != value.get()) {
myListeners.fire(new ListenerCaller<EventHandler<? super PropertyChangeEvent<Boolean>>>() {
@Override
public void call(EventHandler<? super PropertyChangeEvent<Boolean>> l) {
l.onEvent(new PropertyChangeEvent<>(value.get(), currentValue));
}
});
value.set(currentValue);
}
}
};
timer.scheduleRepeating(100);
myTimerRegistration = new Registration() {
@Override
protected void doRemove() {
timer.cancel();
}
};
}
final Registration reg = myListeners.add(handler);
return new Registration() {
@Override
protected void doRemove() {
reg.remove();
if (myListeners.isEmpty()) {
myTimerRegistration.remove();
myTimerRegistration = null;
}
}
};
}
@Override
public String getPropExpr() {
return "checkbox(" + element + ")";
}
};
}