package org.tynamo.pages; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.Locale; import org.apache.tapestry5.Block; import org.apache.tapestry5.FieldTranslator; import org.apache.tapestry5.FieldValidator; import org.apache.tapestry5.SelectModel; import org.apache.tapestry5.ValueEncoder; import org.apache.tapestry5.annotations.Component; import org.apache.tapestry5.annotations.Environmental; import org.apache.tapestry5.annotations.InjectComponent; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.corelib.components.RadioGroup; import org.apache.tapestry5.corelib.components.Select; import org.apache.tapestry5.corelib.components.TextField; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.services.TypeCoercer; import org.apache.tapestry5.util.EnumSelectModel; import org.apache.tapestry5.util.EnumValueEncoder; import org.tynamo.descriptor.TynamoPropertyDescriptor; import org.tynamo.search.SearchFilterOperator; import org.tynamo.services.DescriptorService; import org.tynamo.services.PropertySearchFilterContext; import org.tynamo.services.TynamoBeanContext; public class PropertySearchFilterBlocks { @Environmental @Property(write = false) private PropertySearchFilterContext context; @Component(parameters = { "value=context.lowValue", "label=prop:context.label", "translate=prop:textFieldTranslator", "validate=prop:textFieldValidator", "clientId=prop:context.propertyId", "annotationProvider=context" }) private TextField textField; @Component(parameters = { "value=context.lowValue", "label=prop:context.label", "encoder=valueEncoderForProperty", "model=selectModelForProperty", "validate=prop:enumSearchFilterValidator", "clientId=prop:context.propertyId" }) private Select enumSearchFilter; @Component(parameters = { "value=context.lowValue", "label=prop:context.label", "clientId=prop:context.propertyId", "encoder=booleanValueEncoder" }) private RadioGroup booleanSearchFilter; @Component(parameters = { "value=context.operatorValue", "label=prop:context.label", "clientId=prop:context.operatorId", "encoder=searchFilterOperatorEncoder" }) private RadioGroup numberSearchFilterOperator; // @Component(parameters = { "value=context.operatorValue", "label=prop:context.label", // "clientId=prop:context.operatorId" }) // private RadioGroup searchFilterOperator; public boolean getFilterEnabled() { return context.isEnabled(); } public void setFilterEnabled(boolean value) { context.setEnabled(value); } @Inject private DescriptorService descriptorService; @Inject private Locale locale; @Inject private TypeCoercer typeCoercer; @Environmental(false) @Property(write = false) private TynamoBeanContext tynamoBeanContext; @Inject @Property private Block missingAdvisor; public TynamoPropertyDescriptor getPropertyDescriptor() { return descriptorService.getClassDescriptor(tynamoBeanContext.getBeanType()) .getPropertyDescriptor(context.getPropertyId()); } public DateFormat getDateFormat() { String format = getPropertyDescriptor().getFormat(); return format != null ? new SimpleDateFormat(format) : DateFormat.getDateInstance(java.text.DateFormat.MEDIUM, locale); } public NumberFormat getNumberFormat() { String format = getPropertyDescriptor().getFormat(); return format != null ? new DecimalFormat(format) : NumberFormat.getInstance(locale); } public FieldTranslator getTextFieldTranslator() { return context.getTranslator(textField); } public FieldValidator getTextFieldValidator() { return context.getValidator(textField); } @InjectComponent TextField numberFieldEq; public FieldTranslator getNumberFieldTranslator() { return context.getTranslator(numberFieldEq); } public FieldValidator getNumberFieldValidator() { return context.getValidator(numberFieldEq); } public FieldValidator getEnumSearchFilterValidator() { return context.getValidator(enumSearchFilter); } /** * Provide a value encoder for an enum type. */ @SuppressWarnings("unchecked") public ValueEncoder getValueEncoderForProperty() { return new EnumValueEncoder(typeCoercer, context.getPropertyType()); } /** * Provide a value encoder for an enum type. */ @SuppressWarnings("unchecked") public ValueEncoder getSearchFilterOperatorEncoder() { return new EnumValueEncoder(typeCoercer, SearchFilterOperator.class); } public ValueEncoder getBooleanValueEncoder() { return new ValueEncoder<Boolean>() { public String toClient(Boolean value) { return value == null ? "" : value.toString(); } public Boolean toValue(String clientValue) { return clientValue.equals("") ? null : Boolean.valueOf(clientValue); } }; } @SuppressWarnings("unchecked") public SearchFilterOperator toOperator(String value) { return SearchFilterOperator.valueOf(value); } /** * Provide a select mode for an enum type. */ @SuppressWarnings("unchecked") public SelectModel getSelectModelForProperty() { return new EnumSelectModel(context.getPropertyType(), context.getContainerMessages()); } }