From b4eb8571aba35b90df5cf70ad1f4a8ca3f67556d Mon Sep 17 00:00:00 2001 From: Automerge Date: Fri, 18 May 2012 08:44:57 +0000 Subject: [PATCH] [merge from 6.7] #8805 fix flickering of partial first row in table, related manual test svn changeset:23762/svn branch:6.8 --- src/com/vaadin/ui/Table.java | 7 ++ .../table/TableFirstRowFlicker.java | 85 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 tests/testbench/com/vaadin/tests/components/table/TableFirstRowFlicker.java diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index 7828fdb734..db0809fbd5 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -1458,6 +1458,13 @@ public class Table extends AbstractSelect implements Action.Container, } } else { // initial load + + // #8805 send one extra row in the beginning in case a partial + // row is shown on the UI + if (firstIndex > 0) { + firstIndex = firstIndex - 1; + rows = rows + 1; + } firstToBeRenderedInClient = firstIndex; } if (totalRows > 0) { diff --git a/tests/testbench/com/vaadin/tests/components/table/TableFirstRowFlicker.java b/tests/testbench/com/vaadin/tests/components/table/TableFirstRowFlicker.java new file mode 100644 index 0000000000..776e7956bf --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/table/TableFirstRowFlicker.java @@ -0,0 +1,85 @@ +package com.vaadin.tests.components.table; + +import com.vaadin.Application; +import com.vaadin.data.Container; +import com.vaadin.data.util.IndexedContainer; +import com.vaadin.ui.Label; +import com.vaadin.ui.ProgressIndicator; +import com.vaadin.ui.Table; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class TableFirstRowFlicker extends Application { + + Table t; + + @Override + public void init() { + Window mainWindow = new Window("Table Row Flicker"); + mainWindow.getContent().setSizeFull(); + setMainWindow(mainWindow); + + t = new Table(); + t.setSizeFull(); + t.setSelectable(true); + t.setContainerDataSource(buildContainer()); + mainWindow.addComponent(t); + ((VerticalLayout) mainWindow.getContent()).setExpandRatio(t, 1); + + // Button button = new Button("Refresh"); + // button.addListener(new Button.ClickListener() { + // public void buttonClick(ClickEvent event) { + // t.refreshRowCache(); + // } + // }); + // mainWindow.addComponent(button); + + ProgressIndicator pi = new ProgressIndicator(); + pi.setPollingInterval(1000); + pi.setIndeterminate(true); + mainWindow.addComponent(pi); + + Thread r = new Thread() { + @Override + public void run() { + while (t != null) { + synchronized (t.getApplication()) { + int firstId = t.getCurrentPageFirstItemIndex(); + Object selected = t.getValue(); + t.setContainerDataSource(buildContainer()); + t.setValue(selected); + t.setCurrentPageFirstItemIndex(firstId); + // lighter alternative for all of above + // t.refreshRowCache(); + } + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("Table update thread stopped"); + } + }; + r.start(); + } + + @Override + public void close() { + t = null; + super.close(); + } + + private Container buildContainer() { + IndexedContainer cont = new IndexedContainer(); + cont.addContainerProperty("name", Label.class, null); + for (int i = 0; i < 10000; i++) { + cont.addItem(i); + Label l = new Label("Item " + i); + l.setHeight("50px"); + cont.getContainerProperty(i, "name").setValue(l); + } + return cont; + } + +} \ No newline at end of file -- 2.39.5