From 1313bbbe3b315885fc8a49795dc85fe85768187f Mon Sep 17 00:00:00 2001 From: Anna Koskinen Date: Tue, 17 Mar 2020 10:17:48 +0200 Subject: [PATCH] Prevent a gap within Grid rows in some resize situations. (#11918) Fixes #11892 --- .../com/vaadin/client/widgets/Escalator.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/client/src/main/java/com/vaadin/client/widgets/Escalator.java b/client/src/main/java/com/vaadin/client/widgets/Escalator.java index 7ad1cabf009..c2e70eeb963 100644 --- a/client/src/main/java/com/vaadin/client/widgets/Escalator.java +++ b/client/src/main/java/com/vaadin/client/widgets/Escalator.java @@ -4578,7 +4578,7 @@ public void verifyEscalatorCount() { // for a gap if a details row is later closed (e.g. by user) final int addToBottom = Math.min(rowDiff, getRowCount() - logicalTargetIndex); - final int addToTop = rowDiff - addToBottom; + final int addToTop = Math.max(rowDiff - addToBottom, 0); if (addToTop > 0) { fillAndPopulateEscalatorRowsIfNeeded(0, @@ -4587,8 +4587,30 @@ public void verifyEscalatorCount() { updateTopRowLogicalIndex(-addToTop); } if (addToBottom > 0) { - fillAndPopulateEscalatorRowsIfNeeded(visualTargetIndex, - logicalTargetIndex, addToBottom); + // take into account that rows may have got added to top as + // well, affects visual but not logical indexing + fillAndPopulateEscalatorRowsIfNeeded( + visualTargetIndex + addToTop, logicalTargetIndex, + addToBottom); + + // adding new rows due to resizing may have created a gap in + // the middle, check whether the existing rows need moving + double rowTop = getRowTop(oldTopRowLogicalIndex); + if (rowTop > getRowTop(visualRowOrder.get(addToTop))) { + for (int i = addToTop; i < visualTargetIndex; i++) { + + final TableRowElement tr = visualRowOrder.get(i); + + setRowPosition(tr, 0, rowTop); + rowTop += getDefaultRowHeight(); + SpacerContainer.SpacerImpl spacer = spacerContainer + .getSpacer(oldTopRowLogicalIndex + i); + if (spacer != null) { + spacer.setPosition(0, rowTop); + rowTop += spacer.getHeight(); + } + } + } } } else if (rowDiff < 0) { // rows need to be removed