--- /dev/null
+package com.vaadin.tests.components.grid;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUIWithLog;
+import com.vaadin.tests.util.Person;
+import com.vaadin.tests.util.PersonContainer;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.Grid.CellReference;
+import com.vaadin.ui.Grid.CellStyleGenerator;
+import com.vaadin.ui.Grid.RowReference;
+import com.vaadin.ui.Grid.RowStyleGenerator;
+import com.vaadin.ui.HorizontalLayout;
+
+@Theme("valo")
+public class GridRefreshRow extends AbstractTestUIWithLog {
+
+ private PersonContainer container;
+ private Grid grid;
+
+ private boolean styles[] = new boolean[] { false, false, false };
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ getPage().getStyles()
+ .add(".rowstyle td {background-color: lightgreen !important;}");
+ getPage().getStyles()
+ .add("td.cellstyle {background-color: lightblue !important;}");
+ container = PersonContainer.createWithTestData(100);
+ container.addNestedContainerBean("address");
+ grid = new Grid(container);
+ grid.setWidth("800px");
+ grid.setRowStyleGenerator(new RowStyleGenerator() {
+ @Override
+ public String getStyle(RowReference row) {
+ int index = container.indexOfId(row.getItemId());
+ if (index < 3 && styles[index]) {
+ return "rowstyle";
+ }
+
+ return null;
+ }
+ });
+ grid.setCellStyleGenerator(new CellStyleGenerator() {
+ @Override
+ public String getStyle(CellReference cell) {
+ int index = container.indexOfId(cell.getItemId());
+ if (index < 3 && styles[index]
+ && "email".equals(cell.getPropertyId())) {
+ return "cellstyle";
+ }
+
+ return null;
+ }
+ });
+ addComponent(grid);
+
+ addComponents(new HorizontalLayout(update(0), update(1), update(2)));
+ Button refresh10 = new Button("Refresh 0-9", new ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ grid.refreshRows(container.getItemIds(0, 9).toArray());
+ }
+ });
+ refresh10.setId("refresh10");
+ addComponents(new HorizontalLayout(refresh(0), refresh(1), refresh(2),
+ new Button("Refresh non-existant", new ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ grid.refreshRows("foobar");
+ }
+ })), refresh10);
+ addComponents(new HorizontalLayout(style(0), style(1), style(2)));
+ }
+
+ private Component style(final int i) {
+ final CheckBox checkBox = new CheckBox("Style for " + i);
+ checkBox.addValueChangeListener(new ValueChangeListener() {
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ styles[i] = checkBox.getValue();
+ }
+ });
+ checkBox.setId("style" + i);
+ return checkBox;
+ }
+
+ private Component update(final int i) {
+ Button button = new Button("Update " + i, new ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ Person p = container.getIdByIndex(i);
+ p.setFirstName("!" + p.getFirstName());
+ }
+ });
+ button.setId("update" + i);
+ return button;
+ }
+
+ protected Component refresh(final int i) {
+ Button button = new Button("Refresh row " + i, new ClickListener() {
+ @Override
+ public void buttonClick(ClickEvent event) {
+ grid.refreshRows(container.getIdByIndex(i));
+ }
+ });
+ button.setId("refresh" + i);
+ return button;
+ }
+
+}
--- /dev/null
+package com.vaadin.tests.components.grid;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.CheckBoxElement;
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class GridRefreshRowTest extends SingleBrowserTest {
+
+ private GridElement grid;
+
+ @Test
+ public void refreshRow() {
+ openTestURL();
+ grid = $(GridElement.class).first();
+ update(0);
+ update(1);
+ update(2);
+ style(1);
+ style(2);
+
+ Assert.assertEquals("Lisa", grid.getCell(0, 1).getText());
+ Assert.assertEquals("Joshua", grid.getCell(1, 1).getText());
+ Assert.assertEquals("Marge", grid.getCell(2, 1).getText());
+
+ Assert.assertFalse(hasCssClass(grid.getRow(0), "rowstyle"));
+ Assert.assertFalse(hasCssClass(grid.getRow(1), "rowstyle"));
+ Assert.assertFalse(hasCssClass(grid.getRow(2), "rowstyle"));
+ Assert.assertFalse(hasCssClass(grid.getCell(0, 0), "cellstyle"));
+ Assert.assertFalse(hasCssClass(grid.getCell(1, 0), "cellstyle"));
+ Assert.assertFalse(hasCssClass(grid.getCell(2, 0), "cellstyle"));
+
+ refresh(1);
+ Assert.assertEquals("Lisa", grid.getCell(0, 1).getText());
+ Assert.assertEquals("!Joshua", grid.getCell(1, 1).getText());
+ Assert.assertEquals("Marge", grid.getCell(2, 1).getText());
+
+ Assert.assertFalse(hasCssClass(grid.getRow(0), "rowstyle"));
+ Assert.assertTrue(hasCssClass(grid.getRow(1), "rowstyle"));
+ Assert.assertFalse(hasCssClass(grid.getRow(2), "rowstyle"));
+ Assert.assertFalse(hasCssClass(grid.getCell(0, 0), "cellstyle"));
+ Assert.assertTrue(hasCssClass(grid.getCell(1, 0), "cellstyle"));
+ Assert.assertFalse(hasCssClass(grid.getCell(2, 0), "cellstyle"));
+
+ // Assert refreshing works many times and for many rows at the same time
+ update(0);
+ update(1);
+ update(2);
+ refresh10First();
+ Assert.assertEquals("!!Lisa", grid.getCell(0, 1).getText());
+ Assert.assertEquals("!!Joshua", grid.getCell(1, 1).getText());
+ Assert.assertEquals("!!Marge", grid.getCell(2, 1).getText());
+ }
+
+ private void refresh10First() {
+ $(ButtonElement.class).id("refresh10").click();
+ }
+
+ private void update(int i) {
+ $(ButtonElement.class).id("update" + i).click();
+ }
+
+ private void style(int i) {
+ $(CheckBoxElement.class).id("style" + i).click();
+ }
+
+ private void refresh(int i) {
+ $(ButtonElement.class).id("refresh" + i).click();
+ }
+}