Преглед изворни кода

Add the ability to enable/disable editing for recipes.

Sam Jaffe пре 5 година
родитељ
комит
11722d2fe5

+ 7 - 0
src/main/lombok/org/leumasjaffe/recipe/view/AutoGrowPanel.java

@@ -158,6 +158,13 @@ public class AutoGrowPanel<C extends Component & AutoGrowPanel.ChildComponent, T
 		models.remove(index);
 	}
 	
+	@Override
+	public void setEnabled(boolean enabled) {
+		super.setEnabled(enabled);
+		members.forEach(c -> c.setEnabled(enabled));
+		last().setVisible(enabled);
+	}
+	
 	private int lastIndex() { return members.size() - 1; }
 	
 	private C last() { return members.get(lastIndex()); }

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

@@ -26,6 +26,7 @@ import java.awt.GridBagLayout;
 import java.awt.GridBagConstraints;
 import java.awt.Insets;
 import java.awt.event.FocusListener;
+import java.util.stream.Stream;
 import java.awt.Component;
 import java.awt.Dimension;
 
@@ -40,12 +41,11 @@ public class ElementPanel extends JScrollPane implements AutoGrowPanel.ChildComp
 	ObservableListener<CollatedDurationPanel, Element> durationListener;
 
 	@Getter(AccessLevel.PACKAGE) JTextField txtName;
+	JButton btnAdd;
 	AddPhaseAction addPhase;
 	JPanel panelViewPort;
 	
 	public ElementPanel() {
-		setPreferredSize(new Dimension(600, 450));
-
 		setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
 		setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
 
@@ -66,7 +66,7 @@ public class ElementPanel extends JScrollPane implements AutoGrowPanel.ChildComp
 		gbc_txtName.gridy = 0;
 		panelColumnHeader.add(txtName, gbc_txtName);
 		
-		JButton btnAdd = new JButton("+");
+		btnAdd = new JButton("+");
 		btnAdd.setToolTipText("Add new phase");
 		btnAdd.setPreferredSize(new Dimension(17, 17));
 		btnAdd.setMargin(new Insets(0, 0, 0, 0));
@@ -100,6 +100,8 @@ public class ElementPanel extends JScrollPane implements AutoGrowPanel.ChildComp
 				Element::getName, Element::setName);
 		durationListener = new ObservableListener<>(panelDuration,
 				(c, v) -> c.setModel(v.getCollatedDuration()));
+		
+		setEnabled(true);
 	}
 	
 	public ElementPanel(final Element element) {
@@ -121,6 +123,19 @@ public class ElementPanel extends JScrollPane implements AutoGrowPanel.ChildComp
 		durationListener.setObserved(element);
 	}
 	
+	@Override
+	public void setEnabled(boolean enabled) {
+		super.setEnabled(enabled);
+		if (enabled) {
+			setPreferredSize(new Dimension(600, 450));
+		} else {
+			setPreferredSize(null);
+		}
+		txtName.setEditable(enabled);
+		btnAdd.setEnabled(enabled);
+		Stream.of(panelViewPort.getComponents()).forEach(c -> c.setEnabled(enabled));
+	}
+	
 	@Override
 	public void removeNotify() {
 		super.removeNotify();

+ 8 - 0
src/main/lombok/org/leumasjaffe/recipe/view/IngredientPanel.java

@@ -101,6 +101,14 @@ public class IngredientPanel extends JPanel implements AutoGrowPanel.ChildCompon
 		preparationController.setObserved(ingredient);
 	}
 	
