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; // TODO Re-configure to support this(); setModel(phase); pattern. public PhasePanel(final Phase phase) { setLayout(new VerticalLayout(5)); add(new PreparationPanel(phase)); panelSteps = new AutoGrowPanel<>(Step::new, StepPanel::new); panelSteps.setGap(5); add(panelSteps); add(new RestPanel(phase.getRest())); panelSteps.setModel(phase.getCooking(), added -> { listener.setObserved(phase, allChildren(phase)); if (!added) { ObserverDispatch.notifySubscribers(phase); } }); listener.setObserved(phase, allChildren(phase)); } private static List allChildren(Phase phase) { List children = new ArrayList<>(phase.getCooking()); children.add(phase.getPreparation()); children.add(phase.getRest()); return children; } @Override public void removeNotify() { super.removeNotify(); ObserverDispatch.unsubscribeAll(listener); } }