PhasePanel.java 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 org.leumasjaffe.recipe.viewmodel.ScaleFactor;
  11. import lombok.AccessLevel;
  12. import lombok.Getter;
  13. import lombok.experimental.FieldDefaults;
  14. import org.jdesktop.swingx.VerticalLayout;
  15. @SuppressWarnings("serial")
  16. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  17. public class PhasePanel extends JPanel {
  18. ForwardingObservableListener<Phase> listener = new ForwardingObservableListener<>();
  19. PreparationPanel panelPrep;
  20. RestPanel panelRest;
  21. @Getter(AccessLevel.PACKAGE) AutoGrowPanel<StepPanel, Step> panelSteps;
  22. // TODO Re-configure to support this(); setModel(phase); pattern.
  23. public PhasePanel(final Phase phase, final ScaleFactor scale) {
  24. setLayout(new VerticalLayout(5));
  25. panelPrep = new PreparationPanel(phase, scale);
  26. add(panelPrep);
  27. panelSteps = new AutoGrowPanel<>(Step::new, s -> new StepPanel(s, scale));
  28. panelSteps.setGap(5);
  29. add(panelSteps);
  30. panelRest = new RestPanel(phase.getRest());
  31. add(panelRest);
  32. panelSteps.setModel(phase.getCooking(), added -> {
  33. listener.setObserved(phase, allChildren(phase));
  34. if (!added) {
  35. ObserverDispatch.notifySubscribers(phase);
  36. }
  37. });
  38. listener.setObserved(phase, allChildren(phase));
  39. }
  40. private static List<Observable> allChildren(Phase phase) {
  41. List<Observable> children = new ArrayList<>(phase.getCooking());
  42. children.add(phase.getPreparation());
  43. children.add(phase.getRest());
  44. return children;
  45. }
  46. @Override
  47. public void setEnabled(boolean enabled) {
  48. super.setEnabled(enabled);
  49. panelPrep.setEnabled(enabled);
  50. panelSteps.setEnabled(enabled);
  51. panelRest.setEnabled(enabled);
  52. }
  53. @Override
  54. public void removeNotify() {
  55. super.removeNotify();
  56. ObserverDispatch.unsubscribeAll(listener);
  57. }
  58. }