From 9ae362f90c8217e9f4b0a3013e0a8840dd5db8bf Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 19 May 2015 19:47:43 +0300 Subject: [PATCH] Return components in merged header/footer cells only once (#17904) Change-Id: Icff97b27455f3df4b07faeca3d338e7f3ba5656f --- server/src/com/vaadin/ui/Grid.java | 4 +- .../server/component/grid/GridChildren.java | 59 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 server/tests/src/com/vaadin/tests/server/component/grid/GridChildren.java diff --git a/server/src/com/vaadin/ui/Grid.java b/server/src/com/vaadin/ui/Grid.java index b167d08010..cae72c85f7 100644 --- a/server/src/com/vaadin/ui/Grid.java +++ b/server/src/com/vaadin/ui/Grid.java @@ -4571,7 +4571,9 @@ public class Grid extends AbstractComponent implements SelectionNotifier, @Override public Iterator iterator() { - List componentList = new ArrayList(); + // This is a hash set to avoid adding header/footer components inside + // merged cells multiple times + LinkedHashSet componentList = new LinkedHashSet(); Header header = getHeader(); for (int i = 0; i < header.getRowCount(); ++i) { diff --git a/server/tests/src/com/vaadin/tests/server/component/grid/GridChildren.java b/server/tests/src/com/vaadin/tests/server/component/grid/GridChildren.java new file mode 100644 index 0000000000..7af1cfef69 --- /dev/null +++ b/server/tests/src/com/vaadin/tests/server/component/grid/GridChildren.java @@ -0,0 +1,59 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.server.component.grid; + +import java.util.Iterator; + +import org.junit.Assert; +import org.junit.Test; + +import com.vaadin.ui.Component; +import com.vaadin.ui.Grid; +import com.vaadin.ui.Grid.FooterCell; +import com.vaadin.ui.Grid.HeaderCell; +import com.vaadin.ui.Label; + +public class GridChildren { + + @Test + public void componentsInMergedHeader() { + Grid grid = new Grid(); + grid.addColumn("foo"); + grid.addColumn("bar"); + grid.addColumn("baz"); + HeaderCell merged = grid.getDefaultHeaderRow() + .join("foo", "bar", "baz"); + Label label = new Label(); + merged.setComponent(label); + Iterator i = grid.iterator(); + Assert.assertEquals(label, i.next()); + Assert.assertFalse(i.hasNext()); + } + + @Test + public void componentsInMergedFooter() { + Grid grid = new Grid(); + grid.addColumn("foo"); + grid.addColumn("bar"); + grid.addColumn("baz"); + FooterCell merged = grid.addFooterRowAt(0).join("foo", "bar", "baz"); + Label label = new Label(); + merged.setComponent(label); + Iterator i = grid.iterator(); + Assert.assertEquals(label, i.next()); + Assert.assertFalse(i.hasNext()); + } +} -- 2.39.5