package org.leumasjaffe.observer; import java.util.Objects; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; import javax.swing.text.JTextComponent; import org.leumasjaffe.event.AnyActionDocumentListener; import lombok.experimental.FieldDefaults; import lombok.AccessLevel; @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true) public class ObservableController extends ObservableListener { BiFunction func; public ObservableController(final S comp, final BiFunction func, final BiConsumer update) { super(comp, update); this.func = func; AnyActionDocumentListener.skipEmpty(comp, evt -> accept( ) ); } public ObservableController(final S comp, final BiFunction func, final BiConsumer update, final Consumer onEmpty) { super(comp, update); this.func = func; AnyActionDocumentListener.emptyOrText( comp, e -> onEmpty.accept( impl.getModel() ), evt -> accept( ) ); } private boolean update() { return func.apply( impl.getComponent().getText( ), impl.getModel() ); } private void accept() { Objects.requireNonNull( impl.getModel() ); if ( update( ) ) { impl.notifySubscribers(impl.getModel()); } } }