package com.googlecode.tawus.components;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.Locale;
import org.apache.tapestry5.Binding;
import org.apache.tapestry5.BindingConstants;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.FieldValidationSupport;
import org.apache.tapestry5.FieldValidator;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.ValidationException;
import org.apache.tapestry5.ValidationTracker;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.corelib.base.AbstractField;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
import org.apache.tapestry5.services.ComponentDefaultProvider;
import org.apache.tapestry5.services.Request;
/**
* A simple date field which does not contain a date picker. It is sometimes
* required for have a date picker which is required for time only
*/
public class SimpleDateField extends AbstractField
{
@Parameter(required = true, principal = true, autoconnect = true)
private Date value;
@Parameter(allowNull = false, defaultPrefix = BindingConstants.LITERAL)
private DateFormat format;
@Parameter(defaultPrefix = BindingConstants.VALIDATE)
private FieldValidator<Object> validate;
@Environmental
private ValidationTracker validationTracker;
@Inject
private FieldValidationSupport fieldValidationSupport;
@Inject
private ComponentDefaultProvider defaultProvider;
@Inject
private ComponentResources resources;
@Inject
private Request request;
@Inject
private Messages messages;
@Inject
private Locale locale;
DateFormat defaultFormat()
{
final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, locale);
dateFormat.setLenient(false);
return dateFormat;
}
final Binding defaultValidate()
{
return defaultProvider.defaultValidatorBinding("value", resources);
}
@Override
protected void processSubmission(String elementName)
{
String value = request.getParameter(elementName);
validationTracker.recordInput(this, value);
Date parseValue = null;
try
{
if(InternalUtils.isNonBlank(value))
{
parseValue = format.parse(value);
}
}
catch(ParseException pe)
{
validationTracker.recordError(this, messages.format("date-value-not-parseable", value));
return;
}
putPropertyNameIntoBeanValidationContext("value");
try
{
fieldValidationSupport.validate(parseValue, resources, validate);
this.value = parseValue;
}
catch(ValidationException ve)
{
validationTracker.recordError(this, ve.getMessage());
}
removePropertyNameFromBeanValidationContext();
}
void beginRender(MarkupWriter writer)
{
String value = validationTracker.getInput(this);
if(value == null)
{
value = formatCurrentValue();
}
writer.element("input", "type", "text", "value", value, "id", getClientId(), "name", getControlName());
if(isDisabled())
{
writer.attributes("disabled", "disabled");
}
putPropertyNameIntoBeanValidationContext("value");
validate.render(writer);
removePropertyNameFromBeanValidationContext();
resources.renderInformalParameters(writer);
decorateInsideField();
writer.end();
}
private String formatCurrentValue()
{
final String value;
if(this.value == null)
{
value = "";
}
else
{
value = format.format(this.value);
}
return value;
}
@Override
public boolean isRequired()
{
return validate.isRequired();
}
}