Browse Source

Replaced Grid's internal size calculation fix with an indexing fix. (#11154)

- More lightweight, and fixes things for any custom implementations of
Escalator as well.

Fixes #11044
tags/8.7.0.alpha1
Anna Koskinen 5 years ago
parent
commit
2aa7a0696a

+ 1
- 1
client/src/main/java/com/vaadin/client/widgets/Escalator.java View File

@@ -67,7 +67,6 @@ import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.BrowserInfo;
import com.vaadin.client.ComputedStyle;
import com.vaadin.client.DeferredWorker;
import com.vaadin.client.LayoutManager;
import com.vaadin.client.Profiler;
import com.vaadin.client.WidgetUtil;
import com.vaadin.client.ui.SubPartAware;
@@ -3896,6 +3895,7 @@ public class Escalator extends Widget
visualRowOrder.getLast()) + 1;
moveAndUpdateEscalatorRows(Range.withOnly(0),
visualRowOrder.size(), newLogicalIndex);
updateTopRowLogicalIndex(1);
}
}
}

+ 4
- 17
client/src/main/java/com/vaadin/client/widgets/Grid.java View File

@@ -76,7 +76,10 @@ import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.*;
import com.vaadin.client.BrowserInfo;
import com.vaadin.client.DeferredWorker;
import com.vaadin.client.Focusable;
import com.vaadin.client.WidgetUtil;
import com.vaadin.client.WidgetUtil.Reference;
import com.vaadin.client.data.DataChangeHandler;
import com.vaadin.client.data.DataSource;
@@ -3339,7 +3342,6 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>,
*/
private class AutoColumnWidthsRecalculator {
private double lastCalculatedInnerWidth = -1;
private double lastCalculatedInnerHeight = -1;

private final ScheduledCommand calculateCommand = new ScheduledCommand() {

@@ -3434,7 +3436,6 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>,

// Update latest width to prevent recalculate on height change.
lastCalculatedInnerWidth = escalator.getInnerWidth();
lastCalculatedInnerHeight = getEscalatorInnerHeight();
}

private boolean columnsAreGuaranteedToBeWiderThanGrid() {
@@ -9147,15 +9148,6 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>,
recalculateColumnWidths();
}

if (getEscalatorInnerHeight() != autoColumnWidthsRecalculator.lastCalculatedInnerHeight) {
Scheduler.get().scheduleFinally(() -> {
// Trigger re-calculation of all row positions.
RowContainer.BodyRowContainer body = getEscalator()
.getBody();
body.setDefaultRowHeight(body.getDefaultRowHeight());
});
}

// Vertical resizing could make editor positioning invalid so it
// needs to be recalculated on resize
if (isEditorActive()) {
@@ -9169,11 +9161,6 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>,
});
}

private double getEscalatorInnerHeight() {
return new ComputedStyle(getEscalator().getTableWrapper())
.getHeightIncludingBorderPadding();
}

