Jelajahi Sumber

Add a ScaleFactor object.

Sam Jaffe 4 tahun lalu
induk
melakukan
18a1c7c04e
24 mengubah file dengan 120 tambahan dan 46 penghapusan
  1. 3 1
      src/main/lombok/org/leumasjaffe/recipe/controller/AddPhaseAction.java
  2. 4 0
      src/main/lombok/org/leumasjaffe/recipe/model/Amount.java
  3. 8 5
      src/main/lombok/org/leumasjaffe/recipe/view/ElementPanel.java
  4. 12 5
      src/main/lombok/org/leumasjaffe/recipe/view/IngredientPanel.java
  5. 4 3
      src/main/lombok/org/leumasjaffe/recipe/view/PhasePanel.java
  6. 5 4
      src/main/lombok/org/leumasjaffe/recipe/view/PreparationPanel.java
  7. 5 2
      src/main/lombok/org/leumasjaffe/recipe/view/RecipeCardPanel.java
  8. 5 4
      src/main/lombok/org/leumasjaffe/recipe/view/StepPanel.java
  9. 3 2
      src/main/lombok/org/leumasjaffe/recipe/view/summary/ElementPanel.java
  10. 13 4
      src/main/lombok/org/leumasjaffe/recipe/view/summary/IngredientPanel.java
  11. 13 4
      src/main/lombok/org/leumasjaffe/recipe/view/summary/SummaryPanel.java
  12. 20 0
      src/main/lombok/org/leumasjaffe/recipe/viewmodel/ScaleFactor.java
  13. 2 0
      src/test/java/org/leumasjaffe/recipe/controller/AddPhaseActionTest.java
  14. 2 1
      src/test/java/org/leumasjaffe/recipe/view/ElementPanelTest.java
  15. 2 1
      src/test/java/org/leumasjaffe/recipe/view/IngredientPanelTest.java
  16. 2 1
      src/test/java/org/leumasjaffe/recipe/view/PhasePanelIT.java
  17. 2 1
      src/test/java/org/leumasjaffe/recipe/view/PhasePanelTest.java
  18. 2 1
      src/test/java/org/leumasjaffe/recipe/view/PreparationPanelTest.java
  19. 2 1
      src/test/java/org/leumasjaffe/recipe/view/RecipeCardPanelTest.java
  20. 2 1
      src/test/java/org/leumasjaffe/recipe/view/StepPanelIT.java
  21. 3 2
      src/test/java/org/leumasjaffe/recipe/view/StepPanelTest.java
  22. 2 1
      src/test/java/org/leumasjaffe/recipe/view/summary/ElementPanelTest.java
  23. 2 1
      src/test/java/org/leumasjaffe/recipe/view/summary/IngredientPanelTest.java
  24. 2 1
      src/test/java/org/leumasjaffe/recipe/view/summary/SummaryPanelTest.java

+ 3 - 1
src/main/lombok/org/leumasjaffe/recipe/controller/AddPhaseAction.java

@@ -9,6 +9,7 @@ import javax.swing.JSeparator;
 import org.leumasjaffe.recipe.model.Element;
 import org.leumasjaffe.recipe.model.Phase;
 import org.leumasjaffe.recipe.view.PhasePanel;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
@@ -20,13 +21,14 @@ import lombok.experimental.NonFinal;
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public class AddPhaseAction implements ActionListener {
 	JPanel view;
+	ScaleFactor scale;
 	@NonFinal @Setter Element model = null;
 
 	@Override
 	public void actionPerformed(ActionEvent e) {
 		Phase newPhase = new Phase();
 		this.model.getPhases().add(newPhase);
-		view.add(new PhasePanel(newPhase));
+		view.add(new PhasePanel(newPhase, scale));
 		view.add(new JSeparator());
 		view.revalidate();
 	}

+ 4 - 0
src/main/lombok/org/leumasjaffe/recipe/model/Amount.java

@@ -96,6 +96,10 @@ public class Amount {
 		}
 		return new Amount(unit, value + amount.value * scale(amount), vol, wgt);
 	}
