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 org.leumasjaffe.recipe.viewmodel.ScaleFactor; 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<>(); PreparationPanel panelPrep; RestPanel panelRest; @Getter(AccessLevel.PACKAGE) AutoGrowPanel panelSteps; // TODO Re-configure to support this(); setModel(phase); pattern. public PhasePanel(final Phase phase, final ScaleFactor scale) { setLayout(new VerticalLayout(5)); panelPrep = new PreparationPanel(phase, scale); add(panelPrep); panelSteps = new AutoGrowPanel<>(Step::new, s -> new StepPanel(s, scale)); panelSteps.setGap(5); add(panelSteps); panelRest = new RestPanel(phase.getRest()); add(panelRest); 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 setEnabled(boolean enabled) { super.setEnabled(enabled); panelPrep.setEnabled(enabled); panelSteps.setEnabled(enabled); panelRest.setEnabled(enabled); } @Override public void removeNotify() { super.removeNotify(); ObserverDispatch.unsubscribeAll(listener); } }