From 53c2e014976d8b45b4633e6d3f1d54a2147048a2 Mon Sep 17 00:00:00 2001 From: Anna Koskinen Date: Mon, 17 Dec 2012 12:19:31 +0200 Subject: Added method setContainerDataSource(Container newDataSource, Collection visibleIds) to Table. (#10419) Change-Id: Ib10f430c786b1d0130f86eb5a97e271ac71e806f --- server/src/com/vaadin/ui/Table.java | 68 ++++++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 9 deletions(-) (limited to 'server') 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()); -- cgit v1.2.3