PhasePanel.java 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package org.leumasjaffe.recipe.view;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.swing.JPanel;
  5. import org.leumasjaffe.observer.ForwardingObservableListener;
  6. import org.leumasjaffe.observer.Observable;
  7. import org.leumasjaffe.observer.ObserverDispatch;
  8. import org.leumasjaffe.recipe.model.Phase;
  9. import org.leumasjaffe.recipe.model.Step;
  10. import lombok.AccessLevel;
  11. import lombok.Getter;
  12. import lombok.experimental.FieldDefaults;
  13. import org.jdesktop.swingx.VerticalLayout;
  14. @SuppressWarnings("serial")
  15. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  16. public class PhasePanel extends JPanel {
  17. ForwardingObservableListener<Phase> listener = new ForwardingObservableListener<>();
  18. @Getter(AccessLevel.PACKAGE) AutoGrowPanel panelSteps;
  19. public PhasePanel(final Phase phase) {
  20. setLayout(new VerticalLayout(5));
  21. if (phase.getPreparation().isPresent()) {
  22. add(new PreparationPanel(phase));
  23. }
  24. final List<Step> steps = phase.getCooking();
  25. panelSteps = new AutoGrowPanel(StepPanel::new, Step::new,
  26. step -> {
  27. steps.add(step);
  28. listener.setObserved(phase, allChildren(phase));
  29. ObserverDispatch.notifySubscribers(phase);
  30. },
  31. i -> {
  32. steps.remove(i);
  33. listener.setObserved(phase, allChildren(phase));
  34. ObserverDispatch.notifySubscribers(phase);
  35. }, 5, steps.toArray(new Step[0]));
  36. add(panelSteps);
  37. phase.getRest().ifPresent(rest -> add(new RestPanel(rest)));
  38. listener.setObserved(phase, allChildren(phase));
  39. }
  40. private static List<Observable> allChildren(Phase phase) {
  41. List<Observable> children = new ArrayList<>(phase.getCooking());
  42. phase.getPreparation().ifPresent(children::add);
  43. phase.getRest().ifPresent(children::add);
  44. return children;
  45. }
  46. @Override
  47. public void removeNotify() {
  48. super.removeNotify();
  49. ObserverDispatch.unsubscribeAll(listener);
  50. }
  51. }