diff options
author | Teemu Suo-Anttila <tsuoanttila@users.noreply.github.com> | 2017-04-19 14:27:13 +0300 |
---|---|---|
committer | Teemu Suo-Anttila <tsuoanttila@users.noreply.github.com> | 2017-05-08 14:46:35 +0300 |
commit | 0c05a633130b18450eb296b5b029803b9af34e02 (patch) | |
tree | ddb3e47e5fa19c63dc72e8e01662585b1bbc18f4 /client | |
parent | 9a0e606727f05fbaf89a04d40ec64c9dceb7bbd0 (diff) | |
download | vaadin-framework-0c05a633130b18450eb296b5b029803b9af34e02.tar.gz vaadin-framework-0c05a633130b18450eb296b5b029803b9af34e02.zip |
Fix issues in Grid with undefined height (#9104)
Diffstat (limited to 'client')
-rw-r--r-- | client/src/main/java/com/vaadin/client/widgets/Escalator.java | 92 |
1 files changed, 43 insertions, 49 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 11bfa113cb..8801987104 100644 --- a/client/src/main/java/com/vaadin/client/widgets/Escalator.java +++ b/client/src/main/java/com/vaadin/client/widgets/Escalator.java @@ -195,7 +195,6 @@ abstract class JsniWorkaround { * to Java code. * * @see #createScrollListenerFunction(Escalator) - * @see Escalator#onScroll() * @see Escalator.Scroller#onScroll() */ protected final JavaScriptObject scrollListenerFunction; @@ -205,7 +204,6 @@ abstract class JsniWorkaround { * it on to Java code. * * @see #createMousewheelListenerFunction(Escalator) - * @see Escalator#onScroll() * @see Escalator.Scroller#onScroll() */ protected final JavaScriptObject mousewheelListenerFunction; @@ -253,7 +251,7 @@ abstract class JsniWorkaround { * * @param esc * a reference to the current instance of {@link Escalator} - * @see Escalator#onScroll() + * @see Escalator.Scroller#onScroll() */ protected abstract JavaScriptObject createScrollListenerFunction( Escalator esc); @@ -264,7 +262,7 @@ abstract class JsniWorkaround { * * @param esc * a reference to the current instance of {@link Escalator} - * @see Escalator#onScroll() + * @see Escalator.Scroller#onScroll() */ protected abstract JavaScriptObject createMousewheelListenerFunction( Escalator esc); @@ -1139,10 +1137,10 @@ public class Escalator extends Widget * Usually {@code "th"} or {@code "td"}. * <p> * <em>Note:</em> To actually <em>create</em> such an element, use - * {@link #createCellElement(int, int)} instead. + * {@link #createCellElement(double)} instead. * * @return the tag name for the element to represent cells as - * @see #createCellElement(int, int) + * @see #createCellElement(double) */ protected abstract String getCellElementTagName(); @@ -1189,9 +1187,6 @@ public class Escalator extends Widget assertArgumentsAreValidAndWithinRange(index, numberOfRows); rows -= numberOfRows; - if (heightMode == HeightMode.UNDEFINED) { - heightByRows = rows; - } if (!isAttached()) { return; @@ -1207,8 +1202,9 @@ public class Escalator extends Widget * range of logical indices. This may be fewer than {@code numberOfRows} * , even zero, if not all the removed rows are actually visible. * <p> - * The implementation must call {@link #paintRemoveRow(Element, int)} - * for each row that is removed from the DOM. + * The implementation must call + * {@link #paintRemoveRow(TableRowElement, int)} for each row that is + * removed from the DOM. * * @param index * the logical index of the first removed row @@ -1315,10 +1311,6 @@ public class Escalator extends Widget } rows += numberOfRows; - if (heightMode == HeightMode.UNDEFINED) { - heightByRows = rows; - } - /* * only add items in the DOM if the widget itself is attached to the * DOM. We can't calculate sizes otherwise. @@ -2671,6 +2663,24 @@ public class Escalator extends Widget } @Override + public void insertRows(int index, int numberOfRows) { + super.insertRows(index, numberOfRows); + + if (heightMode == HeightMode.UNDEFINED) { + setHeightByRows(getRowCount()); + } + } + + @Override + public void removeRows(int index, int numberOfRows) { + super.removeRows(index, numberOfRows); + + if (heightMode == HeightMode.UNDEFINED) { + setHeightByRows(getRowCount()); + } + } + + @Override protected void paintInsertRows(final int index, final int numberOfRows) { if (numberOfRows == 0) { @@ -3111,44 +3121,27 @@ public class Escalator extends Widget */ int rowsLeft = getRowCount(); if (rowsLeft < escalatorRowCount) { - int escalatorRowsToRemove = escalatorRowCount - rowsLeft; - for (int i = 0; i < escalatorRowsToRemove; i++) { - final TableRowElement tr = visualRowOrder - .remove(removedVisualInside.getStart()); - - paintRemoveRow(tr, index); + /* + * Remove extra DOM rows and refresh contents. + */ + for (int i = escalatorRowCount - 1; i >= rowsLeft; i--) { + final TableRowElement tr = visualRowOrder.remove(i); + paintRemoveRow(tr, i); removeRowPosition(tr); } - escalatorRowCount -= escalatorRowsToRemove; - /* - * Because we're removing escalator rows, we don't have - * anything to scroll by. Let's make sure the viewport is - * scrolled to top, to render any rows possibly left above. - */ - body.setBodyScrollPosition(tBodyScrollLeft, 0); + // Move rest of the rows to the Escalator's top + Range visualRange = Range.withLength(0, + visualRowOrder.size()); + moveAndUpdateEscalatorRows(visualRange, 0, 0); - /* - * We might have removed some rows from the middle, so let's - * make sure we're not left with any holes. Also remember: - * visualIndex == logicalIndex applies now. - */ - final int dirtyRowsStart = removedLogicalInside.getStart(); - double y = getRowTop(dirtyRowsStart); - for (int i = dirtyRowsStart; i < escalatorRowCount; i++) { - final TableRowElement tr = visualRowOrder.get(i); - setRowPosition(tr, 0, y); - y += getDefaultRowHeight(); - y += spacerContainer.getSpacerHeight(i); - } + sortDomElements(); + setTopRowLogicalIndex(0); - // #8825 update data starting from the first moved row - final int start = dirtyRowsStart; - final int end = escalatorRowCount; - for (int i = start; i < end; i++) { - final TableRowElement tr = visualRowOrder.get(i); - refreshRow(tr, i); - } + scroller.recalculateScrollbarsForVirtualViewport(); + + fireRowVisibilityChangeEvent(); + return; } else { @@ -6444,11 +6437,12 @@ public class Escalator extends Widget * @param rows * the number of rows that should be visible in Escalator's body * @throws IllegalArgumentException - * if {@code rows} is ≤ 0, {@link Double#isInifinite(double) + * if {@code rows} is ≤ 0, {@link Double#isInfinite(double) * infinite} or {@link Double#isNaN(double) NaN}. * @see #setHeightMode(HeightMode) */ public void setHeightByRows(double rows) throws IllegalArgumentException { + getLogger().warning("HeightByRows: " + rows); if (rows <= 0) { throw new IllegalArgumentException( "The number of rows must be a positive number."); |