/**
* Grid does not support adding Widgets this way.
* <p>

+ 47
- 0
uitest/src/main/java/com/vaadin/tests/components/grid/GridScrolledToBottom.java View File

@@ -0,0 +1,47 @@
package com.vaadin.tests.components.grid;

import java.util.ArrayList;
import java.util.List;

import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.data.bean.Person;
import com.vaadin.ui.Grid;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalSplitPanel;

public class GridScrolledToBottom extends SimpleGridUI {

@Override
protected void setup(VaadinRequest request) {
Grid<Person> grid = createGrid();
grid.setSizeFull();

VerticalSplitPanel splitPanel = new VerticalSplitPanel(grid,
new Label("Foo"));
splitPanel.setHeight("200px");
splitPanel.setSplitPosition(100);
getLayout().addComponent(splitPanel);
}

@Override
protected List<Person> createPersons() {
List<Person> persons = new ArrayList<>();
for (int i = 0; i < 100; ++i) {
Person person = new Person();
person.setFirstName("Person " + i);
person.setAge(i);
persons.add(person);
}
return persons;
}

@Override
protected String getTestDescription() {
return "Resizing a Grid when it's scrolled to bottom shouldn't cause indexing to jump.";
}

@Override
protected Integer getTicketNumber() {
return 11044;
}
}

+ 97
- 0
uitest/src/test/java/com/vaadin/tests/components/grid/GridScrolledToBottomTest.java View File

@@ -0,0 +1,97 @@
package com.vaadin.tests.components.grid;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.number.IsCloseTo.closeTo;
import static org.junit.Assert.assertEquals;

import java.util.List;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;

import com.vaadin.testbench.TestBenchElement;
import com.vaadin.testbench.elements.GridElement;
import com.vaadin.testbench.elements.GridElement.GridRowElement;
import com.vaadin.testbench.elements.VerticalSplitPanelElement;
import com.vaadin.tests.tb3.MultiBrowserTest;

public class GridScrolledToBottomTest extends MultiBrowserTest {

@Test
public void testResizingAndBack() {
openTestURL();
GridElement grid = $(GridElement.class).first();
grid.scrollToRow(99);

GridRowElement row99 = grid.getRow(99);
int rowHeight = row99.getSize().getHeight();
assertThat(grid.getLocation().getY() + grid.getSize().getHeight(),
greaterThan(row99.getLocation().getY() + rowHeight - 2));

VerticalSplitPanelElement splitPanel = $(
VerticalSplitPanelElement.class).first();
TestBenchElement splitter = splitPanel.getSplitter();
// resize by three rows
Actions actions = new Actions(driver);
actions.clickAndHold(splitter).moveByOffset(0, -rowHeight * 3).release()
.perform();
// resize back by two rows
actions.clickAndHold(splitter).moveByOffset(0, rowHeight * 2).release()
.perform();

GridRowElement row95 = grid.getRow(95);
GridRowElement row97 = grid.getRow(97);
assertThat((double) row97.getLocation().getY(),
greaterThan(row95.getLocation().getY() + rowHeight * 1.5));
}

@Test
public void testResizingHalfRow() {
openTestURL();
GridElement grid = $(GridElement.class).first();
grid.scrollToRow(99);

GridRowElement row99 = grid.getRow(99);
int rowHeight = row99.getSize().getHeight();
int gridBottomY = grid.getLocation().getY()
+ grid.getSize().getHeight();

// ensure that grid really is scrolled to bottom
assertThat((double) gridBottomY,
closeTo((double) row99.getLocation().getY() + rowHeight, 1d));

VerticalSplitPanelElement splitPanel = $(
VerticalSplitPanelElement.class).first();
TestBenchElement splitter = splitPanel.getSplitter();
// resize by half a row
Actions actions = new Actions(driver);
actions.clickAndHold(splitter).moveByOffset(0, -rowHeight / 2).release()
.perform();
// the last row is now only half visible, and in DOM tree it's actually
// the first row now but positioned to the bottom

// can't query grid.getRow(99) now or it moves the row position,
// have to use element query instead
List<WebElement> rows = grid.findElement(By.className("v-grid-body"))
.findElements(By.className("v-grid-row"));
WebElement firstRow = rows.get(0);
WebElement lastRow = rows.get(rows.size() - 1);

// ensure the scrolling didn't jump extra
assertEquals("Person 99",
firstRow.findElement(By.className("v-grid-cell")).getText());
assertEquals("Person 98",
lastRow.findElement(By.className("v-grid-cell")).getText());

// re-calculate current end position
gridBottomY = grid.getLocation().getY() + grid.getSize().getHeight();
// ensure the correct final row really is only half visible at the
// bottom
assertThat(gridBottomY, greaterThan(firstRow.getLocation().getY()));
assertThat(firstRow.getLocation().getY() + rowHeight,
greaterThan(gridBottomY));
}
}

Loading…
Cancel
Save