package com.vaadin.tests.components.table; 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.VerticalLayout; import com.vaadin.v7.data.Item; import com.vaadin.v7.data.util.IndexedContainer; import com.vaadin.v7.ui.Table; public class ContainerChangeWithPartlySamePropertyIds extends TestBase { @Override protected void setup() { getLayout().addComponent(new TableTestComponent()); } @Override protected String getDescription() { return "The client side Table component messes up its internal " + "data structures (in header and footer) if the container changes and it has partly" + " the same properties (but in different order) than the old container."; } @Override protected Integer getTicketNumber() { return 6281; } public static class TableTestComponent extends VerticalLayout { final TableTestComponent me = this; Table testTable; IndexedContainer containerA; IndexedContainer containerB; String property1 = "property1"; String property2 = "property2"; String property3 = "property3"; String property4 = "property4"; private void createContainers() { containerA = new IndexedContainer(); containerA.addContainerProperty(property1, String.class, ""); containerA.addContainerProperty(property2, String.class, ""); containerA.addContainerProperty(property3, String.class, ""); Item itemA = containerA.addItem(new Object()); itemA.getItemProperty(property1).setValue("value1"); itemA.getItemProperty(property2).setValue("value2"); itemA.getItemProperty(property3).setValue("value3"); containerB = new IndexedContainer(); containerB.addContainerProperty(property4, String.class, ""); containerB.addContainerProperty(property3, String.class, ""); containerB.addContainerProperty(property2, String.class, ""); Item itemB = containerB.addItem(new Object()); itemB.getItemProperty(property4).setValue("value_prop4"); itemB.getItemProperty(property3).setValue("value_prop3"); itemB.getItemProperty(property2).setValue("value_prop2"); } public TableTestComponent() { Button switchContainerButton = new Button("switch container"); switchContainerButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { if (testTable.getContainerDataSource() == containerA) { testTable.setContainerDataSource(containerB); } else { testTable.setContainerDataSource(containerA); } } }); this.addComponent(switchContainerButton); Button clearButton = new Button("clear (click twice)"); clearButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { try { me.removeComponent(testTable); testTable = new Table(); createContainers(); testTable.setContainerDataSource(containerA); me.addComponent(testTable); } catch (Exception e) { e.printStackTrace(); } } }); this.addComponent(clearButton); testTable = new Table(); this.addComponent(testTable); createContainers(); testTable.setContainerDataSource(containerA); } } }