浏览代码

Fix auto-grow panel not updating indices.

Sam Jaffe 5 年之前
父节点
当前提交
2a88f0e56d

+ 5 - 1
src/main/lombok/org/leumasjaffe/recipe/view/AutoGrowPanel.java

@@ -57,9 +57,10 @@ public class AutoGrowPanel<C extends Component & AutoGrowPanel.ChildComponent, T
 			model = makeEmptyModel.get();
 			final C comp = makeComponent.apply(model);
 
-			comp.addGrowShrinkListener(this);
 			members.add(comp);
 			add(comp);
+			comp.addGrowShrinkListener(this);
+			comp.setListPosition(lastIndex());
 			callback.accept(true);
 		}		
 	}
@@ -134,8 +135,11 @@ public class AutoGrowPanel<C extends Component & AutoGrowPanel.ChildComponent, T
 			final C comp = this.grow.makeComponent.apply(model);
 			comp.addGrowShrinkListener(new ShrinkOnEmpty(comp));
 			add(comp, lastIndex());
+			comp.setListPosition(lastIndex());
 			this.members.add(lastIndex(), comp);
 		});
+		
+		last().setListPosition(lastIndex());
 	}
 	
 	@Override

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

@@ -64,10 +64,27 @@ class AutoGrowPanelTest extends SwingTestCase {
 	
 	@Test
 	void testAlwaysHasAtLeastOneComponent() {		
+		AutoGrowPanel<MockComponent, MockComponent> panel =
+				new AutoGrowPanel<>(this::mocked, m -> m);
+		
+		assertThat(panel.getComponents(), arrayWithSize(1));
+	}
+	
+	@Test
+	void testInitialComponentAssignedFirstPosition() {		
+		@SuppressWarnings("unused")
+		AutoGrowPanel<MockComponent, MockComponent> panel =
+				new AutoGrowPanel<>(this::mocked, m -> m);
+		
+		verify(internal.get(0)).setListPosition(0);
+	}
+	
+	@Test
+	void testSetModelCallsListPositionEvenIfNoChange() {		
 		AutoGrowPanel<MockComponent, MockComponent> panel = create();
 		
 		assertThat(panel.getComponents(), arrayWithSize(1));
-		verify(shared, never()).add(any());
+		verify(internal.get(0), times(2)).setListPosition(0);
 	}
 
 	@Test
@@ -78,19 +95,39 @@ class AutoGrowPanelTest extends SwingTestCase {
 		verify(shared, never()).add(any());
 	}
 
+	@Test
+	void testResetsListPositionAfterSettingModel() {
+		@SuppressWarnings("unused")
+		AutoGrowPanel<MockComponent, MockComponent> panel = create(mocked(), mocked());
+		
+		// Last element because my helper function pre-installs into the internal list
+		verify(internal.get(2)).setListPosition(0);
+		verify(internal.get(2)).setListPosition(2);
+	}
+
 	@Test
 	void testEnteringContentTriggersNewRow() {
 		AutoGrowPanel<MockComponent, MockComponent> panel = create();
-		getTestFrame().add(panel);
 
 		internal.get(0).setText("A");
 		assertThat(panel.getComponents(), arrayWithSize(2));
 		
 		internal.get(1).setText("B");
 		assertThat(panel.getComponents(), arrayWithSize(3));
+		
 		verify(shared, times(2)).add(any());
 	}
 
+	@Test
+	void testEnteringContentAssignsCorrectListPosition() {
+		@SuppressWarnings("unused")
+		AutoGrowPanel<MockComponent, MockComponent> panel = create();
+
+		internal.get(0).setText("A");
+		
+		verify(internal.get(1)).setListPosition(1);
+	}
+
 	@Test
 	void testEnteringEmptyContentDoesNotTrigger() {
 		AutoGrowPanel<MockComponent, MockComponent> panel = create();
@@ -114,6 +151,19 @@ class AutoGrowPanelTest extends SwingTestCase {
 		verify(shared, times(1)).remove(0);
 	}
 
+
+	@Test
+	void testEmptyingContentAdjustsAllPositions() {
+		final MockComponent mock = spy(new MockComponent("A"));
+		
+		@SuppressWarnings("unused")
+		AutoGrowPanel<MockComponent, MockComponent> panel = create(mock);
+		
+		mock.setText("");
+		
+		verify(internal.get(0), times(2)).setListPosition(0);
+	}
+
 	@Test
 	void testRemovingSomeContentDoesntClear() throws BadLocationException {
 		final MockComponent mock = spy(new MockComponent("AB"));