From 8993a9d1e6fc7ed7045961d95a0ce4d1a462af71 Mon Sep 17 00:00:00 2001 From: Jonatan Kronqvist Date: Fri, 16 Sep 2011 07:22:06 +0000 Subject: [PATCH] Fix for out of sync problem in generated columns in tree table #7620 svn changeset:21070/svn branch:6.7 --- src/com/vaadin/ui/Table.java | 8 +-- src/com/vaadin/ui/TreeTable.java | 6 +-- .../treetable/TreeTableOutOfSync.html | 37 +++++++++++++ .../treetable/TreeTableOutOfSync.java | 53 +++++++++++++++++++ 4 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 tests/src/com/vaadin/tests/components/treetable/TreeTableOutOfSync.html create mode 100644 tests/src/com/vaadin/tests/components/treetable/TreeTableOutOfSync.java diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index 80c6b5820f..5c985d91b7 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -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]; diff --git a/src/com/vaadin/ui/TreeTable.java b/src/com/vaadin/ui/TreeTable.java index 7971d292bc..42c56bac6e 100644 --- a/src/com/vaadin/ui/TreeTable.java +++ b/src/com/vaadin/ui/TreeTable.java @@ -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 index 0000000000..b8d6cdb22e --- /dev/null +++ b/tests/src/com/vaadin/tests/components/treetable/TreeTableOutOfSync.html @@ -0,0 +1,37 @@ + + + + + + +TreeTableOutOfSync + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TreeTableOutOfSync
open/run/com.vaadin.tests.components.treetable.TreeTableOutOfSync?restartApplication
mouseClickvaadin=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]10,7
clickvaadin=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]
verifyTextNotPresentSomething has caused us to be out of sync with the server.
Take note of any unsaved data, and click here to re-sync.
+ + 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 index 0000000000..09b42cce31 --- /dev/null +++ b/tests/src/com/vaadin/tests/components/treetable/TreeTableOutOfSync.java @@ -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; + } +} -- 2.39.5