+	@Override
+	public void setEnabled(boolean enabled) {
+		super.setEnabled(enabled);
+		txtName.setEditable(enabled);
+		txtAmount.setEditable(enabled);
+		txtPreparation.setEditable(enabled);
+	}
+	
 	@Override
 	public void removeNotify() {
 		super.removeNotify();

+ 14 - 2
src/main/lombok/org/leumasjaffe/recipe/view/PhasePanel.java

@@ -22,19 +22,23 @@ import org.jdesktop.swingx.VerticalLayout;
 public class PhasePanel extends JPanel {
 	ForwardingObservableListener<Phase> listener = new ForwardingObservableListener<>();
 
+	PreparationPanel panelPrep;
+	RestPanel panelRest;
 	@Getter(AccessLevel.PACKAGE) AutoGrowPanel<StepPanel, Step> panelSteps;
 	
 	// TODO Re-configure to support this(); setModel(phase); pattern.
 	public PhasePanel(final Phase phase) {		
 		setLayout(new VerticalLayout(5));
 		
-		add(new PreparationPanel(phase));
+		panelPrep = new PreparationPanel(phase);
+		add(panelPrep);
 		
 		panelSteps = new AutoGrowPanel<>(Step::new, StepPanel::new);
 		panelSteps.setGap(5);
 		add(panelSteps);
 		
-		add(new RestPanel(phase.getRest()));
+		panelRest = new RestPanel(phase.getRest());
+		add(panelRest);
 
 		panelSteps.setModel(phase.getCooking(), added -> {
 			listener.setObserved(phase, allChildren(phase));
@@ -52,6 +56,14 @@ public class PhasePanel extends JPanel {
 		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();

+ 9 - 1
src/main/lombok/org/leumasjaffe/recipe/view/PreparationPanel.java

@@ -33,6 +33,8 @@ public class PreparationPanel extends JPanel {
 	IndirectObservableListener<JPanel, Preparation> childListener;
 	ObservableListener<JFormattedTextField, Preparation> durationController;
 	
+	DurationPanel panelDuration;
+	
 	public PreparationPanel() {
 		controller = new ReplaceChildrenAction<>(Preparation::getIngredients,
 				ing -> new IngredientPanel(ing, false));
@@ -73,7 +75,7 @@ public class PreparationPanel extends JPanel {
 		gbc_horizontalGlue.gridy = 0;
 		panelLeft.add(horizontalGlue, gbc_horizontalGlue);
 		
-		DurationPanel panelDuration = new DurationPanel("Requires", Duration.ZERO);
+		panelDuration = new DurationPanel("Requires", Duration.ZERO);
 		GridBagConstraints gbc_panelDuration = new GridBagConstraints();
 		gbc_panelDuration.gridx = 2;
 		gbc_panelDuration.gridy = 0;
@@ -107,6 +109,12 @@ public class PreparationPanel extends JPanel {
 		durationController.setObserved(prep);
 	}
 	
+	@Override
+	public void setEnabled(boolean enabled) {
+		super.setEnabled(enabled);
+		panelDuration.txtTime.setEditable(enabled);
+	}
+	
 	@Override
 	public void removeNotify() {
 		super.removeNotify();

+ 7 - 0
src/main/lombok/org/leumasjaffe/recipe/view/RecipeCardPanel.java

@@ -62,5 +62,12 @@ public class RecipeCardPanel extends JSplitPane {
 		super.removeNotify();
 		ObserverDispatch.unsubscribeAll(listener);
 	}
+	
+	@Override
+	public void setEnabled(boolean enabled) {
+		super.setEnabled(enabled);
+		summaryPanel.setEnabled(enabled);
+		panelElements.setEnabled(enabled);
+	}
 
 }

+ 10 - 0
src/main/lombok/org/leumasjaffe/recipe/view/RecipeManagerFrame.java

@@ -10,6 +10,7 @@ import lombok.experimental.FieldDefaults;
 
 import javax.swing.JMenuBar;
 import javax.swing.JMenu;
+import javax.swing.JCheckBoxMenuItem;
 
 @SuppressWarnings("serial")
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
@@ -26,6 +27,15 @@ public class RecipeManagerFrame extends JFrame implements FileController.ViewMod
 		JMenu mnFile = new FileMenu(this, fileController);
 		menuBar.add(mnFile);
 		
+		JMenu mnView = new JMenu("View");
+		menuBar.add(mnView);
+		
+		JCheckBoxMenuItem chckbxmntmReadOnly = new JCheckBoxMenuItem("Read Only");
+		mnView.add(chckbxmntmReadOnly);
+		chckbxmntmReadOnly.addActionListener(e -> {
+			((RecipeCardPanel) getContentPane()).setEnabled(!chckbxmntmReadOnly.getState());
+		});
+		
 		fileController.create();
 
 		pack();

+ 19 - 3
src/main/lombok/org/leumasjaffe/recipe/view/RestPanel.java

@@ -25,6 +25,8 @@ public class RestPanel extends JPanel {
 	ObservableListener<JFormattedTextField, Rest> upToController;
 
 	JComboBox<Rest.Where> jcbLocation;
+	DurationPanel panelDuration;
+	DurationPanel panelUpTo;
 	
 	// TODO
 	Rest model;
@@ -51,20 +53,21 @@ public class RestPanel extends JPanel {
 		gbc_lblLocation.gridy = 0;
 		add(jcbLocation, gbc_lblLocation);
 		
-		DurationPanel panelDuration = new DurationPanel("");
+		panelDuration = new DurationPanel("");
 		GridBagConstraints gbc_panelDuration = new GridBagConstraints();
 		gbc_panelDuration.gridx = 2;
 		gbc_panelDuration.gridy = 0;
 		add(panelDuration, gbc_panelDuration);
 
-		DurationPanel panelUpTo = new DurationPanel("and up to");
+		panelUpTo = new DurationPanel("and up to");
 		GridBagConstraints gbc_panelUpTo = new GridBagConstraints();
 		gbc_panelUpTo.gridx = 3;
 		gbc_panelUpTo.gridy = 0;
 		add(panelUpTo, gbc_panelUpTo);
 
 		jcbLocation.addItemListener(e -> {
-			panelDuration.txtTime.setEditable(!e.getItem().equals(Rest.Where.NONE));
+			panelDuration.txtTime.setEditable(!isResting());
+			panelUpTo.txtTime.setEditable(!isResting());
 			this.model.setWhere(Rest.Where.class.cast(e.getItem()));
 		});
 		durationController = ObservableController.from(panelDuration.txtTime,
@@ -73,6 +76,7 @@ public class RestPanel extends JPanel {
 				Rest::getUpTo, Rest::setUpTo);
 		
 		panelDuration.txtTime.setEditable(false);
+		panelUpTo.txtTime.setEditable(false);
 	}
 
 	public RestPanel(final Rest rest) {
@@ -87,10 +91,22 @@ public class RestPanel extends JPanel {
 		upToController.setObserved(rest);
 	}
 	
+	@Override
+	public void setEnabled(boolean enabled) {
+		super.setEnabled(enabled);
+		jcbLocation.setEnabled(enabled);
+		panelDuration.txtTime.setEditable(enabled && !isResting());
+		panelUpTo.txtTime.setEditable(enabled && !isResting());
+	}
+	
 	@Override
 	public void removeNotify() {
 		super.removeNotify();
 		ObserverDispatch.unsubscribeAll(durationController);
 	}
 
+	private boolean isResting() {
+		return jcbLocation.getSelectedItem().equals(Rest.Where.NONE);
+	}
+
 }

+ 10 - 1
src/main/lombok/org/leumasjaffe/recipe/view/StepPanel.java

@@ -39,6 +39,7 @@ public class StepPanel extends JPanel implements AutoGrowPanel.ChildComponent {
 	JLabel lblIndex;
 	@Getter(AccessLevel.PACKAGE) JTextPane txtpnInstructions;
 	AutoGrowPanel<IngredientPanel, Ingredient> panelIngredients;
+	DurationPanel panelDuration;
 		
 	public StepPanel() {
 		GridBagLayout gridBagLayout = new GridBagLayout();
@@ -77,7 +78,7 @@ public class StepPanel extends JPanel implements AutoGrowPanel.ChildComponent {
 		gbc_horizontalGlue.gridy = 0;
 		panelLeft.add(horizontalGlue, gbc_horizontalGlue);
 		
-		DurationPanel panelDuration = new DurationPanel("Requires");
+		panelDuration = new DurationPanel("Requires");
 		GridBagConstraints gbc_panelDuration = new GridBagConstraints();
 		gbc_panelDuration.gridx = 2;
 		gbc_panelDuration.gridy = 0;
@@ -125,6 +126,14 @@ public class StepPanel extends JPanel implements AutoGrowPanel.ChildComponent {
 		durationController.setObserved(step);
 	}
 	
+	@Override
+	public void setEnabled(boolean enabled) {
+		super.setEnabled(enabled);
+		panelDuration.txtTime.setEditable(enabled);
+		txtpnInstructions.setEditable(enabled);
+		panelIngredients.setEnabled(enabled);
+	}
+	
 	@Override
 	public void removeNotify() {
 		super.removeNotify();

+ 10 - 1
src/main/lombok/org/leumasjaffe/recipe/view/summary/SummaryPanel.java

@@ -38,6 +38,7 @@ public class SummaryPanel extends JPanel {
 	
 	JTextField txtTitle;
 	JTextArea txaDescription;
+	JSpinner spnServings;
 	
 	public SummaryPanel() {
 		controller = new ReplaceChildrenAction<>(RecipeCard::getElements, element -> {
@@ -106,7 +107,7 @@ public class SummaryPanel extends JPanel {
 		gbc_lblServes.gridy = 0;
 		panelServings.add(lblServes, gbc_lblServes);
 		
-		JSpinner spnServings = new JSpinner(new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 1));
+		spnServings = new JSpinner(new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 1));
 		GridBagConstraints gbc_spnServings = new GridBagConstraints();
 		gbc_spnServings.fill = GridBagConstraints.HORIZONTAL;
 		gbc_spnServings.gridx = 1;
@@ -185,6 +186,14 @@ public class SummaryPanel extends JPanel {
 		childListener.setObserved(card);
 	}
 	
+	@Override
+	public void setEnabled(boolean enabled) {
+		super.setEnabled(enabled);
+		txtTitle.setEditable(enabled);
+		txaDescription.setEditable(enabled);
+		spnServings.setEnabled(enabled);
+	}
+	
 	@Override
 	public void removeNotify() {
 		super.removeNotify();