From 0e7755958b46434185cb1e6e2ec8aa6932b32f34 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pekka=20Hyv=C3=B6nen?= Date: Mon, 23 Mar 2015 13:42:07 +0200 Subject: [PATCH] API for column hiding toggle caption in Grid (#17272) Fixes column toggle not getting a caption when a hidable column is added. Fixes column toggle not getting a caption on columns with widget in header. Change-Id: Ie10ada793a3635302603f684f232cadaef74a982 --- .../client/connectors/GridConnector.java | 1 + .../src/com/vaadin/client/widgets/Grid.java | 52 +++++++++++++++---- server/src/com/vaadin/ui/Grid.java | 46 +++++++++++++++- .../shared/ui/grid/GridColumnState.java | 3 ++ .../grid/basicfeatures/GridBasicFeatures.java | 31 ++++++++--- .../basicfeatures/GridColumnReorderTest.java | 2 +- .../server/GridColumnVisibilityTest.java | 50 +++++++++++++++--- 7 files changed, 159 insertions(+), 26 deletions(-) diff --git a/client/src/com/vaadin/client/connectors/GridConnector.java b/client/src/com/vaadin/client/connectors/GridConnector.java index 0e2ee0046b..5554664566 100644 --- a/client/src/com/vaadin/client/connectors/GridConnector.java +++ b/client/src/com/vaadin/client/connectors/GridConnector.java @@ -1197,6 +1197,7 @@ public class GridConnector extends AbstractHasComponentsConnector implements column.setHidden(state.hidden); column.setHidable(state.hidable); + column.setHidingToggleCaption(state.hidingToggleCaption); column.setEditable(state.editable); column.setEditorConnector((AbstractFieldConnector) state.editorConnector); diff --git a/client/src/com/vaadin/client/widgets/Grid.java b/client/src/com/vaadin/client/widgets/Grid.java index 20b8844623..f9c6ed28fe 100644 --- a/client/src/com/vaadin/client/widgets/Grid.java +++ b/client/src/com/vaadin/client/widgets/Grid.java @@ -3096,7 +3096,7 @@ public class Grid extends ResizeComposite implements column.setHidden(!event.getValue(), true); } }); - updateColumnHidingToggleCaption(column, toggle); + updateHidingToggleCaption(column, toggle); columnToHidingToggleMap.put(column, toggle); return toggle; } @@ -3133,22 +3133,20 @@ public class Grid extends ResizeComposite implements hasValue.setStyleName("hidden", hidden); } - private void updateColumnHidingToggleCaption(Column column) { - updateColumnHidingToggleCaption(column, + private void updateHidingToggleCaption(Column column) { + updateHidingToggleCaption(column, columnToHidingToggleMap.get(column)); } - private void updateColumnHidingToggleCaption(Column column, + private void updateHidingToggleCaption(Column column, ToggleButton toggle) { - String caption = column.headerCaption; - if (caption == null || caption.isEmpty()) { - // TODO what if the content is a widget? - HeaderCell cell = getDefaultHeaderRow().getCell(column); - caption = cell.getText(); + String caption = column.getHidingToggleCaption(); + if (caption == null) { + caption = column.headerCaption; + // the caption might still be null, but that is the users fault } toggle.setText(caption); } - } /** @@ -3782,6 +3780,8 @@ public class Grid extends ResizeComposite implements private String headerCaption = ""; + private String hidingToggleCaption = null; + private double minimumWidthPx = GridConstants.DEFAULT_MIN_WIDTH; private double maximumWidthPx = GridConstants.DEFAULT_MAX_WIDTH; private int expandRatio = GridConstants.DEFAULT_EXPAND_RATIO; @@ -3891,7 +3891,7 @@ public class Grid extends ResizeComposite implements if (row != null) { row.getCell(this).setText(headerCaption); if (isHidable()) { - grid.columnHider.updateColumnHidingToggleCaption(this); + grid.columnHider.updateHidingToggleCaption(this); } } } @@ -4143,6 +4143,36 @@ public class Grid extends ResizeComposite implements return hidable; } + /** + * Sets the hiding toggle's caption for this column. Shown in the toggle + * for this column in the grid's sidebar when the column is + * {@link #isHidable() hidable}. + *

+ * Defaults to null, when will use whatever is set with + * {@link #setHeaderCaption(String)}. + * + * @since + * @param hidingToggleCaption + * the caption for the hiding toggle for this column + */ + public void setHidingToggleCaption(String hidingToggleCaption) { + this.hidingToggleCaption = hidingToggleCaption; + if (isHidable()) { + grid.columnHider.updateHidingToggleCaption(this); + } + } + + /** + * Gets the hiding toggle caption for this column. + * + * @since + * @see #setHidingToggleCaption(String) + * @return the hiding toggle's caption for this column + */ + public String getHidingToggleCaption() { + return hidingToggleCaption; + } + @Override public String toString() { String details = ""; diff --git a/server/src/com/vaadin/ui/Grid.java b/server/src/com/vaadin/ui/Grid.java index 2cb7ab352a..cd97e90e2e 100644 --- a/server/src/com/vaadin/ui/Grid.java +++ b/server/src/com/vaadin/ui/Grid.java @@ -2285,6 +2285,46 @@ public class Grid extends AbstractComponent implements SelectionNotifier, return this; } + /** + * Gets the caption of the hiding toggle for this column. + * + * @since + * @see #setHidingToggleCaption(String) + * @return the caption for the hiding toggle for this column + * @throws IllegalStateException + * if the column is no longer attached to any grid + */ + public String getHidingToggleCaption() throws IllegalStateException { + checkColumnIsAttached(); + return state.hidingToggleCaption; + } + + /** + * Sets the caption of the hiding toggle for this column. Shown in the + * toggle for this column in the grid's sidebar when the column is + * {@link #isHidable() hidable}. + *

+ * By default, before triggering this setter, a user friendly version of + * the column's {@link #getPropertyId() property id} is used. + *

+ * NOTE: setting this to null or empty string + * might cause the hiding toggle to not render correctly. + * + * @since + * @param hidingToggleCaption + * the text to show in the column hiding toggle + * @return the column itself + * @throws IllegalStateException + * if the column is no longer attached to any grid + */ + public Column setHidingToggleCaption(String hidingToggleCaption) + throws IllegalStateException { + checkColumnIsAttached(); + state.hidingToggleCaption = hidingToggleCaption; + grid.markAsDirty(); + return this; + } + /** * Returns the width (in pixels). By default a column is 100px wide. * @@ -3860,8 +3900,10 @@ public class Grid extends AbstractComponent implements SelectionNotifier, header.addColumn(datasourcePropertyId); footer.addColumn(datasourcePropertyId); - column.setHeaderCaption(SharedUtil.propertyIdToHumanFriendly(String - .valueOf(datasourcePropertyId))); + String humanFriendlyPropertyId = SharedUtil + .propertyIdToHumanFriendly(String.valueOf(datasourcePropertyId)); + column.setHeaderCaption(humanFriendlyPropertyId); + column.setHidingToggleCaption(humanFriendlyPropertyId); return column; } diff --git a/shared/src/com/vaadin/shared/ui/grid/GridColumnState.java b/shared/src/com/vaadin/shared/ui/grid/GridColumnState.java index b966c53352..5aa9ea9b65 100644 --- a/shared/src/com/vaadin/shared/ui/grid/GridColumnState.java +++ b/shared/src/com/vaadin/shared/ui/grid/GridColumnState.java @@ -82,4 +82,7 @@ public class GridColumnState implements Serializable { /** Can the column be hidden by the UI. */ public boolean hidable = false; + + /** The caption for the column hiding toggle. */ + public String hidingToggleCaption; } diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeatures.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeatures.java index d3b1237cf9..6f4c7df38c 100644 --- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeatures.java +++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicFeatures.java @@ -768,17 +768,23 @@ public class GridBasicFeatures extends AbstractComponentTest { new Command() { boolean wasHidable; + boolean wasHidden; + String wasColumnHidingToggleCaption; @Override public void execute(Grid grid, String value, Object data) { String columnProperty = getColumnProperty((Integer) data); - if (grid.getColumn(columnProperty) == null) { - grid.addColumn(columnProperty); - grid.getColumn(columnProperty).setHidable( - wasHidable); + Column column = grid.getColumn(columnProperty); + if (column == null) { + column = grid.addColumn(columnProperty); + column.setHidable(wasHidable); + column.setHidden(wasHidden); + column.setHidingToggleCaption(wasColumnHidingToggleCaption); } else { - wasHidable = grid.getColumn(columnProperty) - .isHidable(); + wasHidable = column.isHidable(); + wasHidden = column.isHidden(); + wasColumnHidingToggleCaption = column + .getHidingToggleCaption(); grid.removeColumn(columnProperty); } } @@ -840,6 +846,19 @@ public class GridBasicFeatures extends AbstractComponentTest { grid.getColumn(propertyId).setHidden(hidden); } }, getColumnProperty(c)); + createClickAction("Change hiding toggle caption", + getColumnProperty(c), new Command() { + int count = 0; + + @Override + public void execute(Grid grid, String value, Object data) { + final String columnProperty = getColumnProperty((Integer) data); + grid.getColumn(columnProperty) + .setHidingToggleCaption( + columnProperty + " caption " + + count++); + } + }, null, c); createCategory("Column " + c + " Width", getColumnProperty(c)); diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnReorderTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnReorderTest.java index 68ba5f5c54..d779a5c81a 100644 --- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnReorderTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnReorderTest.java @@ -369,7 +369,7 @@ public class GridColumnReorderTest extends GridBasicClientFeaturesTest { assertColumnHeaderOrder(1, 3, 4, 5, 2); // when then - dragAndDropColumnHeader(0, 1, 3, CellSide.RIGHT); + dragAndDropColumnHeader(0, 1, 4, CellSide.LEFT); assertColumnHeaderOrder(1, 4, 3, 5, 2); dragAndDropColumnHeader(0, 2, 4, CellSide.LEFT); diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridColumnVisibilityTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridColumnVisibilityTest.java index 37eda1c28f..7942650576 100644 --- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridColumnVisibilityTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridColumnVisibilityTest.java @@ -24,7 +24,6 @@ import static org.junit.Assert.assertTrue; import java.util.List; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; @@ -139,12 +138,15 @@ public class GridColumnVisibilityTest extends GridBasicFeaturesTest { } @Test - @Ignore - // known issue, column caption not passed to toggle when added again - public void testColumnHiding_whenHidableColumnAdded_toggleAdded() { + public void testColumnHiding_whenHidableColumnAdded_toggleWithCorrectCaptionAdded() { selectMenuPath("Component", "Size", "Width", "100%"); toggleColumnHidable(0); toggleColumnHidable(1); + toggleColumnHidingToggleCaptionChange(0); + getSidebarOpenButton().click(); + assertEquals("Column 0 caption 0", getColumnHidingToggle(0).getText()); + getSidebarOpenButton().click(); + addRemoveColumn(0); addRemoveColumn(4); addRemoveColumn(5); @@ -163,7 +165,43 @@ public class GridColumnVisibilityTest extends GridBasicFeaturesTest { assertColumnHeaderOrder(1, 2, 3, 11, 0); getSidebarOpenButton().click(); - assertNotNull(getColumnHidingToggle(0)); + assertEquals("Column 0 caption 0", getColumnHidingToggle(0).getText()); + } + + @Test + public void testColumnHidingToggleCaption_settingToggleCaption_updatesToggle() { + toggleColumnHidable(1); + getSidebarOpenButton().click(); + assertEquals("column 1", getGridElement().getHeaderCell(0, 1).getText() + .toLowerCase()); + assertEquals("Column 1", getColumnHidingToggle(1).getText()); + + toggleColumnHidingToggleCaptionChange(1); + assertEquals("column 1", getGridElement().getHeaderCell(0, 1).getText() + .toLowerCase()); + assertEquals("Column 1 caption 0", getColumnHidingToggle(1).getText()); + + toggleColumnHidingToggleCaptionChange(1); + assertEquals("Column 1 caption 1", getColumnHidingToggle(1).getText()); + } + + @Test + public void testColumnHidingToggleCaption_settingWidgetToHeader_toggleCaptionStays() { + toggleColumnHidable(1); + getSidebarOpenButton().click(); + assertEquals("column 1", getGridElement().getHeaderCell(0, 1).getText() + .toLowerCase()); + assertEquals("Column 1", getColumnHidingToggle(1).getText()); + + selectMenuPath("Component", "Columns", "Column 1", "Header Type", + "Widget Header"); + + assertEquals("Column 1", getColumnHidingToggle(1).getText()); + } + + private void toggleColumnHidingToggleCaptionChange(int index) { + selectMenuPath("Component", "Columns", "Column " + index, + "Change hiding toggle caption"); } @Test @@ -264,7 +302,7 @@ public class GridColumnVisibilityTest extends GridBasicFeaturesTest { List elements = sidebar.findElements(By .className("column-hiding-toggle")); for (WebElement e : elements) { - if (("Column " + columnIndex).equalsIgnoreCase(e.getText())) { + if ((e.getText().toLowerCase()).startsWith("column " + columnIndex)) { return e; } } -- 2.39.5