From: Henri Sara Date: Tue, 29 Nov 2011 12:57:06 +0000 (+0000) Subject: Merge changes from 6.7 to 6.8 X-Git-Tag: 7.0.0.alpha1~225^2~5 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=5b69d1b9e15182071cf872ba55166cd75965dbe5;p=vaadin-framework.git Merge changes from 6.7 to 6.8 svn changeset:22173/svn branch:6.8 --- diff --git a/build/build.xml b/build/build.xml index a94fa143ac..e7f25afde3 100644 --- a/build/build.xml +++ b/build/build.xml @@ -6,7 +6,7 @@ basedir="../" default="package-all"> - + diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index b95d738157..cd07465d07 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -2712,7 +2712,7 @@ public class Table extends AbstractSelect implements Action.Container, rowCacheInvalidated = invalidated; } - private boolean isRowCacheInvalidated() { + protected boolean isRowCacheInvalidated() { return rowCacheInvalidated; } @@ -3816,8 +3816,12 @@ public class Table extends AbstractSelect implements Action.Container, final LinkedList visible = new LinkedList(); final Object[][] cells = getVisibleCells(); - for (int i = 0; i < cells[CELL_ITEMID].length; i++) { - visible.add(cells[CELL_ITEMID][i]); + // may be null if the table has not been rendered yet (e.g. not attached + // to a layout) + if (null != cells) { + for (int i = 0; i < cells[CELL_ITEMID].length; i++) { + visible.add(cells[CELL_ITEMID][i]); + } } return visible; diff --git a/src/com/vaadin/ui/TreeTable.java b/src/com/vaadin/ui/TreeTable.java index fb12ffe323..171ee616e1 100644 --- a/src/com/vaadin/ui/TreeTable.java +++ b/src/com/vaadin/ui/TreeTable.java @@ -385,7 +385,7 @@ public class TreeTable extends Table implements Hierarchical { String object = (String) variables.get("toggleCollapsed"); Object itemId = itemIdMapper.get(object); toggledItemId = itemId; - toggleChildVisibility(itemId); + toggleChildVisibility(itemId, false); if (variables.containsKey("selectCollapsed")) { // ensure collapsed is selected unless opened with selection // head @@ -470,7 +470,8 @@ public class TreeTable extends Table implements Hierarchical { @Override protected boolean isPartialRowUpdate() { - return toggledItemId != null && containerSupportsPartialUpdates; + return toggledItemId != null && containerSupportsPartialUpdates + && !isRowCacheInvalidated(); } @Override @@ -516,7 +517,7 @@ public class TreeTable extends Table implements Hierarchical { return !getContainerStrategy().isNodeOpen(toggledItemId); } - private void toggleChildVisibility(Object itemId) { + private void toggleChildVisibility(Object itemId, boolean forceFullRefresh) { getContainerStrategy().toggleChildVisibility(itemId); // ensure that page still has first item in page, DON'T clear the // caches. @@ -528,7 +529,7 @@ public class TreeTable extends Table implements Hierarchical { fireExpandEvent(itemId); } - if (containerSupportsPartialUpdates) { + if (containerSupportsPartialUpdates && !forceFullRefresh) { requestRepaint(); } else { // For containers that do not send item set change events, always do @@ -646,8 +647,8 @@ public class TreeTable extends Table implements Hierarchical { } /** - * Sets the Item specified by given identifier collapsed or expanded. If the - * Item is collapsed, its children is not displayed in for the user. + * Sets the Item specified by given identifier as collapsed or expanded. If + * the Item is collapsed, its children are not displayed to the user. * * @param itemId * the identifier of the Item @@ -656,7 +657,18 @@ public class TreeTable extends Table implements Hierarchical { */ public void setCollapsed(Object itemId, boolean collapsed) { if (isCollapsed(itemId) != collapsed) { - toggleChildVisibility(itemId); + if (null == toggledItemId && !isRowCacheInvalidated() + && getVisibleItemIds().contains(itemId)) { + // optimization: partial refresh if only one item is + // collapsed/expanded + toggledItemId = itemId; + toggleChildVisibility(itemId, false); + } else { + // make sure a full refresh takes place - otherwise neither + // partial nor full repaint of table content is performed + toggledItemId = null; + toggleChildVisibility(itemId, true); + } } } diff --git a/tests/testbench/com/vaadin/tests/components/treetable/ProgrammaticCollapse.html b/tests/testbench/com/vaadin/tests/components/treetable/ProgrammaticCollapse.html new file mode 100644 index 0000000000..44dd858378 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/treetable/ProgrammaticCollapse.html @@ -0,0 +1,112 @@ + + + + + + +ProgrammaticCollapse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProgrammaticCollapse
open/run/com.vaadin.tests.components.treetable.ProgrammaticCollapse?restartApplication
clickvaadin=runcomvaadintestscomponentstreetableProgrammaticCollapse::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]
screenCaptureexpanded
closeNotification//body/div[2]0,0
clickvaadin=runcomvaadintestscomponentstreetableProgrammaticCollapse::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]
screenCapturecollapsed
closeNotification//body/div[2]0,0
clickvaadin=runcomvaadintestscomponentstreetableProgrammaticCollapse::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]
closeNotification//body/div[2]0,0
screenCapturelastexpanded
clickvaadin=runcomvaadintestscomponentstreetableProgrammaticCollapse::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]
closeNotification//body/div[2]0,0
screenCapturelastcollapsed
clickvaadin=runcomvaadintestscomponentstreetableProgrammaticCollapse::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]
closeNotification//body/div[2]0,0
screenCapturemanyexpanded
clickvaadin=runcomvaadintestscomponentstreetableProgrammaticCollapse::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]
closeNotification//body/div[2]0,0
screenCapturemanycollapsed
+ + diff --git a/tests/testbench/com/vaadin/tests/components/treetable/ProgrammaticCollapse.java b/tests/testbench/com/vaadin/tests/components/treetable/ProgrammaticCollapse.java new file mode 100644 index 0000000000..6f2e507ce3 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/treetable/ProgrammaticCollapse.java @@ -0,0 +1,74 @@ +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.Button.ClickListener; +import com.vaadin.ui.TreeTable; +import com.vaadin.ui.VerticalLayout; + +public class ProgrammaticCollapse extends TestBase { + + @Override + protected void setup() { + VerticalLayout layout = new VerticalLayout(); + final TreeTable table = new TreeTable(); + table.setPageLength(10); + table.addContainerProperty("A", String.class, null); + table.addContainerProperty("B", String.class, null); + for (int i = 1; i <= 100; ++i) { + int parentid = i; + table.addItem(new Object[] { "A" + i, "B" + i }, parentid); + for (int j = 1; j < 5; ++j) { + int id = 1000 * i + j; + table.addItem(new Object[] { "A" + i + "." + j, + "B" + i + "." + j }, id); + table.setParent(id, parentid); + } + } + layout.addComponent(table); + layout.addComponent(new Button("Expand / Collapse", + new ClickListener() { + public void buttonClick(ClickEvent event) { + boolean collapsed = !table.isCollapsed(1); + table.getWindow().showNotification( + "set collapsed: " + collapsed); + table.setCollapsed(1, collapsed); + } + })); + layout.addComponent(new Button("Expand / Collapse last", + new ClickListener() { + public void buttonClick(ClickEvent event) { + boolean collapsed = !table.isCollapsed(100); + table.getWindow().showNotification( + "set collapsed: " + collapsed); + table.setCollapsed(100, collapsed); + } + })); + layout.addComponent(new Button("Expand / Collapse multiple", + new ClickListener() { + private boolean collapsed = true; + + public void buttonClick(ClickEvent event) { + collapsed = !collapsed; + table.getWindow().showNotification( + "set collapsed: " + collapsed); + for (int i = 0; i < 50; ++i) { + table.setCollapsed(i * 2, collapsed); + } + } + })); + addComponent(layout); + } + + @Override + protected String getDescription() { + return "Using setCollapsed(...) after the treetable has been rendered should update the UI"; + } + + @Override + protected Integer getTicketNumber() { + return 7988; + } + +} diff --git a/tests/testbench/com/vaadin/tests/components/treetable/TreeTableModifyAndSetCollapsed.java b/tests/testbench/com/vaadin/tests/components/treetable/TreeTableModifyAndSetCollapsed.java new file mode 100644 index 0000000000..336ffb5a52 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/treetable/TreeTableModifyAndSetCollapsed.java @@ -0,0 +1,57 @@ +package com.vaadin.tests.components.treetable; + +import com.vaadin.data.Item; +import com.vaadin.data.util.HierarchicalContainer; +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.TreeTable; + +public class TreeTableModifyAndSetCollapsed extends TestBase { + + int counter = 1; + + @Override + protected void setup() { + final HierarchicalContainer container = new HierarchicalContainer(); + container.addContainerProperty("value", String.class, ""); + + final TreeTable tt = new TreeTable(null, container); + tt.setSizeFull(); + int parentId = counter++; + Item parent = container.addItem(parentId); + tt.setCollapsed(parentId, false); + parent.getItemProperty("value").setValue("parent " + (counter++) + ""); + addComponent(tt); + Button repopulate = new Button("Repopulate", new ClickListener() { + + public void buttonClick(ClickEvent event) { + // repopulate the container and expand root item + container.removeAllItems(); + int parentId = counter++; + Item parent = container.addItem(parentId); + tt.setCollapsed(parentId, false); + parent.getItemProperty("value").setValue( + "parent " + (counter++) + ""); + for (int i = 0; i < 4; i++) { + int childId = counter++; + Item child = container.addItem(childId); + child.getItemProperty("value").setValue(childId + ""); + container.setParent(childId, parentId); + } + } + }); + addComponent(repopulate); + } + + @Override + protected String getDescription() { + return "Modifying a container and using setCollapsed on the same server round-trip should not cause any problems"; + } + + @Override + protected Integer getTicketNumber() { + return Integer.valueOf(7785); + } +}