ObservableController.java 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package org.leumasjaffe.observer;
  2. import java.util.Objects;
  3. import java.util.function.BiConsumer;
  4. import java.util.function.BiFunction;
  5. import java.util.function.Consumer;
  6. import javax.swing.text.JTextComponent;
  7. import org.leumasjaffe.event.AnyActionDocumentListener;
  8. import lombok.experimental.FieldDefaults;
  9. import lombok.AccessLevel;
  10. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  11. public class ObservableController<S extends JTextComponent, T extends Observable> extends ObservableListener<S, T> {
  12. BiFunction<String, T, Boolean> func;
  13. public ObservableController(final S comp, final BiFunction<String, T, Boolean> func,
  14. final BiConsumer<? super S, ? super T> update) {
  15. super(comp, update);
  16. this.func = func;
  17. AnyActionDocumentListener.skipEmpty(comp, evt -> accept( ) );
  18. }
  19. public ObservableController(final S comp, final BiFunction<String, T, Boolean> func,
  20. final BiConsumer<? super S, ? super T> update, final Consumer<T> onEmpty) {
  21. super(comp, update);
  22. this.func = func;
  23. AnyActionDocumentListener.emptyOrText( comp,
  24. e -> onEmpty.accept( impl.getModel() ),
  25. evt -> accept( ) );
  26. }
  27. private boolean update() {
  28. return func.apply( impl.getComponent().getText( ), impl.getModel() );
  29. }
  30. private void accept() {
  31. Objects.requireNonNull( impl.getModel() );
  32. if ( update( ) ) {
  33. impl.notifySubscribers(impl.getModel());
  34. }
  35. }
  36. }