From 74df0fadeb7d6c2a6e15b4716602d6ab7ffb54b1 Mon Sep 17 00:00:00 2001 From: Teemu Suo-Anttila Date: Tue, 6 Sep 2016 15:07:37 +0300 Subject: Add StyleGenerators for Grid and Columns Change-Id: I5eedce6ac24381d657357ff07ca1ccedd804158d --- .../com/vaadin/server/data/DataCommunicator.java | 2 +- server/src/main/java/com/vaadin/ui/Grid.java | 110 ++++++++++++++++++--- 2 files changed, 99 insertions(+), 13 deletions(-) (limited to 'server') diff --git a/server/src/main/java/com/vaadin/server/data/DataCommunicator.java b/server/src/main/java/com/vaadin/server/data/DataCommunicator.java index e8c96fddab..b0ade744de 100644 --- a/server/src/main/java/com/vaadin/server/data/DataCommunicator.java +++ b/server/src/main/java/com/vaadin/server/data/DataCommunicator.java @@ -357,7 +357,7 @@ public class DataCommunicator extends AbstractExtension { /** * Informs the DataProvider that the collection has changed. */ - protected void reset() { + public void reset() { if (reset) { return; } diff --git a/server/src/main/java/com/vaadin/ui/Grid.java b/server/src/main/java/com/vaadin/ui/Grid.java index 94a3dd0ce9..96d7376816 100644 --- a/server/src/main/java/com/vaadin/ui/Grid.java +++ b/server/src/main/java/com/vaadin/ui/Grid.java @@ -32,9 +32,7 @@ import java.util.function.Function; import java.util.stream.Stream; import com.vaadin.data.selection.SingleSelection; -import com.vaadin.server.AbstractExtension; import com.vaadin.server.KeyMapper; -import com.vaadin.server.data.DataGenerator; import com.vaadin.server.data.SortOrder; import com.vaadin.shared.MouseEventDetails; import com.vaadin.shared.data.DataCommunicatorConstants; @@ -64,6 +62,17 @@ import elemental.json.JsonValue; public class Grid extends AbstractListing> implements HasComponents { + /** + * A callback interface for generating style names for an item. + * + * @param + * the grid bean type + */ + @FunctionalInterface + public interface StyleGenerator + extends Function, Serializable { + } + /** * A callback interface for generating details for a particular row in Grid. * @@ -304,13 +313,13 @@ public class Grid extends AbstractListing> * @param * the column value type */ - public static class Column extends AbstractExtension - implements DataGenerator { + public static class Column extends AbstractGridExtension { private final Function valueProvider; private Function>> sortOrderProvider; private Comparator comparator; + private StyleGenerator styleGenerator; /** * Constructs a new Column configuration with given header caption, @@ -401,22 +410,41 @@ public class Grid extends AbstractListing> @SuppressWarnings("unchecked") Renderer renderer = (Renderer) state.renderer; - if (!jsonObject.hasKey(DataCommunicatorConstants.DATA)) { - jsonObject.put(DataCommunicatorConstants.DATA, - Json.createObject()); - } - JsonObject obj = jsonObject - .getObject(DataCommunicatorConstants.DATA); + JsonObject obj = getDataObject(jsonObject, + DataCommunicatorConstants.DATA); V providerValue = valueProvider.apply(data); JsonValue rendererValue = renderer.encode(providerValue); obj.put(communicationId, rendererValue); + + if (styleGenerator != null) { + String style = styleGenerator.apply(data); + if (style != null && !style.isEmpty()) { + JsonObject styleObj = getDataObject(jsonObject, + GridState.JSONKEY_CELLSTYLES); + styleObj.put(getState(false).id, style); + } + } } - @Override - public void destroyData(T data) { + /** + * Gets a data object with the given key from the given JsonObject. If + * there is no object with the key, this method creates a new + * JsonObject. + * + * @param jsonObject + * the json object + * @param key + * the key where the desired data object is stored + * @return data object for the given key + */ + private JsonObject getDataObject(JsonObject jsonObject, String key) { + if (!jsonObject.hasKey(key)) { + jsonObject.put(key, Json.createObject()); + } + return jsonObject.getObject(key); } @Override @@ -572,6 +600,33 @@ public class Grid extends AbstractListing> public Stream> getSortOrder(SortDirection direction) { return sortOrderProvider.apply(direction); } + + /** + * Sets the style generator that is used for generating styles for cells + * in this column. + * + * @param cellStyleGenerator + * the cell style generator to set, or null to + * remove a previously set generator + * @return this column + */ + public Column setStyleGenerator( + StyleGenerator cellStyleGenerator) { + this.styleGenerator = cellStyleGenerator; + getParent().getDataCommunicator().reset(); + return this; + } + + /** + * Gets the style generator that is used for generating styles for + * cells. + * + * @return the cell style generator, or null if no + * generator is set + */ + public StyleGenerator getStyleGenerator() { + return styleGenerator; + } } private KeyMapper> columnKeys = new KeyMapper<>(); @@ -579,6 +634,7 @@ public class Grid extends AbstractListing> private List>> sortOrder = new ArrayList<>(); private DetailsManager detailsManager; private Set extensionComponents = new HashSet<>(); + private StyleGenerator styleGenerator; /** * Constructor for the {@link Grid} component. @@ -589,6 +645,14 @@ public class Grid extends AbstractListing> detailsManager = new DetailsManager<>(); addExtension(detailsManager); addDataGenerator(detailsManager); + addDataGenerator((item, json) -> { + if (styleGenerator != null) { + String styleName = styleGenerator.apply(item); + if (styleName != null && !styleName.isEmpty()) { + json.put(GridState.JSONKEY_ROWSTYLE, styleName); + } + } + }); } /** @@ -836,6 +900,28 @@ public class Grid extends AbstractListing> return getState(false).heightMode; } + /** + * Sets the style generator that is used for generating styles for rows. + * + * @param styleGenerator + * the row style generator to set, or null to remove + * a previously set generator + */ + public void setStyleGenerator(StyleGenerator styleGenerator) { + this.styleGenerator = styleGenerator; + getDataCommunicator().reset(); + } + + /** + * Gets the style generator that is used for generating styles for rows. + * + * @return the row style generator, or null if no generator is + * set + */ + public StyleGenerator getStyleGenerator() { + return styleGenerator; + } + @Override protected GridState getState() { return getState(true); -- cgit v1.2.3