package org.leumasjaffe.recipe.view; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; import org.leumasjaffe.observer.ForwardingObservableListener; import org.leumasjaffe.observer.Observable; import org.leumasjaffe.observer.ObserverDispatch; import org.leumasjaffe.recipe.model.Phase; import org.leumasjaffe.recipe.model.Step; import lombok.AccessLevel; import lombok.Getter; import lombok.experimental.FieldDefaults; import org.jdesktop.swingx.VerticalLayout; @SuppressWarnings("serial") @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true) public class PhasePanel extends JPanel { ForwardingObservableListener listener = new ForwardingObservableListener<>(); @Getter(AccessLevel.PACKAGE) AutoGrowPanel panelSteps; public PhasePanel(final Phase phase) { setLayout(new VerticalLayout(5)); if (phase.getPreparation().isPresent()) { add(new PreparationPanel(phase)); } final List steps = phase.getCooking(); panelSteps = new AutoGrowPanel(StepPanel::new, Step::new, step -> { steps.add(step); listener.setObserved(phase, allChildren(phase)); ObserverDispatch.notifySubscribers(phase); }, i -> { steps.remove(i); listener.setObserved(phase, allChildren(phase)); ObserverDispatch.notifySubscribers(phase); }, 5, steps.toArray(new Step[0])); add(panelSteps); phase.getRest().ifPresent(rest -> add(new RestPanel(rest))); listener.setObserved(phase, allChildren(phase)); } private static List allChildren(Phase phase) { List children = new ArrayList<>(phase.getCooking()); phase.getPreparation().ifPresent(children::add); phase.getRest().ifPresent(children::add); return children; } @Override public void removeNotify() { super.removeNotify(); ObserverDispatch.unsubscribeAll(listener); } }