ObservableController.java 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package org.leumasjaffe.charsheet.observer;
  2. import java.util.Objects;
  3. import java.util.function.Consumer;
  4. import java.util.function.Function;
  5. import javax.swing.text.JTextComponent;
  6. import org.leumasjaffe.charsheet.observer.helper.Helper;
  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<T extends Observable> extends ObservableListener<T> {
  12. Helper<T> func;
  13. public ObservableController(final JTextComponent text, final Helper<T> func,
  14. final Function<? super T, String> stringify) {
  15. super(text, stringify);
  16. this.func = func;
  17. AnyActionDocumentListener.skipEmpty(text, evt -> accept( ) );
  18. }
  19. public ObservableController(final JTextComponent text, final Helper<T> func,
  20. final Function<? super T, String> stringify, final Consumer<T> onEmpty) {
  21. super(text, stringify);
  22. this.func = func;
  23. AnyActionDocumentListener.emptyOrText( text,
  24. e -> onEmpty.accept( model ),
  25. evt -> accept( ) );
  26. }
  27. private boolean update() {
  28. return func.apply( text.getText( ), model );
  29. }
  30. private void accept() {
  31. Objects.requireNonNull( model );
  32. if ( update( ) ) {
  33. ObserverDispatch.notifySubscribers( model, this );
  34. }
  35. }
  36. }