diff options
author | Artur <artur@vaadin.com> | 2017-03-07 12:44:01 +0200 |
---|---|---|
committer | Henri Sara <henri.sara@gmail.com> | 2017-03-07 12:44:01 +0200 |
commit | 0c5414744b720da51aedace58b9efa21ecd4bd0e (patch) | |
tree | 1ff08e689abfbc098ff26ba72e7ad6df0df32ba1 | |
parent | f25041bfabd1e3b13a2a9bd85289098d33699cc2 (diff) | |
download | vaadin-framework-0c5414744b720da51aedace58b9efa21ecd4bd0e.tar.gz vaadin-framework-0c5414744b720da51aedace58b9efa21ecd4bd0e.zip |
Always calculate Escalator max row count the same way (#8740)
* Rename getMaxEscalatorRowCapacity to describe what it does
* Always calculate Escalator max row count the same way
This changes Escalator to not take a horizontal scrollbar
into account when trying to determine "maximum visible rows". This will
add another row, compared to previous versions, when there is a horizontal
scrollbar. In reality, it would likely make sense to always add 10 more rows
to have some buffer above and below the visible area.
Fixes #8661
5 files changed, 156 insertions, 18 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 f9c8d96ad4..7d5cd8981b 100644 --- a/client/src/main/java/com/vaadin/client/widgets/Escalator.java +++ b/client/src/main/java/com/vaadin/client/widgets/Escalator.java @@ -2999,7 +2999,7 @@ public class Escalator extends Widget private List<TableRowElement> fillAndPopulateEscalatorRowsIfNeeded( final int index, final int numberOfRows) { - final int escalatorRowsStillFit = getMaxEscalatorRowCapacity() + final int escalatorRowsStillFit = getMaxVisibleRowCount() - getDomRowCount(); final int escalatorRowsNeeded = Math.min(numberOfRows, escalatorRowsStillFit); @@ -3032,16 +3032,22 @@ public class Escalator extends Widget } } - private int getMaxEscalatorRowCapacity() { - final int maxEscalatorRowCapacity = (int) Math - .ceil(getHeightOfSection() / getDefaultRowHeight()) + 1; + private int getMaxVisibleRowCount() { + double heightOfSection = getHeightOfSection(); + // By including the possibly shown scrollbar height, we get a + // consistent count and do not add/remove rows whenever a scrollbar + // is shown + heightOfSection += horizontalScrollbarDeco.getOffsetHeight(); + double defaultRowHeight = getDefaultRowHeight(); + final int maxVisibleRowCount = (int) Math + .ceil(heightOfSection / defaultRowHeight) + 1; /* - * maxEscalatorRowCapacity can become negative if the headers and - * footers start to overlap. This is a crazy situation, but Vaadin - * blinks the components a lot, so it's feasible. + * maxVisibleRowCount can become negative if the headers and footers + * start to overlap. This is a crazy situation, but Vaadin blinks + * the components a lot, so it's feasible. */ - return Math.max(0, maxEscalatorRowCapacity); + return Math.max(0, maxVisibleRowCount); } @Override @@ -3524,12 +3530,12 @@ public class Escalator extends Widget * TODO [[spacer]]: these assumptions will be totally broken with * spacers. */ - final int maxEscalatorRows = getMaxEscalatorRowCapacity(); + final int maxVisibleRowCount = getMaxVisibleRowCount(); final int currentTopRowIndex = getLogicalRowIndex( visualRowOrder.getFirst()); final Range[] partitions = logicalRange.partitionWith( - Range.withLength(currentTopRowIndex, maxEscalatorRows)); + Range.withLength(currentTopRowIndex, maxVisibleRowCount)); final Range insideRange = partitions[1]; return insideRange.offsetBy(-currentTopRowIndex); } @@ -3641,8 +3647,8 @@ public class Escalator extends Widget return; } - final int maxEscalatorRows = getMaxEscalatorRowCapacity(); - final int neededEscalatorRows = Math.min(maxEscalatorRows, + final int maxVisibleRowCount = getMaxVisibleRowCount(); + final int neededEscalatorRows = Math.min(maxVisibleRowCount, body.getRowCount()); final int neededEscalatorRowsDiff = neededEscalatorRows - visualRowOrder.size(); @@ -6687,7 +6693,7 @@ public class Escalator extends Widget * @return the maximum capacity */ public int getMaxVisibleRowCount() { - return body.getMaxEscalatorRowCapacity(); + return body.getMaxVisibleRowCount(); } /** diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/HideGridColumnWhenHavingUnsuitableHeight.java b/uitest/src/main/java/com/vaadin/tests/components/grid/HideGridColumnWhenHavingUnsuitableHeight.java new file mode 100644 index 0000000000..6eb054a906 --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/grid/HideGridColumnWhenHavingUnsuitableHeight.java @@ -0,0 +1,92 @@ +package com.vaadin.tests.components.grid; + +import com.vaadin.annotations.Theme; +import com.vaadin.data.Item; +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.data.util.GeneratedPropertyContainer; +import com.vaadin.data.util.PropertyValueGenerator; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Grid; +import com.vaadin.ui.Grid.Column; +import com.vaadin.ui.renderers.ButtonRenderer; + +@Theme("valo") +public class HideGridColumnWhenHavingUnsuitableHeight extends AbstractTestUI { + + private Grid grid; + + public static class SampleBean { + + private String col1; + private String col2; + + public SampleBean() { + } + + public String getCol1() { + return col1; + } + + public void setCol1(String col1) { + this.col1 = col1; + } + + public String getCol2() { + return col2; + } + + public void setCol2(String col2) { + this.col2 = col2; + } + } + + @SuppressWarnings("serial") + @Override + protected void setup(VaadinRequest vaadinRequest) { + grid = new Grid(); + + BeanItemContainer<SampleBean> container = generateData(50); + GeneratedPropertyContainer gpc = new GeneratedPropertyContainer( + container); + grid.setContainerDataSource(gpc); + + gpc.addGeneratedProperty("Button1", + new PropertyValueGenerator<String>() { + @Override + public String getValue(Item item, Object itemId, + Object propertyId) { + return "Button 1"; + } + + @Override + public Class<String> getType() { + return String.class; + } + }); + grid.getColumn("Button1").setRenderer(new ButtonRenderer()); + grid.getColumn("col1").setWidth(1600); + for (Column gridCol : grid.getColumns()) { + gridCol.setHidable(true); + } + grid.setWidth("100%"); + grid.setHeight("425px"); + + grid.setColumns("col1", "col2", "Button1"); + + addComponent(grid); + } + + private BeanItemContainer<SampleBean> generateData(int rows) { + BeanItemContainer<SampleBean> container = new BeanItemContainer<SampleBean>( + SampleBean.class); + for (int y = 0; y < rows; ++y) { + SampleBean sampleBean = new SampleBean(); + sampleBean.setCol1("Row " + y + " Column 1"); + sampleBean.setCol2("Row " + y + " Column 2"); + container.addBean(sampleBean); + } + return container; + } + +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/HideGridColumnWhenHavingUnsuitableHeightTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/HideGridColumnWhenHavingUnsuitableHeightTest.java new file mode 100644 index 0000000000..e9d465ba29 --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/grid/HideGridColumnWhenHavingUnsuitableHeightTest.java @@ -0,0 +1,40 @@ +package com.vaadin.tests.components.grid; + +import java.util.List; +import java.util.logging.Level; + +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.vaadin.testbench.elements.GridElement; +import com.vaadin.tests.tb3.SingleBrowserTest; + +public class HideGridColumnWhenHavingUnsuitableHeightTest + extends SingleBrowserTest { + + @Test + public void hideAndScroll() { + openTestURL("debug"); + GridElement grid = $(GridElement.class).first(); + + getSidebarOpenButton(grid).click(); + // Hide first column + getSidebarPopup().findElements(By.tagName("td")).get(0).click(); + + grid.scrollToRow(25); + assertNoDebugMessage(Level.SEVERE); + } + + protected WebElement getSidebarOpenButton(GridElement grid) { + List<WebElement> elements = grid + .findElements(By.className("v-grid-sidebar-button")); + return elements.isEmpty() ? null : elements.get(0); + } + + protected WebElement getSidebarPopup() { + List<WebElement> elements = findElements( + By.className("v-grid-sidebar-popup")); + return elements.isEmpty() ? null : elements.get(0); + } +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/escalator/EscalatorSpacerTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/escalator/EscalatorSpacerTest.java index 34b69027a4..e64c57a49d 100644 --- a/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/escalator/EscalatorSpacerTest.java +++ b/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/escalator/EscalatorSpacerTest.java @@ -290,12 +290,12 @@ public class EscalatorSpacerTest extends EscalatorBasicClientFeaturesTest { selectMenuPath(FEATURES, SPACERS, ROW_1, SET_100PX); /* - * we check for row -2 instead of -1, because escalator has the one row + * we check for row -3 instead of -1, because escalator has two rows * buffered underneath the footer */ selectMenuPath(COLUMNS_AND_ROWS, BODY_ROWS, SCROLL_TO, ROW_75); Thread.sleep(500); - assertEquals("Row 75: 0,75", getBodyCell(-2, 0).getText()); + assertEquals("Row 75: 0,75", getBodyCell(-3, 0).getText()); selectMenuPath(COLUMNS_AND_ROWS, BODY_ROWS, SCROLL_TO, ROW_25); Thread.sleep(500); diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/server/GridScrollTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/server/GridScrollTest.java index 815d6f72a6..c2d4926f73 100644 --- a/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/server/GridScrollTest.java +++ b/uitest/src/test/java/com/vaadin/tests/components/grid/basicfeatures/server/GridScrollTest.java @@ -41,17 +41,17 @@ public class GridScrollTest extends GridBasicFeaturesTest { selectMenuPath("Settings", "Clear log"); $(GridElement.class).first().scrollToRow(40); assertEquals("Log row did not contain expected item request", - "0. Requested items 0 - 86", getLogRow(0)); + "0. Requested items 0 - 91", getLogRow(0)); assertEquals("There should be only one log row", " ", getLogRow(1)); selectMenuPath("Settings", "Clear log"); $(GridElement.class).first().scrollToRow(100); assertEquals("Log row did not contain expected item request", - "0. Requested items 47 - 146", getLogRow(0)); + "0. Requested items 43 - 151", getLogRow(0)); assertEquals("There should be only one log row", " ", getLogRow(1)); selectMenuPath("Settings", "Clear log"); $(GridElement.class).first().scrollToRow(300); assertEquals("Log row did not contain expected item request", - "0. Requested items 247 - 346", getLogRow(0)); + "0. Requested items 243 - 351", getLogRow(0)); assertEquals("There should be only one log row", " ", getLogRow(1)); } |