From 53c2e014976d8b45b4633e6d3f1d54a2147048a2 Mon Sep 17 00:00:00 2001 From: Anna Koskinen Date: Mon, 17 Dec 2012 12:19:31 +0200 Subject: [PATCH] Added method setContainerDataSource(Container newDataSource, Collection visibleIds) to Table. (#10419) Change-Id: Ib10f430c786b1d0130f86eb5a97e271ac71e806f --- server/src/com/vaadin/ui/Table.java | 68 ++++++- .../table/SetDataSourceWithPropertyIds.html | 91 +++++++++ .../table/SetDataSourceWithPropertyIds.java | 174 ++++++++++++++++++ 3 files changed, 324 insertions(+), 9 deletions(-) create mode 100644 uitest/src/com/vaadin/tests/components/table/SetDataSourceWithPropertyIds.html create mode 100644 uitest/src/com/vaadin/tests/components/table/SetDataSourceWithPropertyIds.java diff --git a/server/src/com/vaadin/ui/Table.java b/server/src/com/vaadin/ui/Table.java index c0814b8481..65dea7594b 100644 --- a/server/src/com/vaadin/ui/Table.java +++ b/server/src/com/vaadin/ui/Table.java @@ -2070,7 +2070,7 @@ public class Table extends AbstractSelect implements Action.Container, value = generatedRow.getText()[j]; } } else { - // check in current pageBuffer already has row + // check if current pageBuffer already has row int index = firstIndex + i; if (p != null || isGenerated) { int indexInOldBuffer = index - pageBufferFirstIndex; @@ -2395,14 +2395,69 @@ public class Table extends AbstractSelect implements Action.Container, refreshRenderedCells(); } + /** + * Sets the Container that serves as the data source of the viewer. As a + * side-effect the table's selection value is set to null as the old + * selection might not exist in new Container.
+ *
+ * All rows and columns are generated as visible using this method. If the + * new container contains properties that are not meant to be shown you + * should use {@link Table#setContainerDataSource(Container, Collection)} + * instead, especially if the table is editable. + * + * @param newDataSource + * the new data source. + */ @Override public void setContainerDataSource(Container newDataSource) { + if (newDataSource == null) { + newDataSource = new IndexedContainer(); + } + Collection generated; + if (columnGenerators != null) { + generated = columnGenerators.keySet(); + } else { + generated = Collections.emptyList(); + } + List visibleIds = new ArrayList(); + if (generated.isEmpty()) { + visibleIds.addAll(newDataSource.getContainerPropertyIds()); + } else { + for (Object id : newDataSource.getContainerPropertyIds()) { + // don't add duplicates + if (!generated.contains(id)) { + visibleIds.add(id); + } + } + // generated columns to the end + visibleIds.addAll(generated); + } + setContainerDataSource(newDataSource, visibleIds); + } + + /** + * Sets the container data source and the columns that will be visible. + * Columns are shown in the collection's iteration order. + * + * @see Table#setContainerDataSource(Container) + * @see Table#setVisibleColumns(Object[]) + * + * @param newDataSource + * the new data source. + * @param visibleIds + * IDs of the visible columns + */ + public void setContainerDataSource(Container newDataSource, + Collection visibleIds) { disableContentRefreshing(); if (newDataSource == null) { newDataSource = new IndexedContainer(); } + if (visibleIds == null) { + visibleIds = new ArrayList(); + } // Assures that the data source is ordered by making unordered // containers ordered by wrapping them @@ -2422,19 +2477,14 @@ public class Table extends AbstractSelect implements Action.Container, collapsedColumns.clear(); } - // columnGenerators 'override' properties, don't add the same id twice + // don't add the same id twice Collection col = new LinkedList(); - for (Iterator it = getContainerPropertyIds().iterator(); it - .hasNext();) { + for (Iterator it = visibleIds.iterator(); it.hasNext();) { Object id = it.next(); - if (columnGenerators == null || !columnGenerators.containsKey(id)) { + if (!col.contains(id)) { col.add(id); } } - // generators added last - if (columnGenerators != null && columnGenerators.size() > 0) { - col.addAll(columnGenerators.keySet()); - } setVisibleColumns(col.toArray()); diff --git a/uitest/src/com/vaadin/tests/components/table/SetDataSourceWithPropertyIds.html b/uitest/src/com/vaadin/tests/components/table/SetDataSourceWithPropertyIds.html new file mode 100644 index 0000000000..67964d9fb2 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/table/SetDataSourceWithPropertyIds.html @@ -0,0 +1,91 @@ + + + + + + +SetDataSourceWithPropertyIds + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SetDataSourceWithPropertyIds
open/run/com.vaadin.tests.components.table.SetDataSourceWithPropertyIds?restartApplication
assertTextlabelno ConversionException
assertElementPresentvaadin=runcomvaadintestscomponentstableSetDataSourceWithPropertyIds::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[0]/VTextField[0]
clickvaadin=runcomvaadintestscomponentstableSetDataSourceWithPropertyIds::PID_Sbutton/domChild[0]/domChild[0]
assertTextlabelno ConversionException
assertElementNotPresentvaadin=runcomvaadintestscomponentstableSetDataSourceWithPropertyIds::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[0]/VTextField[0]
clickvaadin=runcomvaadintestscomponentstableSetDataSourceWithPropertyIds::PID_Sbutton/domChild[0]/domChild[0]
assertTextlabelConversionException caught
assertElementPresentvaadin=runcomvaadintestscomponentstableSetDataSourceWithPropertyIds::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[0]/VTextField[0]
clickvaadin=runcomvaadintestscomponentstableSetDataSourceWithPropertyIds::PID_Sbutton/domChild[0]/domChild[0]
assertTextlabelno ConversionException
assertElementNotPresentvaadin=runcomvaadintestscomponentstableSetDataSourceWithPropertyIds::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[0]/VTextField[0]
clickvaadin=runcomvaadintestscomponentstableSetDataSourceWithPropertyIds::PID_Sbutton/domChild[0]/domChild[0]
assertTextlabelConversionException caught
assertElementPresentvaadin=runcomvaadintestscomponentstableSetDataSourceWithPropertyIds::PID_Stable/FocusableScrollPanel[0]/VScrollTable$VScrollTableBody[0]/VScrollTable$VScrollTableBody$VScrollTableRow[0]/VTextField[0]
+ + diff --git a/uitest/src/com/vaadin/tests/components/table/SetDataSourceWithPropertyIds.java b/uitest/src/com/vaadin/tests/components/table/SetDataSourceWithPropertyIds.java new file mode 100644 index 0000000000..dbdd810440 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/table/SetDataSourceWithPropertyIds.java @@ -0,0 +1,174 @@ +package com.vaadin.tests.components.table; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.data.util.converter.Converter.ConversionException; +import com.vaadin.server.VaadinRequest; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Button; +import com.vaadin.ui.Label; +import com.vaadin.ui.Table; + +public class SetDataSourceWithPropertyIds extends AbstractTestUI { + + @Override + protected String getTestDescription() { + return "It should be possible to set a dataSource without generating columns that were never intended to be visible.
" + + "First initialization happens before the table is attached."; + } + + @Override + protected Integer getTicketNumber() { + return 10419; + } + + private static final String TABLE_NAME = "JOBS"; + private static final String[] PK_COLUMN_NAMES = new String[] { "JOB_ID" }; + private static final String SEQUENCE_NAME = ""; + private static final String VERSION_COLUMN_NAME = ""; + + Table table = new Table(); + BeanItemContainer jobContainer = new BeanItemContainer( + JobsBean.class); + Label label = new Label(); + + @Override + protected void setup(VaadinRequest request) { + getLayout().setSpacing(true); + getLayout().setMargin(new MarginInfo(true, false, false, false)); + + Button button = new Button("Toggle editability"); + button.setId("button"); + button.addClickListener(new Button.ClickListener() { + @Override + public void buttonClick(Button.ClickEvent clickEvent) { + refreshTable(); + } + }); + + label.setSizeUndefined(); + label.setId("label"); + + table.setId("table"); + refreshTable(); + + addComponent(button); + addComponent(label); + addComponent(table); + } + + private void refreshTable() { + // error only occurs when table is editable and already attached + table.setEditable(table.getParent() == null || !table.isEditable()); + + jobContainer.removeAllItems(); + jobContainer.addAll(getBeanList()); + try { + table.setContainerDataSource(jobContainer); + table.setVisibleColumns(new String[] { "jobId" }); + label.setValue("no ConversionException"); + } catch (ConversionException e) { + ArrayList propertyIds = new ArrayList(); + propertyIds.add("jobId"); + table.setContainerDataSource(jobContainer, propertyIds); + label.setValue("ConversionException caught"); + } + } + + private List getBeanList() { + + List list = new ArrayList(); + JobsBean jobsBean = new JobsBean(); + jobsBean.setJobId("1"); + list.add(jobsBean); + return list; + } + + public class JobsBean implements Serializable { + + private static final long serialVersionUID = 1932918476339138393L; + protected String jobId; + protected String jobTitle; + protected Long minSalary; + protected Long maxSalary; + private T auxiliaryData; + + public T getAuxiliaryData() { + return auxiliaryData; + } + + public void setAuxiliaryData(final T pAuxiliaryData) { + auxiliaryData = pAuxiliaryData; + } + + public String getTableName() { + return TABLE_NAME; + } + + public String[] getPrimaryKeyColumnNames() { + return PK_COLUMN_NAMES; + } + + public String getSequenceName() { + return SEQUENCE_NAME; + } + + public String getVersionColumnName() { + return VERSION_COLUMN_NAME; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(final String pJobId) { + jobId = pJobId; + } + + public String getJobTitle() { + return jobTitle; + } + + public void setJobTitle(final String pJobTitle) { + jobTitle = pJobTitle; + } + + public Long getMinSalary() { + return minSalary; + } + + public void setMinSalary(final Long pMinSalary) { + minSalary = pMinSalary; + } + + public Long getMaxSalary() { + return maxSalary; + } + + public void setMaxSalary(final Long pMaxSalary) { + maxSalary = pMaxSalary; + } + + @Override + public boolean equals(Object pObject) { + if (this == pObject) { + return true; + } + if (!(pObject instanceof JobsBean)) { + return false; + } + JobsBean other = (JobsBean) pObject; + return getJobId().equals(other.getJobId()); + } + + @Override + public int hashCode() { + return getJobId().hashCode(); + } + } + +} -- 2.39.5