Adds an optional textual value for null to Grid.AbstractRenderer Change-Id: I4998476308e4259306f1774f309968520d8672e5tags/7.5.0.beta2^0
@Override | @Override | ||||
public String decode(JsonValue value) { | public String decode(JsonValue value) { | ||||
return ((URLReference) JsonDecoder.decodeValue( | |||||
URLReference reference = (URLReference) JsonDecoder.decodeValue( | |||||
TypeDataStore.getType(URLReference.class), value, null, | TypeDataStore.getType(URLReference.class), value, null, | ||||
getConnection())).getURL(); | |||||
getConnection()); | |||||
return reference != null ? reference.getURL() : null; | |||||
} | } | ||||
@Override | @Override |
*/ | */ | ||||
public class ImageRenderer extends ClickableRenderer<String, Image> { | public class ImageRenderer extends ClickableRenderer<String, Image> { | ||||
public static final String TRANSPARENT_GIF_1PX = "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs="; | |||||
@Override | @Override | ||||
public Image createWidget() { | public Image createWidget() { | ||||
Image image = GWT.create(Image.class); | Image image = GWT.create(Image.class); | ||||
@Override | @Override | ||||
public void render(RendererCellReference cell, String url, Image image) { | public void render(RendererCellReference cell, String url, Image image) { | ||||
image.setUrl(url); | |||||
if (url == null) { | |||||
image.setUrl(TRANSPARENT_GIF_1PX); | |||||
} | |||||
else { | |||||
image.setUrl(url); | |||||
} | |||||
} | } | ||||
} | } |
private final Class<T> presentationType; | private final Class<T> presentationType; | ||||
protected AbstractRenderer(Class<T> presentationType) { | |||||
private final String nullRepresentation; | |||||
protected AbstractRenderer(Class<T> presentationType, String nullRepresentation) { | |||||
this.presentationType = presentationType; | this.presentationType = presentationType; | ||||
this.nullRepresentation = nullRepresentation; | |||||
} | |||||
protected AbstractRenderer(Class<T> presentationType) { | |||||
this(presentationType, null); | |||||
} | } | ||||
/** | /** | ||||
@Override | @Override | ||||
public JsonValue encode(T value) { | public JsonValue encode(T value) { | ||||
return encode(value, getPresentationType()); | |||||
if (value == null) { | |||||
return encode(getNullRepresentation(), String.class); | |||||
} else { | |||||
return encode(value, getPresentationType()); | |||||
} | |||||
} | |||||
/** | |||||
* Null representation for the renderer | |||||
* @return a textual representation of {@code null} | |||||
*/ | |||||
protected String getNullRepresentation() { | |||||
return nullRepresentation; | |||||
} | } | ||||
/** | /** |
private JavaScriptCallbackHelper callbackHelper = new JavaScriptCallbackHelper( | private JavaScriptCallbackHelper callbackHelper = new JavaScriptCallbackHelper( | ||||
this); | this); | ||||
protected AbstractJavaScriptRenderer(Class<T> presentationType, String nullRepresentation) { | |||||
super(presentationType, nullRepresentation); | |||||
} | |||||
protected AbstractJavaScriptRenderer(Class<T> presentationType) { | protected AbstractJavaScriptRenderer(Class<T> presentationType) { | ||||
super(presentationType); | |||||
super(presentationType, null); | |||||
} | } | ||||
@Override | @Override |
*/ | */ | ||||
package com.vaadin.ui.renderers; | package com.vaadin.ui.renderers; | ||||
import elemental.json.JsonValue; | |||||
/** | /** | ||||
* A Renderer that displays a button with a textual caption. The value of the | * A Renderer that displays a button with a textual caption. The value of the | ||||
* corresponding property is used as the caption. Click listeners can be added | * corresponding property is used as the caption. Click listeners can be added | ||||
/** | /** | ||||
* Creates a new button renderer. | * Creates a new button renderer. | ||||
* | |||||
* @param nullRepresentation | |||||
* the textual representation of {@code null} value | |||||
*/ | */ | ||||
public ButtonRenderer() { | |||||
super(String.class); | |||||
public ButtonRenderer(String nullRepresentation) { | |||||
super(String.class, nullRepresentation); | |||||
} | } | ||||
/** | /** | ||||
* | * | ||||
* @param listener | * @param listener | ||||
* the click listener to register | * the click listener to register | ||||
* @param nullRepresentation | |||||
* the textual representation of {@code null} value | |||||
*/ | */ | ||||
public ButtonRenderer(RendererClickListener listener) { | |||||
this(); | |||||
public ButtonRenderer(RendererClickListener listener, String nullRepresentation) { | |||||
this(nullRepresentation); | |||||
addClickListener(listener); | addClickListener(listener); | ||||
} | } | ||||
/** | |||||
* Creates a new button renderer. | |||||
*/ | |||||
public ButtonRenderer() { | |||||
this(""); | |||||
} | |||||
/** | |||||
* Creates a new button renderer and adds the given click listener to it. | |||||
* | |||||
* @param listener | |||||
* the click listener to register | |||||
*/ | |||||
public ButtonRenderer(RendererClickListener listener) { | |||||
this(listener, ""); | |||||
} | |||||
@Override | |||||
public String getNullRepresentation() { | |||||
return super.getNullRepresentation(); | |||||
} | |||||
} | } |
} | } | ||||
protected ClickableRenderer(Class<T> presentationType) { | protected ClickableRenderer(Class<T> presentationType) { | ||||
super(presentationType); | |||||
this(presentationType, null); | |||||
} | |||||
protected ClickableRenderer(Class<T> presentationType, String nullRepresentation) { | |||||
super(presentationType, nullRepresentation); | |||||
registerRpc(new RendererClickRpc() { | registerRpc(new RendererClickRpc() { | ||||
@Override | @Override | ||||
public void click(String rowKey, String columnId, | public void click(String rowKey, String columnId, |
* representation for the default locale. | * representation for the default locale. | ||||
*/ | */ | ||||
public DateRenderer() { | public DateRenderer() { | ||||
this(Locale.getDefault()); | |||||
this(Locale.getDefault(), ""); | |||||
} | } | ||||
/** | /** | ||||
* if {@code locale} is {@code null} | * if {@code locale} is {@code null} | ||||
*/ | */ | ||||
public DateRenderer(Locale locale) throws IllegalArgumentException { | public DateRenderer(Locale locale) throws IllegalArgumentException { | ||||
this("%s", locale); | |||||
this("%s", locale, ""); | |||||
} | |||||
/** | |||||
* Creates a new date renderer. | |||||
* <p> | |||||
* The renderer is configured to render with the {@link Date#toString()} | |||||
* representation for the given locale. | |||||
* | |||||
* @param locale | |||||
* the locale in which to present dates | |||||
* @param nullRepresentation | |||||
* the textual representation of {@code null} value | |||||
* @throws IllegalArgumentException | |||||
* if {@code locale} is {@code null} | |||||
*/ | |||||
public DateRenderer(Locale locale, String nullRepresentation) throws IllegalArgumentException { | |||||
this("%s", locale, nullRepresentation); | |||||
} | } | ||||
/** | /** | ||||
* String Syntax</a> | * String Syntax</a> | ||||
*/ | */ | ||||
public DateRenderer(String formatString) throws IllegalArgumentException { | public DateRenderer(String formatString) throws IllegalArgumentException { | ||||
this(formatString, Locale.getDefault()); | |||||
this(formatString, ""); | |||||
} | |||||
/** | |||||
* Creates a new date renderer. | |||||
* <p> | |||||
* The renderer is configured to render with the given string format, as | |||||
* displayed in the default locale. | |||||
* | |||||
* @param formatString | |||||
* the format string with which to format the date | |||||
* @param nullRepresentation | |||||
* the textual representation of {@code null} value | |||||
* @throws IllegalArgumentException | |||||
* if {@code formatString} is {@code null} | |||||
* @see <a | |||||
* href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format | |||||
* String Syntax</a> | |||||
*/ | |||||
public DateRenderer(String formatString, String nullRepresentation) throws IllegalArgumentException { | |||||
this(formatString, Locale.getDefault(), nullRepresentation); | |||||
} | } | ||||
/** | /** | ||||
*/ | */ | ||||
public DateRenderer(String formatString, Locale locale) | public DateRenderer(String formatString, Locale locale) | ||||
throws IllegalArgumentException { | throws IllegalArgumentException { | ||||
super(Date.class); | |||||
this(formatString,locale, ""); | |||||
} | |||||
/** | |||||
* Creates a new date renderer. | |||||
* <p> | |||||
* The renderer is configured to render with the given string format, as | |||||
* displayed in the given locale. | |||||
* | |||||
* @param formatString | |||||
* the format string to format the date with | |||||
* @param locale | |||||
* the locale to use | |||||
* @param nullRepresentation | |||||
* the textual representation of {@code null} value | |||||
* @throws IllegalArgumentException | |||||
* if either argument is {@code null} | |||||
* @see <a | |||||
* href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format | |||||
* String Syntax</a> | |||||
*/ | |||||
public DateRenderer(String formatString, Locale locale, String nullRepresentation) | |||||
throws IllegalArgumentException { | |||||
super(Date.class, nullRepresentation); | |||||
if (formatString == null) { | if (formatString == null) { | ||||
throw new IllegalArgumentException("format string may not be null"); | throw new IllegalArgumentException("format string may not be null"); | ||||
* if {@code dateFormat} is {@code null} | * if {@code dateFormat} is {@code null} | ||||
*/ | */ | ||||
public DateRenderer(DateFormat dateFormat) throws IllegalArgumentException { | public DateRenderer(DateFormat dateFormat) throws IllegalArgumentException { | ||||
super(Date.class); | |||||
this(dateFormat, ""); | |||||
} | |||||
/** | |||||
* Creates a new date renderer. | |||||
* <p> | |||||
* The renderer is configured to render with he given date format. | |||||
* | |||||
* @param dateFormat | |||||
* the date format to use when rendering dates | |||||
* @throws IllegalArgumentException | |||||
* if {@code dateFormat} is {@code null} | |||||
*/ | |||||
public DateRenderer(DateFormat dateFormat, String nullRepresentation) throws IllegalArgumentException { | |||||
super(Date.class, nullRepresentation); | |||||
if (dateFormat == null) { | if (dateFormat == null) { | ||||
throw new IllegalArgumentException("date format may not be null"); | throw new IllegalArgumentException("date format may not be null"); | ||||
} | } | ||||
this.dateFormat = dateFormat; | this.dateFormat = dateFormat; | ||||
} | } | ||||
@Override | |||||
public String getNullRepresentation() { | |||||
return super.getNullRepresentation(); | |||||
} | |||||
@Override | @Override | ||||
public JsonValue encode(Date value) { | public JsonValue encode(Date value) { | ||||
String dateString; | String dateString; | ||||
if (dateFormat != null) { | |||||
if (value == null) { | |||||
dateString = getNullRepresentation(); | |||||
} else if (dateFormat != null) { | |||||
dateString = dateFormat.format(value); | dateString = dateFormat.format(value); | ||||
} else { | } else { | ||||
dateString = String.format(locale, formatString, value); | dateString = String.format(locale, formatString, value); |
package com.vaadin.ui.renderers; | package com.vaadin.ui.renderers; | ||||
import com.vaadin.ui.Grid.AbstractRenderer; | import com.vaadin.ui.Grid.AbstractRenderer; | ||||
import elemental.json.JsonValue; | |||||
/** | /** | ||||
* A renderer for presenting HTML content. | * A renderer for presenting HTML content. | ||||
* | |||||
* @since 7.4 | |||||
* | |||||
* @author Vaadin Ltd | * @author Vaadin Ltd | ||||
* @since 7.4 | |||||
*/ | */ | ||||
public class HtmlRenderer extends AbstractRenderer<String> { | public class HtmlRenderer extends AbstractRenderer<String> { | ||||
/** | |||||
* Creates a new HTML renderer. | |||||
* | |||||
* @param nullRepresentation the html representation of {@code null} value | |||||
*/ | |||||
public HtmlRenderer(String nullRepresentation) { | |||||
super(String.class, nullRepresentation); | |||||
} | |||||
/** | /** | ||||
* Creates a new HTML renderer. | * Creates a new HTML renderer. | ||||
*/ | */ | ||||
public HtmlRenderer() { | public HtmlRenderer() { | ||||
super(String.class); | |||||
this(""); | |||||
} | |||||
@Override | |||||
public String getNullRepresentation() { | |||||
return super.getNullRepresentation(); | |||||
} | } | ||||
} | } |
* Creates a new image renderer. | * Creates a new image renderer. | ||||
*/ | */ | ||||
public ImageRenderer() { | public ImageRenderer() { | ||||
super(Resource.class); | |||||
super(Resource.class, null); | |||||
} | } | ||||
/** | /** | ||||
@Override | @Override | ||||
public JsonValue encode(Resource resource) { | public JsonValue encode(Resource resource) { | ||||
if (!(resource instanceof ExternalResource || resource instanceof ThemeResource)) { | |||||
if (!(resource == null || resource instanceof ExternalResource || resource instanceof ThemeResource)) { | |||||
throw new IllegalArgumentException( | throw new IllegalArgumentException( | ||||
"ImageRenderer only supports ExternalResource and ThemeResource (" | "ImageRenderer only supports ExternalResource and ThemeResource (" | ||||
+ resource.getClass().getSimpleName() + "given )"); | + resource.getClass().getSimpleName() + "given )"); |
/** | /** | ||||
* A renderer for presenting number values. | * A renderer for presenting number values. | ||||
* | |||||
* | |||||
* @since 7.4 | * @since 7.4 | ||||
* @author Vaadin Ltd | * @author Vaadin Ltd | ||||
*/ | */ | ||||
/** | /** | ||||
* Creates a new number renderer. | * Creates a new number renderer. | ||||
* <p> | |||||
* <p/> | |||||
* The renderer is configured to render with the number's natural string | * The renderer is configured to render with the number's natural string | ||||
* representation in the default locale. | * representation in the default locale. | ||||
*/ | */ | ||||
/** | /** | ||||
* Creates a new number renderer. | * Creates a new number renderer. | ||||
* <p> | |||||
* <p/> | |||||
* The renderer is configured to render the number as defined with the given | * The renderer is configured to render the number as defined with the given | ||||
* number format. | * number format. | ||||
* | |||||
* | |||||
* @param numberFormat | * @param numberFormat | ||||
* the number format with which to display numbers | * the number format with which to display numbers | ||||
* @throws IllegalArgumentException | * @throws IllegalArgumentException | ||||
* if {@code numberFormat} is {@code null} | * if {@code numberFormat} is {@code null} | ||||
*/ | */ | ||||
public NumberRenderer(NumberFormat numberFormat) | |||||
public NumberRenderer(NumberFormat numberFormat) { | |||||
this(numberFormat, ""); | |||||
} | |||||
/** | |||||
* Creates a new number renderer. | |||||
* <p/> | |||||
* The renderer is configured to render the number as defined with the given | |||||
* number format. | |||||
* | |||||
* @param numberFormat | |||||
* the number format with which to display numbers | |||||
* @param nullRepresentation | |||||
* the textual representation of {@code null} value | |||||
* @throws IllegalArgumentException | |||||
* if {@code numberFormat} is {@code null} | |||||
*/ | |||||
public NumberRenderer(NumberFormat numberFormat, String nullRepresentation) | |||||
throws IllegalArgumentException { | throws IllegalArgumentException { | ||||
super(Number.class); | |||||
super(Number.class, nullRepresentation); | |||||
if (numberFormat == null) { | if (numberFormat == null) { | ||||
throw new IllegalArgumentException("Number format may not be null"); | throw new IllegalArgumentException("Number format may not be null"); | ||||
/** | /** | ||||
* Creates a new number renderer. | * Creates a new number renderer. | ||||
* <p> | |||||
* <p/> | |||||
* The renderer is configured to render with the number's natural string | * The renderer is configured to render with the number's natural string | ||||
* representation in the given locale. | * representation in the given locale. | ||||
* | |||||
* | |||||
* @param locale | * @param locale | ||||
* the locale in which to display numbers | * the locale in which to display numbers | ||||
* @throws IllegalArgumentException | * @throws IllegalArgumentException | ||||
/** | /** | ||||
* Creates a new number renderer. | * Creates a new number renderer. | ||||
* <p> | |||||
* The renderer is configured to render with the given format string in the | |||||
* default locale. | |||||
* | |||||
* <p/> | |||||
* The renderer is configured to render with the number's natural string | |||||
* representation in the given locale. | |||||
* | |||||
* @param formatString | * @param formatString | ||||
* the format string with which to format the number | * the format string with which to format the number | ||||
* @param locale | |||||
* the locale in which to display numbers | |||||
* @throws IllegalArgumentException | |||||
* if {@code locale} is {@code null} | |||||
*/ | |||||
public NumberRenderer(String formatString, Locale locale) throws IllegalArgumentException { | |||||
this(formatString, locale, ""); //This will call #toString() during formatting | |||||
} | |||||
/** | |||||
* Creates a new number renderer. | |||||
* <p/> | |||||
* The renderer is configured to render with the given format string in the | |||||
* default locale. | |||||
* | |||||
* @param | |||||
* formatString the format string with which to format the number | |||||
* @throws IllegalArgumentException | * @throws IllegalArgumentException | ||||
* if {@code formatString} is {@code null} | * if {@code formatString} is {@code null} | ||||
* @see <a | * @see <a | ||||
* String Syntax</a> | * String Syntax</a> | ||||
*/ | */ | ||||
public NumberRenderer(String formatString) throws IllegalArgumentException { | public NumberRenderer(String formatString) throws IllegalArgumentException { | ||||
this(formatString, Locale.getDefault()); | |||||
this(formatString, Locale.getDefault(), ""); | |||||
} | } | ||||
/** | /** | ||||
* Creates a new number renderer. | * Creates a new number renderer. | ||||
* <p> | |||||
* <p/> | |||||
* The renderer is configured to render with the given format string in the | * The renderer is configured to render with the given format string in the | ||||
* given locale. | * given locale. | ||||
* | |||||
* | |||||
* @param formatString | * @param formatString | ||||
* the format string with which to format the number | * the format string with which to format the number | ||||
* @param locale | * @param locale | ||||
* href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format | * href="http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax">Format | ||||
* String Syntax</a> | * String Syntax</a> | ||||
*/ | */ | ||||
public NumberRenderer(String formatString, Locale locale) { | |||||
super(Number.class); | |||||
public NumberRenderer(String formatString, Locale locale, String nullRepresentation) { | |||||
super(Number.class, nullRepresentation); | |||||
if (formatString == null) { | if (formatString == null) { | ||||
throw new IllegalArgumentException("Format string may not be null"); | throw new IllegalArgumentException("Format string may not be null"); | ||||
@Override | @Override | ||||
public JsonValue encode(Number value) { | public JsonValue encode(Number value) { | ||||
String stringValue; | String stringValue; | ||||
if (formatString != null && locale != null) { | |||||
if (value == null) { | |||||
stringValue = getNullRepresentation(); | |||||
} else if (formatString != null && locale != null) { | |||||
stringValue = String.format(locale, formatString, value); | stringValue = String.format(locale, formatString, value); | ||||
} else if (numberFormat != null) { | } else if (numberFormat != null) { | ||||
stringValue = numberFormat.format(value); | stringValue = numberFormat.format(value); | ||||
return String.format("%s [%s]", getClass().getSimpleName(), fieldInfo); | return String.format("%s [%s]", getClass().getSimpleName(), fieldInfo); | ||||
} | } | ||||
@Override | |||||
public String getNullRepresentation() { | |||||
return super.getNullRepresentation(); | |||||
} | |||||
} | } |
/** | /** | ||||
* A renderer that represents a double values as a graphical progress bar. | * A renderer that represents a double values as a graphical progress bar. | ||||
* | |||||
* @since 7.4 | |||||
* | |||||
* @author Vaadin Ltd | * @author Vaadin Ltd | ||||
* @since 7.4 | |||||
*/ | */ | ||||
public class ProgressBarRenderer extends AbstractRenderer<Double> { | public class ProgressBarRenderer extends AbstractRenderer<Double> { | ||||
* Creates a new text renderer | * Creates a new text renderer | ||||
*/ | */ | ||||
public ProgressBarRenderer() { | public ProgressBarRenderer() { | ||||
super(Double.class); | |||||
super(Double.class, null); | |||||
} | } | ||||
@Override | @Override | ||||
public JsonValue encode(Double value) { | public JsonValue encode(Double value) { | ||||
if (value != null) { | if (value != null) { | ||||
value = Math.max(Math.min(value, 1), 0); | value = Math.max(Math.min(value, 1), 0); | ||||
} else { | |||||
value = 0d; | |||||
} | } | ||||
return super.encode(value); | return super.encode(value); | ||||
} | } |
package com.vaadin.ui.renderers; | package com.vaadin.ui.renderers; | ||||
import com.vaadin.ui.Grid.AbstractRenderer; | import com.vaadin.ui.Grid.AbstractRenderer; | ||||
import elemental.json.JsonValue; | |||||
/** | /** | ||||
* A renderer for presenting simple plain-text string values. | * A renderer for presenting simple plain-text string values. | ||||
* Creates a new text renderer | * Creates a new text renderer | ||||
*/ | */ | ||||
public TextRenderer() { | public TextRenderer() { | ||||
super(String.class); | |||||
this(""); | |||||
} | |||||
/** | |||||
* Creates a new text renderer | |||||
* @param nullRepresentation | |||||
* the textual representation of {@code null} value | |||||
*/ | |||||
public TextRenderer(String nullRepresentation) { | |||||
super(String.class, nullRepresentation); | |||||
} | |||||
@Override | |||||
public String getNullRepresentation() { | |||||
return super.getNullRepresentation(); | |||||
} | } | ||||
} | } |
*/ | */ | ||||
package com.vaadin.tests.server.renderer; | package com.vaadin.tests.server.renderer; | ||||
import static org.junit.Assert.assertEquals; | |||||
import static org.junit.Assert.assertNull; | |||||
import static org.junit.Assert.assertSame; | |||||
import java.util.Locale; | |||||
import org.junit.Before; | |||||
import org.junit.Test; | |||||
import com.vaadin.data.Item; | import com.vaadin.data.Item; | ||||
import com.vaadin.data.RpcDataProviderExtension; | import com.vaadin.data.RpcDataProviderExtension; | ||||
import com.vaadin.data.util.IndexedContainer; | import com.vaadin.data.util.IndexedContainer; | ||||
import com.vaadin.tests.util.AlwaysLockedVaadinSession; | import com.vaadin.tests.util.AlwaysLockedVaadinSession; | ||||
import com.vaadin.ui.Grid; | import com.vaadin.ui.Grid; | ||||
import com.vaadin.ui.Grid.Column; | import com.vaadin.ui.Grid.Column; | ||||
import com.vaadin.ui.renderers.ButtonRenderer; | |||||
import com.vaadin.ui.renderers.DateRenderer; | |||||
import com.vaadin.ui.renderers.HtmlRenderer; | |||||
import com.vaadin.ui.renderers.NumberRenderer; | |||||
import com.vaadin.ui.renderers.TextRenderer; | import com.vaadin.ui.renderers.TextRenderer; | ||||
import elemental.json.JsonValue; | import elemental.json.JsonValue; | ||||
import org.junit.Before; | |||||
import org.junit.Test; | |||||
import java.util.Date; | |||||
import java.util.Locale; | |||||
import static org.junit.Assert.assertEquals; | |||||
import static org.junit.Assert.assertNull; | |||||
import static org.junit.Assert.assertSame; | |||||
public class RendererTest { | public class RendererTest { | ||||
@Override | @Override | ||||
public TestBean convertToModel(String value, | public TestBean convertToModel(String value, | ||||
Class<? extends TestBean> targetType, Locale locale) | |||||
Class<? extends TestBean> targetType, Locale locale) | |||||
throws ConversionException { | throws ConversionException { | ||||
return null; | return null; | ||||
} | } | ||||
@Override | @Override | ||||
public String convertToPresentation(TestBean value, | public String convertToPresentation(TestBean value, | ||||
Class<? extends String> targetType, Locale locale) | |||||
Class<? extends String> targetType, Locale locale) | |||||
throws ConversionException { | throws ConversionException { | ||||
if (value instanceof ExtendedBean) { | if (value instanceof ExtendedBean) { | ||||
return "ExtendedBean(" + value.i + ", " | return "ExtendedBean(" + value.i + ", " | ||||
private Grid grid; | private Grid grid; | ||||
private Column foo; | |||||
private Column bar; | |||||
private Column baz; | |||||
private Column bah; | |||||
private Column intColumn; | |||||
private Column textColumn; | |||||
private Column beanColumn; | |||||
private Column htmlColumn; | |||||
private Column numberColumn; | |||||
private Column dateColumn; | |||||
private Column extendedBeanColumn; | |||||
private Column buttonColumn; | |||||
@Before | @Before | ||||
@SuppressWarnings("unchecked") | |||||
public void setUp() { | public void setUp() { | ||||
VaadinSession.setCurrent(new AlwaysLockedVaadinSession(null)); | VaadinSession.setCurrent(new AlwaysLockedVaadinSession(null)); | ||||
IndexedContainer c = new IndexedContainer(); | IndexedContainer c = new IndexedContainer(); | ||||
c.addContainerProperty("foo", Integer.class, 0); | |||||
c.addContainerProperty("bar", String.class, ""); | |||||
c.addContainerProperty("baz", TestBean.class, null); | |||||
c.addContainerProperty("bah", ExtendedBean.class, null); | |||||
c.addContainerProperty("int", Integer.class, 0); | |||||
c.addContainerProperty("text", String.class, ""); | |||||
c.addContainerProperty("html", String.class, ""); | |||||
c.addContainerProperty("number", Number.class, null); | |||||
c.addContainerProperty("date", Date.class, null); | |||||
c.addContainerProperty("bean", TestBean.class, null); | |||||
c.addContainerProperty("button", String.class, null); | |||||
c.addContainerProperty("extendedBean", ExtendedBean.class, null); | |||||
Object id = c.addItem(); | Object id = c.addItem(); | ||||
Item item = c.getItem(id); | Item item = c.getItem(id); | ||||
item.getItemProperty("foo").setValue(123); | |||||
item.getItemProperty("bar").setValue("321"); | |||||
item.getItemProperty("baz").setValue(new TestBean()); | |||||
item.getItemProperty("bah").setValue(new ExtendedBean()); | |||||
item.getItemProperty("int").setValue(123); | |||||
item.getItemProperty("text").setValue("321"); | |||||
item.getItemProperty("html").setValue("<b>html</b>"); | |||||
item.getItemProperty("number").setValue(3.14); | |||||
item.getItemProperty("date").setValue(new Date(123456789)); | |||||
item.getItemProperty("bean").setValue(new TestBean()); | |||||
item.getItemProperty("extendedBean").setValue(new ExtendedBean()); | |||||
grid = new TestGrid(c); | grid = new TestGrid(c); | ||||
foo = grid.getColumn("foo"); | |||||
bar = grid.getColumn("bar"); | |||||
baz = grid.getColumn("baz"); | |||||
bah = grid.getColumn("bah"); | |||||
intColumn = grid.getColumn("int"); | |||||
textColumn = grid.getColumn("text"); | |||||
htmlColumn = grid.getColumn("html"); | |||||
numberColumn = grid.getColumn("number"); | |||||
dateColumn = grid.getColumn("date"); | |||||
beanColumn = grid.getColumn("bean"); | |||||
extendedBeanColumn = grid.getColumn("extendedBean"); | |||||
buttonColumn = grid.getColumn("button"); | |||||
} | } | ||||
@Test | @Test | ||||
public void testDefaultRendererAndConverter() throws Exception { | public void testDefaultRendererAndConverter() throws Exception { | ||||
assertSame(TextRenderer.class, foo.getRenderer().getClass()); | |||||
assertSame(StringToIntegerConverter.class, foo.getConverter() | |||||
assertSame(TextRenderer.class, intColumn.getRenderer().getClass()); | |||||
assertSame(StringToIntegerConverter.class, intColumn.getConverter() | |||||
.getClass()); | .getClass()); | ||||
assertSame(TextRenderer.class, bar.getRenderer().getClass()); | |||||
assertSame(TextRenderer.class, textColumn.getRenderer().getClass()); | |||||
// String->String; converter not needed | // String->String; converter not needed | ||||
assertNull(bar.getConverter()); | |||||
assertNull(textColumn.getConverter()); | |||||
assertSame(TextRenderer.class, baz.getRenderer().getClass()); | |||||
assertSame(TextRenderer.class, beanColumn.getRenderer().getClass()); | |||||
// MyBean->String; converter not found | // MyBean->String; converter not found | ||||
assertNull(baz.getConverter()); | |||||
assertNull(beanColumn.getConverter()); | |||||
} | } | ||||
@Test | @Test | ||||
public void testFindCompatibleConverter() throws Exception { | public void testFindCompatibleConverter() throws Exception { | ||||
foo.setRenderer(renderer()); | |||||
assertSame(StringToIntegerConverter.class, foo.getConverter() | |||||
intColumn.setRenderer(renderer()); | |||||
assertSame(StringToIntegerConverter.class, intColumn.getConverter() | |||||
.getClass()); | .getClass()); | ||||
bar.setRenderer(renderer()); | |||||
assertNull(bar.getConverter()); | |||||
textColumn.setRenderer(renderer()); | |||||
assertNull(textColumn.getConverter()); | |||||
} | } | ||||
@Test(expected = IllegalArgumentException.class) | @Test(expected = IllegalArgumentException.class) | ||||
public void testCannotFindConverter() { | public void testCannotFindConverter() { | ||||
baz.setRenderer(renderer()); | |||||
beanColumn.setRenderer(renderer()); | |||||
} | } | ||||
@Test | @Test | ||||
public void testExplicitConverter() throws Exception { | public void testExplicitConverter() throws Exception { | ||||
baz.setRenderer(renderer(), converter()); | |||||
bah.setRenderer(renderer(), converter()); | |||||
beanColumn.setRenderer(renderer(), converter()); | |||||
extendedBeanColumn.setRenderer(renderer(), converter()); | |||||
} | } | ||||
@Test | @Test | ||||
public void testEncoding() throws Exception { | public void testEncoding() throws Exception { | ||||
assertEquals("42", render(foo, 42).asString()); | |||||
foo.setRenderer(renderer()); | |||||
assertEquals("renderer(42)", render(foo, 42).asString()); | |||||
assertEquals("42", render(intColumn, 42).asString()); | |||||
intColumn.setRenderer(renderer()); | |||||
assertEquals("renderer(42)", render(intColumn, 42).asString()); | |||||
assertEquals("2.72", render(bar, "2.72").asString()); | |||||
bar.setRenderer(new TestRenderer()); | |||||
assertEquals("renderer(2.72)", render(bar, "2.72").asString()); | |||||
assertEquals("2.72", render(textColumn, "2.72").asString()); | |||||
textColumn.setRenderer(new TestRenderer()); | |||||
assertEquals("renderer(2.72)", render(textColumn, "2.72").asString()); | |||||
} | } | ||||
@Test | @Test | ||||
public void testEncodingWithoutConverter() throws Exception { | public void testEncodingWithoutConverter() throws Exception { | ||||
assertEquals("TestBean [42]", render(baz, new TestBean()).asString()); | |||||
assertEquals("TestBean [42]", render(beanColumn, new TestBean()) | |||||
.asString()); | |||||
} | } | ||||
@Test | @Test | ||||
public void testBeanEncoding() throws Exception { | public void testBeanEncoding() throws Exception { | ||||
baz.setRenderer(renderer(), converter()); | |||||
bah.setRenderer(renderer(), converter()); | |||||
beanColumn.setRenderer(renderer(), converter()); | |||||
extendedBeanColumn.setRenderer(renderer(), converter()); | |||||
assertEquals("renderer(TestBean(42))", render(baz, new TestBean()) | |||||
.asString()); | |||||
assertEquals("renderer(TestBean(42))", | |||||
render(beanColumn, new TestBean()).asString()); | |||||
assertEquals("renderer(ExtendedBean(42, 3.14))", | assertEquals("renderer(ExtendedBean(42, 3.14))", | ||||
render(baz, new ExtendedBean()).asString()); | |||||
render(beanColumn, new ExtendedBean()).asString()); | |||||
assertEquals("renderer(ExtendedBean(42, 3.14))", | assertEquals("renderer(ExtendedBean(42, 3.14))", | ||||
render(bah, new ExtendedBean()).asString()); | |||||
render(extendedBeanColumn, new ExtendedBean()).asString()); | |||||
} | |||||
@Test | |||||
public void testNullEncoding() { | |||||
textColumn.setRenderer(new TextRenderer()); | |||||
htmlColumn.setRenderer(new HtmlRenderer()); | |||||
numberColumn.setRenderer(new NumberRenderer()); | |||||
dateColumn.setRenderer(new DateRenderer()); | |||||
buttonColumn.setRenderer(new ButtonRenderer()); | |||||
assertEquals("", textColumn.getRenderer().encode(null).asString()); | |||||
assertEquals("", htmlColumn.getRenderer().encode(null).asString()); | |||||
assertEquals("", numberColumn.getRenderer().encode(null).asString()); | |||||
assertEquals("", dateColumn.getRenderer().encode(null).asString()); | |||||
assertEquals("", buttonColumn.getRenderer().encode(null).asString()); | |||||
} | |||||
@Test | |||||
public void testNullEncodingWithDefault() { | |||||
textColumn.setRenderer(new TextRenderer("default value")); | |||||
htmlColumn.setRenderer(new HtmlRenderer("default value")); | |||||
numberColumn.setRenderer(new NumberRenderer("%s", Locale.getDefault(), "default value")); | |||||
dateColumn.setRenderer(new DateRenderer("%s", "default value")); | |||||
buttonColumn.setRenderer(new ButtonRenderer("default value")); | |||||
assertEquals("default value", textColumn.getRenderer().encode(null).asString()); | |||||
assertEquals("default value", htmlColumn.getRenderer().encode(null).asString()); | |||||
assertEquals("default value", numberColumn.getRenderer().encode(null).asString()); | |||||
assertEquals("default value", dateColumn.getRenderer().encode(null).asString()); | |||||
assertEquals("default value", buttonColumn.getRenderer().encode(null).asString()); | |||||
} | } | ||||
private TestConverter converter() { | private TestConverter converter() { |
public class IntArrayRenderer extends AbstractRenderer<int[]> { | public class IntArrayRenderer extends AbstractRenderer<int[]> { | ||||
public IntArrayRenderer() { | public IntArrayRenderer() { | ||||
super(int[].class); | |||||
super(int[].class, ""); | |||||
} | } | ||||
} | } |
public class MyBeanJSRenderer extends AbstractJavaScriptRenderer<MyBean> { | public class MyBeanJSRenderer extends AbstractJavaScriptRenderer<MyBean> { | ||||
public MyBeanJSRenderer() { | public MyBeanJSRenderer() { | ||||
super(MyBean.class); | |||||
super(MyBean.class, ""); | |||||
} | } | ||||
} | } |
/* | |||||
* 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.components.grid; | |||||
import java.util.Date; | |||||
import java.util.Locale; | |||||
import com.vaadin.data.util.IndexedContainer; | |||||
import com.vaadin.server.Resource; | |||||
import com.vaadin.server.VaadinRequest; | |||||
import com.vaadin.tests.components.AbstractTestUI; | |||||
import com.vaadin.ui.Grid; | |||||
import com.vaadin.ui.Grid.SelectionMode; | |||||
import com.vaadin.ui.renderers.ButtonRenderer; | |||||
import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent; | |||||
import com.vaadin.ui.renderers.ClickableRenderer.RendererClickListener; | |||||
import com.vaadin.ui.renderers.DateRenderer; | |||||
import com.vaadin.ui.renderers.HtmlRenderer; | |||||
import com.vaadin.ui.renderers.ImageRenderer; | |||||
import com.vaadin.ui.renderers.NumberRenderer; | |||||
import com.vaadin.ui.renderers.ProgressBarRenderer; | |||||
import com.vaadin.ui.renderers.TextRenderer; | |||||
@SuppressWarnings("all") | |||||
public class NullRenderers extends AbstractTestUI { | |||||
@Override | |||||
protected void setup(VaadinRequest request) { | |||||
IndexedContainer container = new IndexedContainer(); | |||||
container.addContainerProperty(TextRenderer.class, String.class, null); | |||||
container.addContainerProperty(HtmlRenderer.class, String.class, null); | |||||
container.addContainerProperty(DateRenderer.class, Date.class, null); | |||||
container | |||||
.addContainerProperty(NumberRenderer.class, Number.class, null); | |||||
container.addContainerProperty(ProgressBarRenderer.class, Double.class, | |||||
null); | |||||
container | |||||
.addContainerProperty(ButtonRenderer.class, String.class, null); | |||||
container.addContainerProperty(ImageRenderer.class, Resource.class, | |||||
null); | |||||
container.addItem(); | |||||
final Grid gridDefaults = new Grid(container); | |||||
gridDefaults.setId("test-grid-defaults"); | |||||
gridDefaults.setSelectionMode(SelectionMode.NONE); | |||||
gridDefaults.setWidth("100%"); | |||||
gridDefaults.getColumn(TextRenderer.class).setRenderer(new TextRenderer("-- No Text --")); | |||||
gridDefaults.getColumn(HtmlRenderer.class).setRenderer(new HtmlRenderer("-- No Jokes --")); | |||||
gridDefaults.getColumn(DateRenderer.class).setRenderer(new DateRenderer("%s", Locale.getDefault(), "-- Never --")); | |||||
gridDefaults.getColumn(NumberRenderer.class).setRenderer(new NumberRenderer("%s", Locale.getDefault(),"-- Nothing --")); | |||||
gridDefaults.getColumn(ProgressBarRenderer.class).setRenderer( | |||||
new ProgressBarRenderer()); | |||||
gridDefaults.getColumn(ButtonRenderer.class).setRenderer( | |||||
new ButtonRenderer(new RendererClickListener() { | |||||
@Override | |||||
public void click(RendererClickEvent event) { | |||||
} | |||||
}, "-- No Control --")); | |||||
gridDefaults.getColumn(ImageRenderer.class).setRenderer( | |||||
new ImageRenderer(new RendererClickListener() { | |||||
@Override | |||||
public void click(RendererClickEvent event) { | |||||
} | |||||
})); | |||||
addComponent(gridDefaults); | |||||
final Grid gridNoDefaults = new Grid(container); | |||||
gridNoDefaults.setId("test-grid"); | |||||
gridNoDefaults.setSelectionMode(SelectionMode.NONE); | |||||
gridNoDefaults.setWidth("100%"); | |||||
gridNoDefaults.getColumn(TextRenderer.class).setRenderer(new TextRenderer()); | |||||
gridNoDefaults.getColumn(HtmlRenderer.class).setRenderer(new HtmlRenderer()); | |||||
gridNoDefaults.getColumn(DateRenderer.class).setRenderer(new DateRenderer()); | |||||
gridNoDefaults.getColumn(NumberRenderer.class).setRenderer(new NumberRenderer()); | |||||
gridNoDefaults.getColumn(ProgressBarRenderer.class).setRenderer( | |||||
new ProgressBarRenderer()); | |||||
gridNoDefaults.getColumn(ButtonRenderer.class).setRenderer( | |||||
new ButtonRenderer(new RendererClickListener() { | |||||
@Override | |||||
public void click(RendererClickEvent event) { | |||||
} | |||||
})); | |||||
gridNoDefaults.getColumn(ImageRenderer.class).setRenderer( | |||||
new ImageRenderer(new RendererClickListener() { | |||||
@Override | |||||
public void click(RendererClickEvent event) { | |||||
} | |||||
})); | |||||
addComponent(gridNoDefaults); | |||||
} | |||||
@Override | |||||
protected String getTestDescription() { | |||||
return "Tests the functionality of widget-based renderers"; | |||||
} | |||||
@Override | |||||
protected Integer getTicketNumber() { | |||||
return Integer.valueOf(13334); | |||||
} | |||||
} |
/* | |||||
* 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.components.grid; | |||||
import com.vaadin.testbench.elements.GridElement; | |||||
import com.vaadin.testbench.elements.LabelElement; | |||||
import com.vaadin.testbench.parallel.TestCategory; | |||||
import com.vaadin.tests.tb3.MultiBrowserTest; | |||||
import org.junit.Test; | |||||
import java.util.List; | |||||
import static org.junit.Assert.assertEquals; | |||||
@TestCategory("grid") | |||||
public class NullRenderersTest extends MultiBrowserTest { | |||||
@Test | |||||
public void testDefaults() throws Exception { | |||||
openTestURL(); | |||||
GridElement grid = findGridWithDefaults(); | |||||
assertEquals("-- No Text --", grid.getCell(0, 0).getText()); | |||||
assertEquals("-- No Jokes --", grid.getCell(0, 1).getText()); | |||||
assertEquals("-- Never --", grid.getCell(0, 2).getText()); | |||||
assertEquals("-- Nothing --", grid.getCell(0, 3).getText()); | |||||
assertEquals("-- No Control --", grid.getCell(0, 5).getText()); | |||||
} | |||||
@Test | |||||
public void testNoDefaults() throws Exception { | |||||
openTestURL(); | |||||
GridElement grid = findGridNoDefaults(); | |||||
assertEquals("", grid.getCell(0, 0).getText()); | |||||
assertEquals("", grid.getCell(0, 1).getText()); | |||||
assertEquals("", grid.getCell(0, 2).getText()); | |||||
assertEquals("", grid.getCell(0, 3).getText()); | |||||
assertEquals("", grid.getCell(0, 5).getText()); | |||||
} | |||||
private GridElement findGridWithDefaults() { | |||||
return $(GridElement.class).id("test-grid-defaults"); | |||||
} | |||||
private GridElement findGridNoDefaults() { | |||||
return $(GridElement.class).id("test-grid"); | |||||
} | |||||
private LabelElement findDebugLabel() { | |||||
return $(LabelElement.class).id(CustomRenderer.DEBUG_LABEL_ID); | |||||
} | |||||
} |
public class RowAwareRenderer extends AbstractRenderer<Void> { | public class RowAwareRenderer extends AbstractRenderer<Void> { | ||||
public RowAwareRenderer(final Label debugLabel) { | public RowAwareRenderer(final Label debugLabel) { | ||||
super(Void.class); | |||||
super(Void.class, ""); | |||||
registerRpc(new RowAwareRendererRpc() { | registerRpc(new RowAwareRendererRpc() { | ||||
@Override | @Override | ||||
public void clicky(String key) { | public void clicky(String key) { |