From f09d8c74dfb44854b4982a0b54de8564ff324d00 Mon Sep 17 00:00:00 2001 From: Teemu Suo-Anttila Date: Wed, 23 Aug 2017 14:02:20 +0300 Subject: Add item description to RadioButtonGroup and CheckBoxGroup (#9841) --- .../java/com/vaadin/ui/AbstractMultiSelect.java | 2 +- .../src/main/java/com/vaadin/ui/CheckBoxGroup.java | 44 ++++++++++++++++++++++ .../main/java/com/vaadin/ui/RadioButtonGroup.java | 39 +++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) (limited to 'server/src') diff --git a/server/src/main/java/com/vaadin/ui/AbstractMultiSelect.java b/server/src/main/java/com/vaadin/ui/AbstractMultiSelect.java index a0c8fd2225..93b0b35403 100644 --- a/server/src/main/java/com/vaadin/ui/AbstractMultiSelect.java +++ b/server/src/main/java/com/vaadin/ui/AbstractMultiSelect.java @@ -89,7 +89,7 @@ public abstract class AbstractMultiSelect extends AbstractListing } - private class MultiSelectDataGenerator implements DataGenerator { + private final class MultiSelectDataGenerator implements DataGenerator { @Override public void generateData(T data, JsonObject jsonObject) { String caption = getItemCaptionGenerator().apply(data); diff --git a/server/src/main/java/com/vaadin/ui/CheckBoxGroup.java b/server/src/main/java/com/vaadin/ui/CheckBoxGroup.java index b6b6d69074..c257a1a0d0 100644 --- a/server/src/main/java/com/vaadin/ui/CheckBoxGroup.java +++ b/server/src/main/java/com/vaadin/ui/CheckBoxGroup.java @@ -17,6 +17,7 @@ package com.vaadin.ui; import java.util.Collection; +import java.util.Objects; import java.util.Set; import org.jsoup.nodes.Element; @@ -32,7 +33,9 @@ import com.vaadin.event.FieldEvents.FocusListener; import com.vaadin.event.FieldEvents.FocusNotifier; import com.vaadin.server.SerializablePredicate; import com.vaadin.shared.Registration; +import com.vaadin.shared.ui.ListingJsonConstants; import com.vaadin.shared.ui.optiongroup.CheckBoxGroupState; +import com.vaadin.ui.components.grid.DescriptionGenerator; import com.vaadin.ui.declarative.DesignContext; import com.vaadin.ui.declarative.DesignFormatter; @@ -48,6 +51,8 @@ import com.vaadin.ui.declarative.DesignFormatter; public class CheckBoxGroup extends AbstractMultiSelect implements FocusNotifier, BlurNotifier, HasDataProvider { + private DescriptionGenerator descriptionGenerator = item -> null; + /** * Constructs a new CheckBoxGroup with caption. * @@ -92,6 +97,13 @@ public class CheckBoxGroup extends AbstractMultiSelect */ public CheckBoxGroup() { registerRpc(new FocusAndBlurServerRpcDecorator(this, this::fireEvent)); + addDataGenerator((item, jsonObject) -> { + String description = getItemDescriptionGenerator().apply(item); + if (description != null) { + jsonObject.put(ListingJsonConstants.JSONKEY_ITEM_DESCRIPTION, + description); + } + }); } /** @@ -162,6 +174,38 @@ public class CheckBoxGroup extends AbstractMultiSelect BlurListener.blurMethod); } + /** + * Sets the description generator that is used for generating descriptions + * for items. Description is shown as a tooltip when hovering on + * corresponding element. If the generator returns {@code null}, no tooltip + * is shown. + * + * + * @param descriptionGenerator + * the item description generator to set, not {@code null} + * + * @since + */ + public void setItemDescriptionGenerator( + DescriptionGenerator descriptionGenerator) { + Objects.requireNonNull(descriptionGenerator); + if (this.descriptionGenerator != descriptionGenerator) { + this.descriptionGenerator = descriptionGenerator; + getDataProvider().refreshAll(); + } + } + + /** + * Gets the item description generator. + * + * @return the item description generator + * + * @since + */ + public DescriptionGenerator getItemDescriptionGenerator() { + return descriptionGenerator; + } + @Override protected void readItems(Element design, DesignContext context) { setItemEnabledProvider(new DeclarativeItemEnabledProvider<>()); diff --git a/server/src/main/java/com/vaadin/ui/RadioButtonGroup.java b/server/src/main/java/com/vaadin/ui/RadioButtonGroup.java index 35490c49d1..c6e4a66c65 100644 --- a/server/src/main/java/com/vaadin/ui/RadioButtonGroup.java +++ b/server/src/main/java/com/vaadin/ui/RadioButtonGroup.java @@ -38,6 +38,7 @@ import com.vaadin.server.SerializablePredicate; import com.vaadin.shared.Registration; import com.vaadin.shared.ui.ListingJsonConstants; import com.vaadin.shared.ui.optiongroup.RadioButtonGroupState; +import com.vaadin.ui.components.grid.DescriptionGenerator; import com.vaadin.ui.declarative.DesignContext; import com.vaadin.ui.declarative.DesignFormatter; @@ -56,6 +57,7 @@ public class RadioButtonGroup extends AbstractSingleSelect implements FocusNotifier, BlurNotifier, HasDataProvider { private SerializablePredicate itemEnabledProvider = item -> true; + private DescriptionGenerator descriptionGenerator = item -> null; /** * Constructs a new RadioButtonGroup with caption. @@ -112,6 +114,12 @@ public class RadioButtonGroup extends AbstractSingleSelect } else { jsonObject.put(ListingJsonConstants.JSONKEY_ITEM_VALUE, ""); } + String description = getItemDescriptionGenerator().apply(data); + if (description != null) { + jsonObject.put( + ListingJsonConstants.JSONKEY_ITEM_DESCRIPTION, + description); + } Resource icon = getItemIconGenerator().apply(data); if (icon != null) { String iconUrl = ResourceReference @@ -219,6 +227,37 @@ public class RadioButtonGroup extends AbstractSingleSelect this.itemEnabledProvider = itemEnabledProvider; } + /** + * Sets the description generator that is used for generating descriptions + * for items. Description is shown as a tooltip when hovering on + * corresponding element. If the generator returns {@code null}, no tooltip + * is shown. + * + * @param descriptionGenerator + * the item description generator to set, not {@code null} + * + * @since + */ + public void setItemDescriptionGenerator( + DescriptionGenerator descriptionGenerator) { + Objects.requireNonNull(descriptionGenerator); + if (this.descriptionGenerator != descriptionGenerator) { + this.descriptionGenerator = descriptionGenerator; + getDataProvider().refreshAll(); + } + } + + /** + * Gets the item description generator. + * + * @return the item description generator + * + * @since + */ + public DescriptionGenerator getItemDescriptionGenerator() { + return descriptionGenerator; + } + @Override public Registration addFocusListener(FocusListener listener) { return addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener, -- cgit v1.2.3