]> source.dussan.org Git - vaadin-framework.git/commitdiff
Merge of (#8519) to Vaadin 7. 28/628/1
authorAnna Koskinen <anna@vaadin.com>
Fri, 11 Jan 2013 11:45:32 +0000 (13:45 +0200)
committerAnna Koskinen <anna@vaadin.com>
Fri, 11 Jan 2013 11:45:32 +0000 (13:45 +0200)
Table does not refresh after selecting more rows than pagination size.

Change-Id: I352e15f9e124d13b0171b6bb1b8b287f52a056bc

client/src/com/vaadin/client/ui/VScrollTable.java
uitest/src/com/vaadin/tests/components/table/LargeSelectionCausesNPE.html [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/table/LargeSelectionCausesNPE.java [new file with mode: 0644]

index a8cee55375a1d8133db07417166ad38ba5d3921f..f14c86aa3603287f7f2e6c39db6539bd8ef4da78 100644 (file)
@@ -325,8 +325,10 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
                 // create range of second part unless its length is < 1
                 VScrollTableRow startOfRange = scrollBody
                         .getRowByRowIndex(startOfSecondRange);
-                ranges.add(new SelectionRange(startOfRange, getEndIndex()
-                        - startOfSecondRange + 1));
+                if (startOfRange != null) {
+                    ranges.add(new SelectionRange(startOfRange, getEndIndex()
+                            - startOfSecondRange + 1));
+                }
             }
             return ranges;
         }
