浏览代码

Change the ShrinkOnEmpty listener to use a FocusListener.

Sam Jaffe 5 年之前
父节点
当前提交
6fa4582c68

+ 17 - 13
src/main/lombok/org/leumasjaffe/recipe/view/AutoGrowPanel.java

@@ -1,6 +1,8 @@
 package org.leumasjaffe.recipe.view;
 
 import java.awt.Component;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Consumer;
@@ -10,6 +12,7 @@ import java.util.function.Supplier;
 import javax.swing.JPanel;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
+import javax.swing.text.JTextComponent;
 
 import org.jdesktop.swingx.VerticalLayout;
 
@@ -31,8 +34,10 @@ public class AutoGrowPanel<C extends Component & AutoGrowPanel.ChildComponent, T
 	private static interface SetGap { void setGap(int gap); }
 
 	public static interface ChildComponent {
-		void addGrowShrinkListener(DocumentListener dl);
-		void removeGrowShrinkListener(DocumentListener dl);
+		void addGrowListener(DocumentListener dl);
+		void removeGrowListener(DocumentListener dl);
+		void addShrinkListener(FocusListener fl);
+		void removeShrinkListener(FocusListener fl);
 		default void setListPosition(int zeroIndex) {}
 	}
 	
@@ -50,8 +55,8 @@ public class AutoGrowPanel<C extends Component & AutoGrowPanel.ChildComponent, T
 		public void insertUpdate(DocumentEvent e) {
 			if (model != null) {
 				models.add(model);
-				last().removeGrowShrinkListener(this);
-				last().addGrowShrinkListener(new ShrinkOnEmpty(last()));
+				last().removeGrowListener(this);
+				last().addShrinkListener(new ShrinkOnEmpty(last()));
 			}
 			
 			model = makeEmptyModel.get();
@@ -59,28 +64,27 @@ public class AutoGrowPanel<C extends Component & AutoGrowPanel.ChildComponent, T
 
 			members.add(comp);
 			add(comp);
-			comp.addGrowShrinkListener(this);
+			comp.addGrowListener(this);
 			comp.setListPosition(lastIndex());
 			revalidate();
 			callback.accept(true);
-		}		
+		}
 	}
 	
 	@AllArgsConstructor
