|
|
@@ -11,6 +11,8 @@ import javax.swing.JTextField;
|
|
|
|
|
|
import org.jdesktop.swingx.VerticalLayout;
|
|
|
import org.leumasjaffe.observer.ObservableListener;
|
|
|
+import org.leumasjaffe.observer.ObserverDispatch;
|
|
|
+import org.leumasjaffe.recipe.controller.ReplaceChildrenController;
|
|
|
import org.leumasjaffe.recipe.model.CollatedDuration;
|
|
|
import org.leumasjaffe.recipe.model.Element;
|
|
|
import org.leumasjaffe.recipe.model.RecipeCard;
|
|
|
@@ -22,12 +24,20 @@ import lombok.experimental.FieldDefaults;
|
|
|
import java.awt.Font;
|
|
|
|
|
|
@SuppressWarnings("serial")
|
|
|
-@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
|
|
|
+@FieldDefaults(level=AccessLevel.PRIVATE)
|
|
|
public class SummaryPanel extends JPanel {
|
|
|
+ ReplaceChildrenController<RecipeCard, Element> controller;
|
|
|
ObservableListener<CollatedDurationPanel, RecipeCard> durationListener;
|
|
|
ObservableListener<JPanel, RecipeCard> childListener;
|
|
|
|
|
|
public SummaryPanel(final RecipeCard card) {
|
|
|
+ controller = new ReplaceChildrenController<>(RecipeCard::getElements, element -> {
|
|
|
+ JPanel wrapper = new JPanel(new VerticalLayout());
|
|
|
+ wrapper.add(new ElementPanel(element));
|
|
|
+ wrapper.add(new JSeparator());
|
|
|
+ return wrapper;
|
|
|
+ });
|
|
|
+
|
|
|
GridBagLayout gridBagLayout = new GridBagLayout();
|
|
|
gridBagLayout.columnWidths = new int[]{0, 0, 0};
|
|
|
gridBagLayout.rowHeights = new int[]{0, 0, 0, 0};
|
|
|
@@ -111,21 +121,19 @@ public class SummaryPanel extends JPanel {
|
|
|
durationListener = new ObservableListener<>(panelDuration,
|
|
|
(c, v) -> c.setModel(v.getCollatedDuration()));
|
|
|
|
|
|
- childListener = new ObservableListener<>(panelIngredients, (c, v) -> {
|
|
|
- if (c.getComponents().length == v.getElements().size()) {
|
|
|
- return;
|
|
|
- }
|
|
|
- c.removeAll();
|
|
|
- for (final Element element : v.getElements()) {
|
|
|
- JPanel wrapper = new JPanel(new VerticalLayout());
|
|
|
- wrapper.add(new ElementPanel(element));
|
|
|
- wrapper.add(new JSeparator());
|
|
|
- c.add(wrapper);
|
|
|
- }
|
|
|
- });
|
|
|
+ // This indirection allows for testing of controller
|
|
|
+ childListener = new ObservableListener<>(panelIngredients,
|
|
|
+ (c, v) -> controller.accept(c, v));
|
|
|
|
|
|
durationListener.setObserved(card);
|
|
|
childListener.setObserved(card);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void removeNotify() {
|
|
|
+ super.removeNotify();
|
|
|
+ ObserverDispatch.unsubscribeAll(durationListener);
|
|
|
+ ObserverDispatch.unsubscribeAll(childListener);
|
|
|
+ }
|
|
|
+
|
|
|
}
|