+	
+	public Amount scale(final double factor) {
+		return new Amount(unit, value * factor, vol, wgt);
+	}
 
 	private double scale(final Amount amount) {
 		switch (unit) {

+ 8 - 5
src/main/lombok/org/leumasjaffe/recipe/view/ElementPanel.java

@@ -8,6 +8,7 @@ import org.leumasjaffe.observer.ObservableController;
 import org.leumasjaffe.observer.ObservableListener;
 import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.Phase;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.leumasjaffe.recipe.controller.AddPhaseAction;
 import org.leumasjaffe.recipe.model.Element;
 
@@ -44,8 +45,10 @@ public class ElementPanel extends JScrollPane implements AutoGrowPanel.ChildComp
 	JButton btnAdd;
 	AddPhaseAction addPhase;
 	JPanel panelViewPort;
+	ScaleFactor scale;
 	
-	public ElementPanel() {
+	public ElementPanel(final ScaleFactor scale) {
+		this.scale = scale;
 		setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
 		setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
 
@@ -93,7 +96,7 @@ public class ElementPanel extends JScrollPane implements AutoGrowPanel.ChildComp
 		setViewportView(panelViewPort);
 		panelViewPort.setLayout(new VerticalLayout(5));
 		
-		addPhase = new AddPhaseAction(panelViewPort);
+		addPhase = new AddPhaseAction(panelViewPort, scale);
 		btnAdd.addActionListener(addPhase);
 
 		nameController = ObservableController.from(txtName,
@@ -104,8 +107,8 @@ public class ElementPanel extends JScrollPane implements AutoGrowPanel.ChildComp
 		setEnabled(true);
 	}
 	
-	public ElementPanel(final Element element) {
-		this();
+	public ElementPanel(final Element element, final ScaleFactor scale) {
+		this(scale);
 		setModel(element);
 	}
 	
@@ -114,7 +117,7 @@ public class ElementPanel extends JScrollPane implements AutoGrowPanel.ChildComp
 		
 		panelViewPort.removeAll();
 		for (final Phase phase : element.getPhases()) {
-			panelViewPort.add(new PhasePanel(phase));
+			panelViewPort.add(new PhasePanel(phase, scale));
 			panelViewPort.add(new JSeparator());
 		}
 		

+ 12 - 5
src/main/lombok/org/leumasjaffe/recipe/view/IngredientPanel.java

@@ -9,11 +9,13 @@ import java.awt.event.FocusListener;
 
 import javax.swing.event.DocumentListener;
 
+import org.leumasjaffe.observer.ForwardingObservableListener;
 import org.leumasjaffe.observer.ObservableController;
 import org.leumasjaffe.observer.ObservableListener;
 import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.Ingredient;
 import org.leumasjaffe.recipe.view.formatter.AmountFormatter;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -28,11 +30,15 @@ public class IngredientPanel extends JPanel implements AutoGrowPanel.ChildCompon
 	ObservableListener<JTextField, Ingredient> nameController;
 	ObservableListener<JFormattedTextField, Ingredient> amountController;
 	ObservableListener<JTextField, Ingredient> preparationController;
+	ForwardingObservableListener<Ingredient> forward = new ForwardingObservableListener<>();
+	
 	@Getter(AccessLevel.PACKAGE) JTextField txtName;
 	@Getter(AccessLevel.PACKAGE) JFormattedTextField txtAmount;
 	@Getter(AccessLevel.PACKAGE) JTextField txtPreparation;
+	ScaleFactor scale;
 		
-	public IngredientPanel(boolean editable) {
+	public IngredientPanel(final ScaleFactor scale, boolean editable) {
+		this.scale = scale;
 		GridBagLayout gridBagLayout = new GridBagLayout();
 		gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0};
 		gridBagLayout.rowHeights = new int[]{0, 0};
@@ -81,17 +87,17 @@ public class IngredientPanel extends JPanel implements AutoGrowPanel.ChildCompon
 		nameController = ObservableController.from(txtName,
 				Ingredient::getName, Ingredient::setName);
 		amountController = ObservableController.from(txtAmount,
-				Ingredient::getAmount, Ingredient::setAmount);
+				i -> i.getAmount().scale(scale.getScale()), Ingredient::setAmount);
 		preparationController = ObservableController.from(txtPreparation,
 				Ingredient::getPreparation, Ingredient::setPreparation,
 				ing -> {
 					ing.setPreparation("");
 					ObserverDispatch.notifySubscribers(ing);
-				});
+				});		
 	}
 
-	public IngredientPanel(final Ingredient ingredient, boolean editable) {
-		this(editable);
+	public IngredientPanel(final Ingredient ingredient, final ScaleFactor scale, boolean editable) {
+		this(scale, editable);
 		setModel(ingredient);
 	}
 	
@@ -99,6 +105,7 @@ public class IngredientPanel extends JPanel implements AutoGrowPanel.ChildCompon
 		nameController.setObserved(ingredient);
 		amountController.setObserved(ingredient);
 		preparationController.setObserved(ingredient);
+		forward.setObserved(ingredient, scale);
 	}
 	
 	@Override

+ 4 - 3
src/main/lombok/org/leumasjaffe/recipe/view/PhasePanel.java

@@ -10,6 +10,7 @@ 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;
@@ -27,13 +28,13 @@ public class PhasePanel extends JPanel {
 	@Getter(AccessLevel.PACKAGE) AutoGrowPanel<StepPanel, Step> panelSteps;
 	
 	// TODO Re-configure to support this(); setModel(phase); pattern.
-	public PhasePanel(final Phase phase) {		
+	public PhasePanel(final Phase phase, final ScaleFactor scale) {		
 		setLayout(new VerticalLayout(5));
 		
-		panelPrep = new PreparationPanel(phase);
+		panelPrep = new PreparationPanel(phase, scale);
 		add(panelPrep);
 		
-		panelSteps = new AutoGrowPanel<>(Step::new, StepPanel::new);
+		panelSteps = new AutoGrowPanel<>(Step::new, s -> new StepPanel(s, scale));
 		panelSteps.setGap(5);
 		add(panelSteps);
 		

+ 5 - 4
src/main/lombok/org/leumasjaffe/recipe/view/PreparationPanel.java

@@ -12,6 +12,7 @@ import org.leumasjaffe.recipe.model.Duration;
 import org.leumasjaffe.recipe.model.Ingredient;
 import org.leumasjaffe.recipe.model.Phase;
 import org.leumasjaffe.recipe.model.Preparation;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 
 import lombok.AccessLevel;
 import lombok.experimental.FieldDefaults;
@@ -35,9 +36,9 @@ public class PreparationPanel extends JPanel {
 	
 	DurationPanel panelDuration;
 	
-	public PreparationPanel() {
+	public PreparationPanel(final ScaleFactor scale) {
 		controller = new ReplaceChildrenAction<>(Preparation::getIngredients,
-				ing -> new IngredientPanel(ing, false));
+				ing -> new IngredientPanel(ing, scale, false));
 		
 		GridBagLayout gridBagLayout = new GridBagLayout();
 		gridBagLayout.columnWidths = new int[]{0, 0, 0};
@@ -98,8 +99,8 @@ public class PreparationPanel extends JPanel {
 				Preparation::getDuration, Preparation::setDuration);
 	}
 	
-	public PreparationPanel(final Phase phase) {
-		this();
+	public PreparationPanel(final Phase phase, final ScaleFactor scale) {
+		this(scale);
 		setModel(phase);
 	}
 	

+ 5 - 2
src/main/lombok/org/leumasjaffe/recipe/view/RecipeCardPanel.java

@@ -7,6 +7,7 @@ import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.Element;
 import org.leumasjaffe.recipe.model.RecipeCard;
 import org.leumasjaffe.recipe.view.summary.SummaryPanel;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 
 import lombok.AccessLevel;
 import lombok.experimental.FieldDefaults;
@@ -21,14 +22,15 @@ import javax.swing.ScrollPaneConstants;
 public class RecipeCardPanel extends JSplitPane {
 	ForwardingObservableListener<RecipeCard> listener;
 	
+	ScaleFactor scale = new ScaleFactor();
 	SummaryPanel summaryPanel;
 	AutoGrowPanel<ElementPanel, Element> panelElements;
 	
 	public RecipeCardPanel() {
 		setPreferredSize(new Dimension(1100, 600));
 
-		summaryPanel = new SummaryPanel();
-		panelElements = new AutoGrowPanel<>(Element::new, ElementPanel::new);
+		summaryPanel = new SummaryPanel(scale);
+		panelElements = new AutoGrowPanel<>(Element::new, e -> new ElementPanel(e, scale));
 		panelElements.setGap(5);
 
 		final JScrollPane scrollPane = new JScrollPane(panelElements);
@@ -46,6 +48,7 @@ public class RecipeCardPanel extends JSplitPane {
 	}
 	
 	public void setModel(final RecipeCard card) {
+		scale.setModel(card);
 		summaryPanel.setModel(card);
 		panelElements.setModel(card.getElements(), added -> {
 			listener.setObserved(card, card.getElements());

+ 5 - 4
src/main/lombok/org/leumasjaffe/recipe/view/StepPanel.java

@@ -10,6 +10,7 @@ import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.controller.TextBinding;
 import org.leumasjaffe.recipe.model.Ingredient;
 import org.leumasjaffe.recipe.model.Step;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -41,7 +42,7 @@ public class StepPanel extends JPanel implements AutoGrowPanel.ChildComponent {
 	AutoGrowPanel<IngredientPanel, Ingredient> panelIngredients;
 	DurationPanel panelDuration;
 		
-	public StepPanel() {
+	public StepPanel(final ScaleFactor scale) {
 		GridBagLayout gridBagLayout = new GridBagLayout();
 		gridBagLayout.columnWidths = new int[]{0, 0, 0};
 		gridBagLayout.rowHeights = new int[]{0, 0};
@@ -84,7 +85,7 @@ public class StepPanel extends JPanel implements AutoGrowPanel.ChildComponent {
 		gbc_panelDuration.gridy = 0;
 		panelLeft.add(panelDuration, gbc_panelDuration);
 		
-		panelIngredients = new AutoGrowPanel<>(Ingredient::new, ing -> new IngredientPanel(ing, true));
+		panelIngredients = new AutoGrowPanel<>(Ingredient::new, ing -> new IngredientPanel(ing, scale, true));
 		GridBagConstraints gbc_panelIngredients = new GridBagConstraints();
 		gbc_panelIngredients.gridwidth = 3;
 		gbc_panelIngredients.insets = new Insets(0, 0, 0, 5);
@@ -109,8 +110,8 @@ public class StepPanel extends JPanel implements AutoGrowPanel.ChildComponent {
 		setListPosition(0);
 	}
 	
-	public StepPanel(final Step step) {
-		this();
+	public StepPanel(final Step step, final ScaleFactor scale) {
+		this(scale);
 		setModel(step);
 	}
 	

+ 3 - 2
src/main/lombok/org/leumasjaffe/recipe/view/summary/ElementPanel.java

@@ -8,6 +8,7 @@ import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.controller.ReplaceChildrenAction;
 import org.leumasjaffe.recipe.model.Element;
 import org.leumasjaffe.recipe.model.Ingredient;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -29,9 +30,9 @@ public class ElementPanel extends JPanel {
 	@Getter(AccessLevel.PACKAGE) JLabel lblProductName;
 	@Getter(AccessLevel.PACKAGE) JPanel panelIngredients;
 	
-	public ElementPanel(final Element element) {
+	public ElementPanel(final Element element, final ScaleFactor scale) {
 		controller = new ReplaceChildrenAction<>(
-				Element::getIngredients, IngredientPanel::new);
+				Element::getIngredients, i -> new IngredientPanel(i, scale));
 		GridBagLayout gridBagLayout = new GridBagLayout();
 		gridBagLayout.columnWidths = new int[]{0, 0, 0};
 		gridBagLayout.rowHeights = new int[]{0, 0, 0};

+ 13 - 4
src/main/lombok/org/leumasjaffe/recipe/view/summary/IngredientPanel.java

@@ -6,8 +6,10 @@ import javax.swing.JTextField;
 import java.awt.GridBagConstraints;
 import java.awt.Insets;
 
+import org.leumasjaffe.observer.IndirectObservableListener;
 import org.leumasjaffe.recipe.model.Ingredient;
 import org.leumasjaffe.recipe.view.formatter.AmountFormatter;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -19,10 +21,13 @@ import javax.swing.JLabel;
 @SuppressWarnings("serial")
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public class IngredientPanel extends JPanel {
+	ScaleFactor scale;
 	@Getter(AccessLevel.PACKAGE) JTextField txtName;
 	@Getter(AccessLevel.PACKAGE) JFormattedTextField txtAmount;
+	IndirectObservableListener<JFormattedTextField, Ingredient> listener;
 	
-	public IngredientPanel() {
+	public IngredientPanel(final ScaleFactor scale) {
+		this.scale = scale;
 		GridBagLayout gridBagLayout = new GridBagLayout();
 		gridBagLayout.columnWidths = new int[]{0, 0, 0, 0};
 		gridBagLayout.rowHeights = new int[]{0, 0};
@@ -56,15 +61,19 @@ public class IngredientPanel extends JPanel {
 		gbc_txtAmount.gridy = 0;
 		add(txtAmount, gbc_txtAmount);
 		txtAmount.setColumns(6);
+		
+		listener = new IndirectObservableListener<>(txtAmount,
+				(c, i) -> c.setValue(i.getAmount().scale(scale.getScale())));
 	}
 
-	public IngredientPanel(final Ingredient ingredient) {
-		this();
+	public IngredientPanel(final Ingredient ingredient, final ScaleFactor scale) {
+		this(scale);
 		setModel(ingredient);
 	}
 	
 	public void setModel(final Ingredient ingredient) {
 		txtName.setText(ingredient.getName());
-		txtAmount.setValue(ingredient.getAmount());
+		listener.setObserved(ingredient, ingredient, scale);
+		txtAmount.setValue(ingredient.getAmount().scale(scale.getScale()));
 	}
 }

+ 13 - 4
src/main/lombok/org/leumasjaffe/recipe/view/summary/SummaryPanel.java

@@ -20,6 +20,7 @@ import org.leumasjaffe.recipe.model.Element;
 import org.leumasjaffe.recipe.model.RecipeCard;
 import org.leumasjaffe.recipe.view.CollatedDurationPanel;
 import org.leumasjaffe.recipe.view.ImagePanel;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 
 import lombok.AccessLevel;
 import lombok.experimental.FieldDefaults;
@@ -32,6 +33,7 @@ public class SummaryPanel extends JPanel {
 	ReplaceChildrenAction<RecipeCard, Element> controller;
 	TextBinding<RecipeCard> titleBinding;
 	SpinnerBinding<RecipeCard, Integer> servingsBinding;
+	SpinnerBinding<ScaleFactor, Integer> servingsToMakeBinding;
 	TextBinding<RecipeCard> descriptionBinding;
 	ObservableListener<CollatedDurationPanel, RecipeCard> durationListener;
 	ObservableListener<JPanel, RecipeCard> childListener;
@@ -41,10 +43,10 @@ public class SummaryPanel extends JPanel {
 	JSpinner spnServings;
 	JSpinner spnServingsToMake;
 	
-	public SummaryPanel() {
+	public SummaryPanel(final ScaleFactor scale) {
 		controller = new ReplaceChildrenAction<>(RecipeCard::getElements, element -> {
 			JPanel wrapper = new JPanel(new VerticalLayout());
-			wrapper.add(new ElementPanel(element));
+			wrapper.add(new ElementPanel(element, scale));
 			wrapper.add(new JSeparator());
 			return wrapper;
 		});
@@ -165,6 +167,13 @@ public class SummaryPanel extends JPanel {
 		servingsBinding = new SpinnerBinding<>(spnServings, 
 				RecipeCard::getServings, RecipeCard::setServings);
 
+		servingsToMakeBinding = new SpinnerBinding<>(spnServingsToMake, 
+				ScaleFactor::getOutputServings, (obj, s) -> {
+					obj.setOutputServings(s);
+					ObserverDispatch.notifySubscribers(obj);
+				});
+		servingsToMakeBinding.setModel(scale);
+
 		descriptionBinding = new TextBinding<>(txaDescription,
 				RecipeCard::getDescription, RecipeCard::setDescription);
 
@@ -176,8 +185,8 @@ public class SummaryPanel extends JPanel {
 				(c, v) -> controller.accept(c, v));
 	}
 	
-	public SummaryPanel(final RecipeCard card) {
-		this();
+	public SummaryPanel(final RecipeCard card, final ScaleFactor scale) {
+		this(scale);
 		setModel(card);
 	}
 	

+ 20 - 0
src/main/lombok/org/leumasjaffe/recipe/viewmodel/ScaleFactor.java

@@ -0,0 +1,20 @@
+package org.leumasjaffe.recipe.viewmodel;
+
+import org.leumasjaffe.observer.Observable;
+import org.leumasjaffe.recipe.model.RecipeCard;
+
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.FieldDefaults;
+
+@FieldDefaults(level=AccessLevel.PRIVATE)
+public class ScaleFactor extends Observable.Instance {
+	@Setter RecipeCard model = null;
+	@Getter @Setter int outputServings;
+	
+	public double getScale() {
+		return (model == null || outputServings == 0) ? 1.0 :
+			outputServings / (double) model.getServings();
+	}
+}

+ 2 - 0
src/test/java/org/leumasjaffe/recipe/controller/AddPhaseActionTest.java

@@ -11,6 +11,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.leumasjaffe.recipe.model.Element;
 import org.leumasjaffe.recipe.view.PhasePanel;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.mockito.InjectMocks;
 import org.mockito.Spy;
 import org.mockito.junit.jupiter.MockitoExtension;
@@ -19,6 +20,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
 class AddPhaseActionTest {
 	
 	@Spy Element model;
+	@Spy ScaleFactor scale;
 	@Spy JPanel view;
 	@InjectMocks AddPhaseAction action;
 	

+ 2 - 1
src/test/java/org/leumasjaffe/recipe/view/ElementPanelTest.java

@@ -16,6 +16,7 @@ import org.leumasjaffe.mock.MockObserverListener;
 import org.leumasjaffe.observer.ObservableListener;
 import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.Phase;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.leumasjaffe.recipe.model.Element;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
@@ -30,7 +31,7 @@ class ElementPanelTest extends SwingTestCase {
 	
 	@Mock ObservableListener<CollatedDurationPanel, Element> durationListener;
 	@Spy JPanel panelViewPort;
-	@InjectMocks ElementPanel panel = new ElementPanel();
+	@InjectMocks ElementPanel panel = new ElementPanel(new ScaleFactor());
 
 	@BeforeEach
 	void setUp() {

+ 2 - 1
src/test/java/org/leumasjaffe/recipe/view/IngredientPanelTest.java

@@ -10,6 +10,7 @@ import org.leumasjaffe.mock.MockObserverListener;
 import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.Amount;
 import org.leumasjaffe.recipe.model.Ingredient;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.mockito.Spy;
 import org.mockito.junit.jupiter.MockitoExtension;
 
@@ -22,7 +23,7 @@ class IngredientPanelTest extends SwingTestCase {
 	@BeforeEach
 	void setUp() {
 		stuff = new Ingredient("Onions", "Sliced", new Amount("100 g"));
-		panel = new IngredientPanel(stuff, true);
+		panel = new IngredientPanel(stuff, new ScaleFactor(), true);
 		listener.setObserved(stuff);
 		// setObserved invokes our callback.
 		clearInvocations(listener);

+ 2 - 1
src/test/java/org/leumasjaffe/recipe/view/PhasePanelIT.java

@@ -14,6 +14,7 @@ import org.leumasjaffe.mock.MockObserverListener;
 import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.Phase;
 import org.leumasjaffe.recipe.model.Step;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.mockito.Spy;
 import org.mockito.junit.jupiter.MockitoExtension;
 
@@ -31,7 +32,7 @@ class PhasePanelIT extends SwingTestCase {
 		steps = new ArrayList<>(Arrays.asList(step));
 		doReturn(steps).when(stuff).getCooking();
 				
-		panel = new PhasePanel(stuff);
+		panel = new PhasePanel(stuff, new ScaleFactor());
 		listener.setObserved(stuff);
 		// setObserved invokes our callback.
 		clearInvocations(listener);

+ 2 - 1
src/test/java/org/leumasjaffe/recipe/view/PhasePanelTest.java

@@ -14,6 +14,7 @@ import org.leumasjaffe.recipe.model.Phase;
 import org.leumasjaffe.recipe.model.Preparation;
 import org.leumasjaffe.recipe.model.Rest;
 import org.leumasjaffe.recipe.model.Step;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.mockito.Mock;
 import org.mockito.Spy;
 import org.mockito.junit.jupiter.MockitoExtension;
@@ -35,7 +36,7 @@ class PhasePanelTest extends SwingTestCase {
 		doReturn(Arrays.asList(stub)).when(stuff).getCooking();
 		doReturn(prep).when(stuff).getPreparation();
 		doReturn(rest).when(stuff).getRest();
-		panel = new PhasePanel(stuff);
+		panel = new PhasePanel(stuff, new ScaleFactor());
 		
 		listener.setObserved(stuff);
 		// setObserved() calls update

+ 2 - 1
src/test/java/org/leumasjaffe/recipe/view/PreparationPanelTest.java

@@ -13,6 +13,7 @@ import org.leumasjaffe.recipe.controller.ReplaceChildrenAction;
 import org.leumasjaffe.recipe.model.Ingredient;
 import org.leumasjaffe.recipe.model.Phase;
 import org.leumasjaffe.recipe.model.Preparation;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
@@ -24,7 +25,7 @@ class PreparationPanelTest extends SwingTestCase {
 	@Mock ReplaceChildrenAction<Preparation, Ingredient> controller;
 	Preparation stuff = new Preparation();
 	@Mock Phase parent;
-	@InjectMocks PreparationPanel panel = new PreparationPanel();
+	@InjectMocks PreparationPanel panel = new PreparationPanel(new ScaleFactor());
 	
 	@BeforeEach
 	void setUp() {

+ 2 - 1
src/test/java/org/leumasjaffe/recipe/view/RecipeCardPanelTest.java

@@ -14,6 +14,7 @@ import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.Element;
 import org.leumasjaffe.recipe.model.RecipeCard;
 import org.leumasjaffe.recipe.view.summary.SummaryPanel;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
@@ -27,7 +28,7 @@ class RecipeCardPanelTest {
 
 	@Mock SummaryPanel summaryPanel;
 	@Spy AutoGrowPanel<ElementPanel, Element> panelElements =
-			new AutoGrowPanel<>(Element::new, ElementPanel::new);
+			new AutoGrowPanel<>(Element::new, e -> new ElementPanel(e, new ScaleFactor()));
 	
 	@InjectMocks RecipeCardPanel panel = new RecipeCardPanel();
 	

+ 2 - 1
src/test/java/org/leumasjaffe/recipe/view/StepPanelIT.java

@@ -15,6 +15,7 @@ import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.Amount;
 import org.leumasjaffe.recipe.model.Ingredient;
 import org.leumasjaffe.recipe.model.Step;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.mockito.Spy;
 import org.mockito.junit.jupiter.MockitoExtension;
 
@@ -25,7 +26,7 @@ class StepPanelIT extends SwingTestCase {
 	List<Ingredient> ingredients;
 	Step stuff;
 	
-	StepPanel panel = new StepPanel();
+	StepPanel panel = new StepPanel(new ScaleFactor());
 
 	@BeforeEach
 	void setUp() {

+ 3 - 2
src/test/java/org/leumasjaffe/recipe/view/StepPanelTest.java

@@ -18,6 +18,7 @@ import org.leumasjaffe.recipe.model.Amount;
 import org.leumasjaffe.recipe.model.Duration;
 import org.leumasjaffe.recipe.model.Ingredient;
 import org.leumasjaffe.recipe.model.Step;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.mockito.InjectMocks;
 import org.mockito.Spy;
 import org.mockito.junit.jupiter.MockitoExtension;
@@ -29,8 +30,8 @@ class StepPanelTest extends SwingTestCase {
 	
 	@Spy JLabel lblIndex;
 	@Spy AutoGrowPanel<IngredientPanel, Ingredient> panelIngredients =
-			new AutoGrowPanel<>(Ingredient::new, ing -> new IngredientPanel(ing, true));
-	@InjectMocks StepPanel panel = new StepPanel();
+			new AutoGrowPanel<>(Ingredient::new, ing -> new IngredientPanel(ing, new ScaleFactor(), true));
+	@InjectMocks StepPanel panel = new StepPanel(new ScaleFactor());
 
 	@BeforeEach
 	void setUp() {

+ 2 - 1
src/test/java/org/leumasjaffe/recipe/view/summary/ElementPanelTest.java

@@ -14,6 +14,7 @@ import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.Amount;
 import org.leumasjaffe.recipe.model.Ingredient;
 import org.leumasjaffe.recipe.view.SwingTestCase;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.leumasjaffe.recipe.model.Element;
 import org.mockito.Spy;
 import org.mockito.junit.jupiter.MockitoExtension;
@@ -32,7 +33,7 @@ class ElementPanelTest extends SwingTestCase {
 				new Ingredient("Garlic", "", new Amount("2 tsp"))))
 		.when(stuff).getIngredients();
 		
-		panel = new ElementPanel(stuff);
+		panel = new ElementPanel(stuff, new ScaleFactor());
 	}
 
 	@Test

+ 2 - 1
src/test/java/org/leumasjaffe/recipe/view/summary/IngredientPanelTest.java

@@ -8,6 +8,7 @@ import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.Amount;
 import org.leumasjaffe.recipe.model.Ingredient;
 import org.leumasjaffe.recipe.view.SwingTestCase;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 
 class IngredientPanelTest extends SwingTestCase {
 
@@ -17,7 +18,7 @@ class IngredientPanelTest extends SwingTestCase {
 	@BeforeEach
 	void setUp() {
 		stuff = new Ingredient("Onions", "Sliced", new Amount("100 g"));
-		panel = new IngredientPanel(stuff);
+		panel = new IngredientPanel(stuff, new ScaleFactor());
 	}
 
 	@Test

+ 2 - 1
src/test/java/org/leumasjaffe/recipe/view/summary/SummaryPanelTest.java

@@ -8,6 +8,7 @@ import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.controller.ReplaceChildrenAction;
 import org.leumasjaffe.recipe.model.Element;
 import org.leumasjaffe.recipe.model.RecipeCard;
+import org.leumasjaffe.recipe.viewmodel.ScaleFactor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
@@ -17,7 +18,7 @@ class SummaryPanelTest {
 	
 	RecipeCard card = new RecipeCard();
 	@Mock ReplaceChildrenAction<RecipeCard, Element> controller;
-	@InjectMocks SummaryPanel panel = new SummaryPanel(card);
+	@InjectMocks SummaryPanel panel = new SummaryPanel(card, new ScaleFactor());
 
 	@Test
 	void testUpdateToCardInvokesController() {