From d1282e8734bccf78250554665a13dfffcc14deb7 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 8 Mar 2017 16:34:03 +0200 Subject: Include components in joined cells when finding child components (#8772) Fixes #8722 --- .../server/component/grid/GridChildrenTest.java | 106 --------------------- server/src/main/java/com/vaadin/ui/Grid.java | 20 ++-- .../com/vaadin/ui/components/grid/FooterRow.java | 12 +++ .../com/vaadin/ui/components/grid/HeaderRow.java | 11 +++ .../vaadin/ui/components/grid/StaticSection.java | 21 +++- .../server/component/grid/GridChildrenTest.java | 86 +++++++++++++++++ 6 files changed, 134 insertions(+), 122 deletions(-) delete mode 100644 compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/grid/GridChildrenTest.java create mode 100644 server/src/test/java/com/vaadin/tests/server/component/grid/GridChildrenTest.java diff --git a/compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/grid/GridChildrenTest.java b/compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/grid/GridChildrenTest.java deleted file mode 100644 index 2d8edddac1..0000000000 --- a/compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/grid/GridChildrenTest.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2000-2016 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.v7.tests.server.component.grid; - -import java.util.Iterator; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.vaadin.ui.Component; -import com.vaadin.ui.Label; -import com.vaadin.v7.ui.Grid; -import com.vaadin.v7.ui.Grid.FooterCell; -import com.vaadin.v7.ui.Grid.HeaderCell; - -public class GridChildrenTest { - - private Grid grid; - - @Before - public void createGrid() { - grid = new Grid(); - grid.addColumn("foo"); - grid.addColumn("bar"); - grid.addColumn("baz"); - - } - - @Test - public void iteratorFindsComponentsInMergedHeader() { - 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 removeComponentInMergedHeaderCell() { - HeaderCell merged = grid.getDefaultHeaderRow().join("foo", "bar", - "baz"); - Label label = new Label(); - merged.setComponent(label); - Assert.assertEquals(grid, label.getParent()); - merged.setText("foo"); - Assert.assertNull(label.getParent()); - } - - @Test - public void removeHeaderWithComponentInMergedHeaderCell() { - HeaderCell merged = grid.getDefaultHeaderRow().join("foo", "bar", - "baz"); - Label label = new Label(); - merged.setComponent(label); - Assert.assertEquals(grid, label.getParent()); - grid.removeHeaderRow(0); - Assert.assertNull(label.getParent()); - } - - @Test - public void removeComponentInMergedFooterCell() { - FooterCell merged = grid.addFooterRowAt(0).join("foo", "bar", "baz"); - Label label = new Label(); - merged.setComponent(label); - Assert.assertEquals(grid, label.getParent()); - merged.setText("foo"); - Assert.assertNull(label.getParent()); - } - - @Test - public void removeFooterWithComponentInMergedFooterCell() { - FooterCell merged = grid.addFooterRowAt(0).join("foo", "bar", "baz"); - Label label = new Label(); - merged.setComponent(label); - Assert.assertEquals(grid, label.getParent()); - grid.removeFooterRow(0); - Assert.assertNull(label.getParent()); - } - - @Test - public void componentsInMergedFooter() { - 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()); - Assert.assertEquals(grid, label.getParent()); - } -} diff --git a/server/src/main/java/com/vaadin/ui/Grid.java b/server/src/main/java/com/vaadin/ui/Grid.java index ed74b4c664..5d03825c6f 100644 --- a/server/src/main/java/com/vaadin/ui/Grid.java +++ b/server/src/main/java/com/vaadin/ui/Grid.java @@ -97,7 +97,6 @@ import com.vaadin.ui.components.grid.DetailsGenerator; import com.vaadin.ui.components.grid.Editor; import com.vaadin.ui.components.grid.EditorImpl; import com.vaadin.ui.components.grid.Footer; -import com.vaadin.ui.components.grid.FooterCell; import com.vaadin.ui.components.grid.FooterRow; import com.vaadin.ui.components.grid.GridSelectionModel; import com.vaadin.ui.components.grid.Header; @@ -2406,28 +2405,23 @@ public class Grid extends AbstractListing implements HasComponents, return column; } + /** + * {@inheritDoc} + *

+ * Note that the order of the returned components it not specified. + */ @Override public Iterator iterator() { Set componentSet = new LinkedHashSet<>(extensionComponents); Header header = getHeader(); for (int i = 0; i < header.getRowCount(); ++i) { HeaderRow row = header.getRow(i); - getColumns().forEach(column -> { - HeaderCell cell = row.getCell(column); - if (cell.getCellType() == GridStaticCellType.WIDGET) { - componentSet.add(cell.getComponent()); - } - }); + componentSet.addAll(row.getComponents()); } Footer footer = getFooter(); for (int i = 0; i < footer.getRowCount(); ++i) { FooterRow row = footer.getRow(i); - getColumns().forEach(column -> { - FooterCell cell = row.getCell(column); - if (cell.getCellType() == GridStaticCellType.WIDGET) { - componentSet.add(cell.getComponent()); - } - }); + componentSet.addAll(row.getComponents()); } return Collections.unmodifiableSet(componentSet).iterator(); } diff --git a/server/src/main/java/com/vaadin/ui/components/grid/FooterRow.java b/server/src/main/java/com/vaadin/ui/components/grid/FooterRow.java index 42e4650471..9a3c1aadb2 100644 --- a/server/src/main/java/com/vaadin/ui/components/grid/FooterRow.java +++ b/server/src/main/java/com/vaadin/ui/components/grid/FooterRow.java @@ -16,8 +16,10 @@ package com.vaadin.ui.components.grid; import java.io.Serializable; +import java.util.Collection; import java.util.Set; +import com.vaadin.ui.Component; import com.vaadin.ui.Grid; import com.vaadin.ui.Grid.Column; @@ -130,4 +132,14 @@ public interface FooterRow extends Serializable { * the style name to set or null to not use any style name */ public void setStyleName(String styleName); + + /** + * Gets a collection of all components inside this row. + *

+ * The order of the components in the returned collection is not specified. + * + * @return a collection of components in the row + */ + public Collection getComponents(); + } diff --git a/server/src/main/java/com/vaadin/ui/components/grid/HeaderRow.java b/server/src/main/java/com/vaadin/ui/components/grid/HeaderRow.java index f11843e147..d6c740e720 100644 --- a/server/src/main/java/com/vaadin/ui/components/grid/HeaderRow.java +++ b/server/src/main/java/com/vaadin/ui/components/grid/HeaderRow.java @@ -16,8 +16,10 @@ package com.vaadin.ui.components.grid; import java.io.Serializable; +import java.util.Collection; import java.util.Set; +import com.vaadin.ui.Component; import com.vaadin.ui.Grid; import com.vaadin.ui.Grid.Column; @@ -130,4 +132,13 @@ public interface HeaderRow extends Serializable { * the style name to set or null to not use any style name */ public void setStyleName(String styleName); + + /** + * Gets a collection of all components inside this row. + *

+ * The order of the components in the returned collection is not specified. + * + * @return a collection of components in the row + */ + public Collection getComponents(); } diff --git a/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java b/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java index c53cc9c976..840fa7b115 100644 --- a/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java +++ b/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java @@ -17,6 +17,7 @@ package com.vaadin.ui.components.grid; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; @@ -405,6 +406,21 @@ public abstract class StaticSection> void addMergedCell(CELL newCell, Set columnGroup) { rowState.cellGroups.put(newCell.getCellState(), columnGroup); } + + public Collection getComponents() { + List components = new ArrayList<>(); + cells.forEach((id, cell) -> { + if (cell.getCellType() == GridStaticCellType.WIDGET) { + components.add(cell.getComponent()); + } + }); + rowState.cellGroups.forEach((cellState, columnIds) -> { + if (cellState.connector != null) { + components.add((Component) cellState.connector); + } + }); + return components; + } } /** @@ -534,7 +550,7 @@ public abstract class StaticSection> public GridStaticCellType getCellType() { return cellState.type; } - + /** * Returns the custom style name for this cell. * @@ -548,8 +564,7 @@ public abstract class StaticSection> * Sets a custom style name for this cell. * * @param styleName - * the style name to set or null to not use any style - * name + * the style name to set or null to not use any style name */ public void setStyleName(String styleName) { cellState.styleName = styleName; diff --git a/server/src/test/java/com/vaadin/tests/server/component/grid/GridChildrenTest.java b/server/src/test/java/com/vaadin/tests/server/component/grid/GridChildrenTest.java new file mode 100644 index 0000000000..4959169cf8 --- /dev/null +++ b/server/src/test/java/com/vaadin/tests/server/component/grid/GridChildrenTest.java @@ -0,0 +1,86 @@ +/* + * Copyright 2000-2016 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.Before; +import org.junit.Test; + +import com.vaadin.tests.data.bean.Person; +import com.vaadin.ui.Component; +import com.vaadin.ui.Grid; +import com.vaadin.ui.Label; +import com.vaadin.ui.components.grid.FooterCell; +import com.vaadin.ui.components.grid.HeaderCell; + +public class GridChildrenTest { + + private Grid grid; + + @Before + public void createGrid() { + grid = new Grid<>(); + grid.addColumn(Person::getFirstName).setId("foo"); + grid.addColumn(Person::getLastName).setId("bar"); + grid.addColumn(Person::getEmail).setId("baz"); + + } + + @Test + public void iteratorFindsComponentsInMergedHeader() { + 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 removeComponentInMergedHeaderCell() { + HeaderCell merged = grid.getDefaultHeaderRow().join("foo", "bar", + "baz"); + Label label = new Label(); + merged.setComponent(label); + Assert.assertEquals(grid, label.getParent()); + merged.setText("foo"); + Assert.assertNull(label.getParent()); + } + + @Test + public void removeComponentInMergedFooterCell() { + FooterCell merged = grid.addFooterRowAt(0).join("foo", "bar", "baz"); + Label label = new Label(); + merged.setComponent(label); + Assert.assertEquals(grid, label.getParent()); + merged.setText("foo"); + Assert.assertNull(label.getParent()); + } + + @Test + public void componentsInMergedFooter() { + 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()); + Assert.assertEquals(grid, label.getParent()); + } +} -- cgit v1.2.3