- More lightweight, and fixes things for any custom implementations of Escalator as well. Fixes #11044tags/8.7.0.alpha1
@@ -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); | |||
} | |||
} | |||
} |
@@ -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> |
@@ -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; | |||
} | |||
} |
@@ -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)); | |||
} | |||
} |