/*
* 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.ui.renderers;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;
import com.vaadin.shared.ui.grid.renderers.LocalDateRendererState;
import elemental.json.JsonValue;
/**
* A renderer for presenting date values.
*
* @author Vaadin Ltd
* @since 8.1
*/
public class LocalDateRenderer extends AbstractRenderer<Object, LocalDate> {
private DateTimeFormatter formatter;
private boolean getLocaleFromGrid;
/**
* Creates a new LocalDateRenderer.
* <p>
* The renderer is configured to render with the grid's locale it is
* attached to, with the format style being {@code FormatStyle.LONG} and an
* empty string as its null representation.
*
* @see <a href=
* "https://docs.oracle.com/javase/8/docs/api/java/time/format/FormatStyle.html#LONG">
* FormatStyle.LONG</a>
*/
public LocalDateRenderer() {
this(DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG), "");
getLocaleFromGrid = true;
}
/**
* Creates a new LocalDateRenderer.
* <p>
* The renderer is configured to render with the given string format, as
* displayed in the grid's locale it is attached to, with an empty string as
* its null representation.
*
* @param formatPattern
* the format pattern to format the date with, not {@code null}
*
* @throws IllegalArgumentException
* if format pattern is null
*
* @see <a href=
* "https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns">
* Format Pattern Syntax</a>
*/
public LocalDateRenderer(String formatPattern) {
this(formatPattern, Locale.getDefault());
getLocaleFromGrid = true;
}
/**
* Creates a new LocalDateRenderer.
* <p>
* The renderer is configured to render with the given string format, as
* displayed in the given locale, with an empty string as its null
* representation.
*
* @param formatPattern
* the format pattern to format the date with, not {@code null}
* @param locale
* the locale to use, not {@code null}
*
* @throws IllegalArgumentException
* if format pattern is null
* @throws IllegalArgumentException
* if locale is null
*
* @see <a href=
* "https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns">
* Format Pattern Syntax</a>
*/
public LocalDateRenderer(String formatPattern, Locale locale) {
this(formatPattern, locale, "");
}
/**
* Creates a new LocalDateRenderer.
* <p>
* The renderer is configured to render with the given string format, as
* displayed in the given locale.
*
* @param formatPattern
* the format pattern to format the date with, not {@code null}
* @param locale
* the locale to use, not {@code null}
* @param nullRepresentation
* the textual representation of the {@code null} value
*
* @throws IllegalArgumentException
* if format pattern is null
* @throws IllegalArgumentException
* if locale is null
*
* @see <a href=
* "https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns">
* Format Pattern Syntax</a>
*/
public LocalDateRenderer(String formatPattern, Locale locale,
String nullRepresentation) {
super(LocalDate.class, nullRepresentation);
if (formatPattern == null) {
throw new IllegalArgumentException(
"format pattern may not be null");
}
if (locale == null) {
throw new IllegalArgumentException("locale may not be null");
}
formatter = DateTimeFormatter.ofPattern(formatPattern, locale);
}
/**
* Creates a new LocalDateRenderer.
* <p>
* The renderer is configured to render with the given formatter, with an
* empty string as its null representation.
*
* @param formatter
* the formatter to use, not {@code null}
*
* @throws IllegalArgumentException
* if formatter is null
*/
public LocalDateRenderer(DateTimeFormatter formatter) {
this(formatter, "");
}
/**
* Creates a new LocalDateRenderer.
* <p>
* The renderer is configured to render with the given formatter.
*
* @param formatter
* the formatter to use, not {@code null}
* @param nullRepresentation
* the textual representation of the {@code null} value
*
* @throws IllegalArgumentException
* if formatter is null
*/
public LocalDateRenderer(DateTimeFormatter formatter,
String nullRepresentation) {
super(LocalDate.class, nullRepresentation);
if (formatter == null) {
throw new IllegalArgumentException("formatter may not be null");
}
this.formatter = formatter;
}
@Override
public JsonValue encode(LocalDate value) {
String dateString;
if (value == null) {
dateString = getNullRepresentation();
} else if (getLocaleFromGrid) {
if (getParentGrid() == null) {
throw new IllegalStateException(
"Could not find a locale to format with: "
+ "this renderer should either be attached to a grid "
+ "or constructed with locale information");
}
dateString = value
.format(formatter.withLocale(getParentGrid().getLocale()));
} else {
dateString = value.format(formatter);
}
return encode(dateString, String.class);
}
@Override
protected LocalDateRendererState getState() {
return (LocalDateRendererState) super.getState();
}
@Override
protected LocalDateRendererState getState(boolean markAsDirty) {
return (LocalDateRendererState) super.getState(markAsDirty);
}
}