private void updateHorizontalScrollPosition() {
double scrollLeft = grid.getScrollLeft();
- cellWrapper.getStyle().setLeft(
- frozenCellWrapper.getOffsetWidth() - scrollLeft, Unit.PX);
+ int frozenWidth = frozenCellWrapper.getOffsetWidth();
+ double newLeft = frozenWidth - scrollLeft;
+ cellWrapper.getStyle().setLeft(newLeft, Unit.PX);
+
+ // sometimes focus handling twists the editor row out of alignment
+ // with the grid itself and the position needs to be compensated for
+ TableRowElement rowElement = grid.getEscalator().getBody()
+ .getRowElement(grid.getEditor().getRow());
+ int rowLeft = rowElement.getAbsoluteLeft();
+ int editorLeft = cellWrapper.getAbsoluteLeft();
+ if (editorLeft != rowLeft + frozenWidth) {
+ cellWrapper.getStyle().setLeft(newLeft + rowLeft - editorLeft,
+ Unit.PX);
+ }
}
/**
--- /dev/null
+package com.vaadin.tests.components.grid;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Grid;
+
+public class GridEditorScrollSync extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ // Create a grid
+ Grid grid = new Grid();
+ grid.setEditorEnabled(true);
+ grid.setEditorBuffered(false);
+
+ // Define some columns
+ grid.addColumn("name", String.class);
+ grid.addColumn("born", Integer.class);
+
+ grid.addColumn("name1", String.class);
+ grid.addColumn("born1", Integer.class);
+
+ grid.addColumn("name2", String.class);
+ grid.addColumn("born2", Integer.class);
+
+ grid.addColumn("name3", String.class);
+ grid.addColumn("born3", Integer.class);
+
+ grid.addColumn("name4", String.class);
+ grid.addColumn("born4", Integer.class);
+
+ grid.setWidth("450px");
+
+ // Add some data rows
+ grid.addRow("Nicolaus Copernicus", 1543, "Nicolaus Copernicus", 1543,
+ "Nicolaus Copernicus", 1543, "Nicolaus Copernicus", 1543,
+ "Nicolaus Copernicus", 1543);
+
+ grid.addRow("Galileo Galilei", 1564, "Galileo Galilei", 1564,
+ "Galileo Galilei", 1564, "s", 55, "Nicolaus Copernicus", 1543);
+
+ grid.addRow("Johannes Kepler", 1571, "Johannes Kepler", 1571,
+ "Johannes Kepler", 1571, "Nicolaus Copernicus", 1543,
+ "Nicolaus Copernicus", 1543);
+
+ getLayout().addComponent(grid);
+ }
+
+}
--- /dev/null
+package com.vaadin.tests.components.grid;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.number.IsCloseTo.closeTo;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+
+import com.vaadin.testbench.TestBenchElement;
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.testbench.elements.GridElement.GridCellElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class GridEditorScrollSyncTest extends MultiBrowserTest {
+
+ private GridElement grid;
+
+ @Test
+ public void testScrollAndEdit() {
+ openTestURL();
+ grid = $(GridElement.class).first();
+
+ ((TestBenchElement) grid
+ .findElement(By.className("v-grid-scroller-horizontal")))
+ .scrollLeft(300);
+ openEditor();
+
+ GridCellElement rowCell = grid.getCell(1, 6);
+ TestBenchElement editorField = grid.getEditor().getField(6);
+ assertPosition(rowCell.getLocation().getX(),
+ editorField.getWrappedElement().getLocation().getX());
+ }
+
+ private GridElement openEditor() {
+ grid.getCell(0, 6).doubleClick();
+ Assert.assertTrue("Grid editor should be displayed.",
+ grid.getEditor().isDisplayed());
+ return grid;
+ }
+
+ private void assertPosition(double expected, double actual) {
+ // 1px leeway for calculations
+ assertThat("Unexpected position.", expected, closeTo(actual, 1d));
+ }
+
+}