-	private class ShrinkOnEmpty implements DocumentListener {
+	private class ShrinkOnEmpty implements FocusListener {
 		C component;
 		
-		@Override public void insertUpdate(DocumentEvent e) {}
-		@Override public void changedUpdate(DocumentEvent e) {}
+		@Override public void focusGained(FocusEvent e) {}
 
 		@Override
-		public void removeUpdate(DocumentEvent e) {
-			if (e.getDocument().getLength() > 0) {
+		public void focusLost(FocusEvent e) {
+			if (!((JTextComponent) e.getComponent()).getText().isEmpty()) {
 				return;
 			}
 			
 			component.setVisible(false);
-			component.removeGrowShrinkListener(this);
+			component.removeShrinkListener(this);
 			remove(members.indexOf(component));
 			callback.accept(false);
 		}
@@ -135,7 +139,7 @@ public class AutoGrowPanel<C extends Component & AutoGrowPanel.ChildComponent, T
 		this.members.subList(0, lastIndex()).clear();
 		models.forEach(model -> {
 			final C comp = this.grow.makeComponent.apply(model);
-			comp.addGrowShrinkListener(new ShrinkOnEmpty(comp));
+			comp.addShrinkListener(new ShrinkOnEmpty(comp));
 			add(comp, lastIndex());
 			comp.setListPosition(lastIndex());
 			this.members.add(lastIndex(), comp);

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

@@ -25,6 +25,7 @@ import javax.swing.event.DocumentListener;
 import java.awt.GridBagLayout;
 import java.awt.GridBagConstraints;
 import java.awt.Insets;
+import java.awt.event.FocusListener;
 import java.awt.Component;
 import java.awt.Dimension;
 
@@ -129,13 +130,23 @@ public class ElementPanel extends JScrollPane implements AutoGrowPanel.ChildComp
 	}
 
 	@Override
-	public void addGrowShrinkListener(DocumentListener dl) {
+	public void addGrowListener(DocumentListener dl) {
 		this.txtName.getDocument().addDocumentListener(dl);
 	}
 
 	@Override
-	public void removeGrowShrinkListener(DocumentListener dl) {
+	public void removeGrowListener(DocumentListener dl) {
 		this.txtName.getDocument().removeDocumentListener(dl);
 	}
+
+	@Override
+	public void addShrinkListener(FocusListener fl) {
+		this.txtName.addFocusListener(fl);
+	}
+
+	@Override
+	public void removeShrinkListener(FocusListener fl) {
+		this.txtName.removeFocusListener(fl);
+	}
 	
 }

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

@@ -5,6 +5,7 @@ import java.awt.GridBagLayout;
 import javax.swing.JTextField;
 import java.awt.GridBagConstraints;
 import java.awt.Insets;
+import java.awt.event.FocusListener;
 
 import javax.swing.event.DocumentListener;
 
@@ -108,13 +109,23 @@ public class IngredientPanel extends JPanel implements AutoGrowPanel.ChildCompon
 	}
 
 	@Override
-	public void addGrowShrinkListener(DocumentListener dl) {
+	public void addGrowListener(DocumentListener dl) {
 		this.txtName.getDocument().addDocumentListener(dl);
 	}
 
 	@Override
-	public void removeGrowShrinkListener(DocumentListener dl) {
+	public void removeGrowListener(DocumentListener dl) {
 		this.txtName.getDocument().removeDocumentListener(dl);
 	}
 
+	@Override
+	public void addShrinkListener(FocusListener fl) {
+		this.txtName.addFocusListener(fl);
+	}
+
+	@Override
+	public void removeShrinkListener(FocusListener fl) {
+		this.txtName.removeFocusListener(fl);
+	}
+
 }

+ 13 - 2
src/main/lombok/org/leumasjaffe/recipe/view/StepPanel.java

@@ -19,6 +19,7 @@ import java.awt.GridBagLayout;
 
 import java.awt.GridBagConstraints;
 import java.awt.Insets;
+import java.awt.event.FocusListener;
 
 import javax.swing.JLabel;
 import javax.swing.JTextPane;
@@ -139,12 +140,22 @@ public class StepPanel extends JPanel implements AutoGrowPanel.ChildComponent {
 	}
 
 	@Override
-	public void addGrowShrinkListener(DocumentListener dl) {
+	public void addGrowListener(DocumentListener dl) {
 		this.txtpnInstructions.getDocument().addDocumentListener(dl);
 	}
 
 	@Override
-	public void removeGrowShrinkListener(DocumentListener dl) {
+	public void removeGrowListener(DocumentListener dl) {
 		this.txtpnInstructions.getDocument().removeDocumentListener(dl);		
 	}
+
+	@Override
+	public void addShrinkListener(FocusListener fl) {
+		this.txtpnInstructions.addFocusListener(fl);
+	}
+
+	@Override
+	public void removeShrinkListener(FocusListener fl) {
+		this.txtpnInstructions.removeFocusListener(fl);
+	}
 }

+ 13 - 2
src/test/java/org/leumasjaffe/recipe/view/AutoGrowPanelTest.java

@@ -4,6 +4,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.collection.IsArrayWithSize.arrayWithSize;
 import static org.mockito.Mockito.*;
 
+import java.awt.event.FocusListener;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -32,14 +33,24 @@ class AutoGrowPanelTest extends SwingTestCase {
 		}
 
 		@Override
-		public void addGrowShrinkListener(DocumentListener dl) {
+		public void addGrowListener(DocumentListener dl) {
 			super.getDocument().addDocumentListener(dl);
 		}
 
 		@Override
-		public void removeGrowShrinkListener(DocumentListener dl) {
+		public void removeGrowListener(DocumentListener dl) {
 			super.getDocument().removeDocumentListener(dl);
 		}
+
+		@Override
+		public void addShrinkListener(FocusListener fl) {
+			super.addFocusListener(fl);
+		}
+
+		@Override
+		public void removeShrinkListener(FocusListener fl) {
+			super.removeFocusListener(fl);
+		}
 	}
 	
 	@Mock Consumer<Boolean> callback;