]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix for out of sync problem in generated columns in tree table #7620
authorJonatan Kronqvist <jonatan.kronqvist@itmill.com>
Fri, 16 Sep 2011 07:22:06 +0000 (07:22 +0000)
committerJonatan Kronqvist <jonatan.kronqvist@itmill.com>
Fri, 16 Sep 2011 07:22:06 +0000 (07:22 +0000)
svn changeset:21070/svn branch:6.7

src/com/vaadin/ui/Table.java
src/com/vaadin/ui/TreeTable.java
tests/src/com/vaadin/tests/components/treetable/TreeTableOutOfSync.html [new file with mode: 0644]
tests/src/com/vaadin/tests/components/treetable/TreeTableOutOfSync.java [new file with mode: 0644]

index 80c6b5820fdceceaaf2487b21cf7800dfacdc09c..5c985d91b72d6aae09258c2ae8ee56796a9ed353 100644 (file)
@@ -1238,8 +1238,7 @@ public class Table extends AbstractSelect implements Action.Container,
         return currentPageFirstItemIndex;
     }
 
-    private void setCurrentPageFirstItemIndex(int newIndex,
-            boolean needsPageBufferReset) {
+    void setCurrentPageFirstItemIndex(int newIndex, boolean needsPageBufferReset) {
 
         if (newIndex < 0) {
             newIndex = 0;
@@ -1572,8 +1571,9 @@ public class Table extends AbstractSelect implements Action.Container,
                         int indexInOldBuffer = index - pageBufferFirstIndex;
                         if (index < firstIndexNotInCache
                                 && index >= pageBufferFirstIndex
-                                && pageBuffer[CELL_GENERATED_ROW][indexInOldBuffer] == null) {
-                            // we have data already in our cache,
+                                && pageBuffer[CELL_GENERATED_ROW][indexInOldBuffer] == null
+                                && pageBuffer[CELL_ITEMID][indexInOldBuffer] == id) {
+                            // we already have data in our cache,
                             // recycle it instead of fetching it via
                             // getValue/getPropertyValue
                             value = pageBuffer[CELL_FIRSTCOL + j][indexInOldBuffer];
index 7971d292bc9ffa3e70d116c877604818de914a34..42c56bac6e9130b6e853b52bca8794794a8d09d4 100644 (file)
@@ -483,9 +483,9 @@ public class TreeTable extends Table implements Hierarchical {
 
     private void toggleChildVisibility(Object itemId) {
         getContainerStrategy().toggleChildVisibility(itemId);
-        // ensure that page still has first item in page, ignore buffer refresh
-        // (forced in this method)
-        setCurrentPageFirstItemIndex(getCurrentPageFirstItemIndex());
+        // ensure that page still has first item in page, DON'T clear the
+        // caches.
+        setCurrentPageFirstItemIndex(getCurrentPageFirstItemIndex(), false);
         toggledItemId = itemId;
         requestRepaint();
 
diff --git a/tests/src/com/vaadin/tests/components/treetable/TreeTableOutOfSync.html b/tests/src/com/vaadin/tests/components/treetable/TreeTableOutOfSync.html
new file mode 100644 (file)
index 0000000..b8d6cdb
--- /dev/null
@@ -0,0 +1,37 @@
+<?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="" />
+<title>TreeTableOutOfSync</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">TreeTableOutOfSync</td></tr>
+</thead><tbody>
+<tr>
+    <td>open</td>
+    <td>/run/com.vaadin.tests.components.treetable.TreeTableOutOfSync?restartApplication</td>
+    <td></td>
+</tr>
+<tr>
+    <td>mouseClick</td>
+    <td>vaadin=runcomvaadintestscomponentstreetableTreeTableOutOfSync::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTreeTable[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]</td>
+    <td>10,7</td>
+</tr>
+<tr>
+    <td>click</td>
+    <td>vaadin=runcomvaadintestscomponentstreetableTreeTableOutOfSync::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTreeTable[0]/FocusableScrollPanel[0]/VTreeTable$VTreeTableScrollBody[0]/VTreeTable$VTreeTableScrollBody$VTreeTableRow[2]/VButton[0]/domChild[0]/domChild[0]</td>
+    <td></td>
+</tr>
+<tr>
+    <td>verifyTextNotPresent</td>
+    <td>Something has caused us to be out of sync with the server.<br />Take note of any unsaved data, and click here to re-sync.</td>
+    <td></td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
diff --git a/tests/src/com/vaadin/tests/components/treetable/TreeTableOutOfSync.java b/tests/src/com/vaadin/tests/components/treetable/TreeTableOutOfSync.java
new file mode 100644 (file)
index 0000000..09b42cc
--- /dev/null
@@ -0,0 +1,53 @@
+/* 
+@ITMillApache2LicenseForJavaFiles@
+ */
+package com.vaadin.tests.components.treetable;
+
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.TreeTable;
+
+public class TreeTableOutOfSync extends TestBase {
+
+    @Override
+    protected void setup() {
+        TreeTable tt = new TreeTable();
+        tt.addContainerProperty("i", Integer.class, null);
+        tt.addGeneratedColumn("text", new Table.ColumnGenerator() {
+            public Object generateCell(Table source, Object itemId,
+                    Object columnId) {
+                if ("text".equals(columnId)) {
+                    Button button = new Button("text "
+                            + source.getContainerDataSource().getItem(itemId)
+                                    .getItemProperty("i").getValue());
+                    button.addListener(new Button.ClickListener() {
+                        public void buttonClick(ClickEvent event) {
+                            getMainWindow().showNotification("click");
+                        }
+                    });
+                    return button;
+                }
+                return null;
+            }
+        });
+
+        Object item1 = tt.addItem(new Object[] { 1 }, null);
+        Object item2 = tt.addItem(new Object[] { 2 }, null);
+        tt.addItem(new Object[] { 3 }, null);
+        tt.setParent(item2, item1);
+
+        addComponent(tt);
+    }
+
+    @Override
+    protected String getDescription() {
+        return "When a root node is expanded, components created by a column generator go out of sync";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 7620;
+    }
+}