diff --git a/uitest/src/com/vaadin/tests/components/table/LargeSelectionCausesNPE.html b/uitest/src/com/vaadin/tests/components/table/LargeSelectionCausesNPE.html
new file mode 100644 (file)
index 0000000..8ee0bad
--- /dev/null
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="http://localhost:8068/" />
+<title>LargeSelectionCausesNPE</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">LargeSelectionCausesNPE</td></tr>
+</thead><tbody>
+<tr>
+       <td>open</td>
+       <td>/run/com.vaadin.tests.components.table.LargeSelectionCausesNPE?restartApplication</td>
+       <td></td>
+</tr>
+<tr>
+       <td>mouseClick</td>
+       <td>8519-2</td>
+       <td>92,9</td>
+</tr>
+<tr>
+       <td>scroll</td>
+       <td>vaadin=runcomvaadintestscomponentstableLargeSelectionCausesNPE::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]/domChild[1]</td>
+       <td>5257</td>
+</tr>
+<tr>
+       <td>waitForElementPresent</td>
+       <td>8519-262</td>
+       <td></td>
+</tr>
+<tr>
+       <td>mouseClick</td>
+       <td>8519-262</td>
+       <td>61,-5248:shift</td>
+</tr>
+<tr>
+       <td>scroll</td>
+       <td>vaadin=runcomvaadintestscomponentstableLargeSelectionCausesNPE::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]/domChild[1]</td>
+       <td>0</td>
+</tr>
+<tr>
+       <td>waitForElementPresent</td>
+       <td>8519-0</td>
+       <td></td>
+</tr>
+<tr>
+       <td>mouseClick</td>
+       <td>8519-button</td>
+       <td>23,10</td>
+</tr>
+<tr>
+       <td>assertText</td>
+       <td>8519-0</td>
+       <td>0-version2</td>
+</tr>
+<tr>
+       <td>mouseClick</td>
+       <td>8519-button</td>
+       <td></td>
+</tr>
+<tr>
+       <td>assertText</td>
+       <td>8519-0</td>
+       <td>0</td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
diff --git a/uitest/src/com/vaadin/tests/components/table/LargeSelectionCausesNPE.java b/uitest/src/com/vaadin/tests/components/table/LargeSelectionCausesNPE.java
new file mode 100644 (file)
index 0000000..fb782b8
--- /dev/null
@@ -0,0 +1,166 @@
+package com.vaadin.tests.components.table;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import com.vaadin.annotations.AutoGenerated;
+import com.vaadin.data.Item;
+import com.vaadin.data.Property;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.util.IndexedContainer;
+import com.vaadin.shared.ui.MarginInfo;
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.Table.Align;
+import com.vaadin.ui.Table.ColumnGenerator;
+import com.vaadin.ui.VerticalLayout;
+
+public class LargeSelectionCausesNPE extends TestBase {
+
+    @AutoGenerated
+    private Table table;
+
+    private static final String ID = "id";
+    private static final String NAME = "name";
+    private static final String CODE = "code";
+
+    @Override
+    protected void setup() {
+        addComponent(new SelectionExample());
+    }
+
+    @Override
+    protected String getDescription() {
+        return "Attempting to update table contents while selection reaches beyond cache limits causes a NPE.<br>"
+                + " Select a large amount of rows, e.g. from name2 to name262, return to the top of the table,"
+                + " then try to update the first item twice.<br>"
+                + " Test is broken if the original values don't reappear on the second click of the button.";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 8519;
+    }
+
+    public class SelectionExample extends VerticalLayout {
+
+        Table table = new Table();
+        Button button = new Button("Update the first item");
+        Label nameLabel = new Label();
+
+        HashSet<Object> markedRows = new HashSet<Object>();
+        Label selected = new Label();
+
+        public SelectionExample() {
+            addComponent(table);
+            addComponent(button);
+            setMargin(new MarginInfo(true, false, false, false));
+
+            // Label to indicate current selection
+            selected.setValue("No selection");
+            addComponent(selected);
+
+            // set a style name, so we can style rows and cells
+            table.setStyleName("iso3166");
+
+            // size
+            table.setWidth("100%");
+            table.setPageLength(5);
+
+            // selectable
+            table.setSelectable(true);
+            table.setMultiSelect(true);
+            table.setImmediate(true);
+
+            // connect data source
+            table.setContainerDataSource(getContainer());
+
+            table.addGeneratedColumn(CODE, columnGenerator);
+
+            // turn on column reordering and collapsing
+            table.setColumnReorderingAllowed(true);
+            table.setColumnCollapsingAllowed(true);
+
+            // set column headers
+            table.setVisibleColumns(new String[] { CODE, NAME, ID });
+            table.setColumnHeaders(new String[] { "DummyCode", "DummyName",
+                    "DummyId" });
+
+            // Column alignment
+            table.setColumnAlignment(ID, Align.CENTER);
+
+            // Column width
+            table.setColumnWidth(CODE, 70);
+            table.setColumnExpandRatio(NAME, 1);
+            table.setColumnWidth(ID, 70);
+
+            // listen for valueChange, a.k.a 'select' and update the label
+            table.addValueChangeListener(valueChangeListener);
+
+            button.setId(getTicketNumber() + "-button");
+            button.addClickListener(clickListener);
+        }
+
+        Table.ValueChangeListener valueChangeListener = new Table.ValueChangeListener() {
+            public void valueChange(ValueChangeEvent event) {
+                // in multiselect mode, a Set of itemIds is returned,
+                // in singleselect mode the itemId is returned directly
+                Set<?> value = (Set<?>) event.getProperty().getValue();
+                if (null == value || value.size() == 0) {
+                    selected.setValue("No selection");
+                } else {
+                    selected.setValue("Selected: " + table.getValue());
+                }
+            }
+        };
+
+        Button.ClickListener clickListener = new Button.ClickListener() {
+
+            public void buttonClick(ClickEvent event) {
+                Property nameProperty = table.getContainerProperty(0, NAME);
+                if (("0").equals(nameLabel.getValue())) {
+                    nameProperty.setValue(NAME + "0-version2");
+                    nameLabel.setValue("0-version2");
+                } else {
+                    nameProperty.setValue(NAME + 0);
+                    nameLabel.setValue("0");
+                }
+            }
+        };
+
+        public IndexedContainer getContainer() {
+            IndexedContainer container = new IndexedContainer();
+            container.addContainerProperty(NAME, String.class, null);
+            container.addContainerProperty(ID, Integer.class, null);
+            for (int i = 0; i < 264; i++) {
+                String name = NAME + i;
+                int id = i;
+                Item item = container.addItem(id);
+                item.getItemProperty(NAME).setValue(name);
+                item.getItemProperty(ID).setValue(id);
+            }
+            container.sort(new Object[] { ID }, new boolean[] { true });
+            return container;
+        }
+
+        ColumnGenerator columnGenerator = new ColumnGenerator() {
+
+            public Object generateCell(Table source, Object itemId,
+                    Object columnId) {
+                Label label = new Label();
+                label.setSizeUndefined();
+                label.setValue(itemId.toString());
+                label.setId(getTicketNumber() + "-" + itemId);
+                if (0 == (Integer) itemId) {
+                    nameLabel = label;
+                }
+                return label;
+            }
+
+        };
+    }
+
+}