001// Licensed under the Apache License, Version 2.0 (the "License"); 002// you may not use this file except in compliance with the License. 003// You may obtain a copy of the License at 004// 005// http://www.apache.org/licenses/LICENSE-2.0 006// 007// Unless required by applicable law or agreed to in writing, software 008// distributed under the License is distributed on an "AS IS" BASIS, 009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 010// See the License for the specific language governing permissions and 011// limitations under the License. 012 013package org.apache.tapestry5.corelib.pages; 014 015import org.apache.tapestry5.FieldTranslator; 016import org.apache.tapestry5.FieldValidator; 017import org.apache.tapestry5.SelectModel; 018import org.apache.tapestry5.ValueEncoder; 019import org.apache.tapestry5.annotations.Component; 020import org.apache.tapestry5.annotations.Environmental; 021import org.apache.tapestry5.corelib.components.*; 022import org.apache.tapestry5.ioc.annotations.Inject; 023import org.apache.tapestry5.ioc.services.TypeCoercer; 024import org.apache.tapestry5.services.BeanBlockContribution; 025import org.apache.tapestry5.services.BeanBlockSource; 026import org.apache.tapestry5.services.PropertyEditContext; 027import org.apache.tapestry5.util.EnumSelectModel; 028import org.apache.tapestry5.util.EnumValueEncoder; 029 030/** 031 * A page that exists to contain blocks used to edit different types of properties. The blocks on this page are 032 * contributed into the {@link BeanBlockSource} service configuration. 033 * 034 * @see BeanBlockContribution 035 * @see BeanEditForm 036 */ 037public class PropertyEditBlocks 038{ 039 @Environmental 040 private PropertyEditContext context; 041 042 @Component( 043 parameters = {"value=context.propertyValue", "label=prop:context.label", 044 "translate=prop:textFieldTranslator", "validate=prop:textFieldValidator", 045 "clientId=prop:context.propertyId", "annotationProvider=context", 046 "ensureClientIdUnique=true"}) 047 private TextField textField; 048 049 @Component( 050 parameters = {"value=context.propertyValue", "label=prop:context.label", 051 "translate=prop:numberFieldTranslator", "validate=prop:numberFieldValidator", 052 "clientId=prop:context.propertyId", "annotationProvider=context", 053 "ensureClientIdUnique=true"}) 054 private TextField numberField; 055 056 057 @Component( 058 parameters = {"value=context.propertyValue", "label=prop:context.label", "encoder=valueEncoderForProperty", 059 "model=selectModelForProperty", "validate=prop:selectValidator", 060 "clientId=prop:context.propertyId", "ensureClientIdUnique=true"}) 061 private Select select; 062 063 @SuppressWarnings("unused") 064 @Component( 065 parameters = {"value=context.propertyValue", "label=prop:context.label", 066 "clientId=prop:context.propertyId", "ensureClientIdUnique=true"}) 067 private Checkbox checkboxField; 068 069 @SuppressWarnings("unused") 070 @Component( 071 parameters = {"value=context.propertyValue", "label=prop:context.label", "clientId=prop:context.propertyid", 072 "validate=prop:dateFieldValidator", "ensureClientIdUnique=true"}) 073 private DateField dateField; 074 075 @SuppressWarnings("unused") 076 @Component( 077 parameters = {"value=context.propertyValue", "label=prop:context.label", "clientId=prop:context.propertyid", 078 "validate=prop:calendarFieldValidator", "ensureClientIdUnique=true"}) 079 private DateField calendarField; 080 081 @Component( 082 parameters = {"value=context.propertyValue", "label=prop:context.label", 083 "translate=prop:passwordFieldTranslator", "validate=prop:passwordFieldValidator", 084 "clientId=prop:context.propertyId", "annotationProvider=context", "ensureClientIdUnique=true"}) 085 private PasswordField passwordField; 086 087 @Component( 088 parameters = {"value=context.propertyValue", "label=prop:context.label", 089 "translate=prop:textAreaTranslator", 090 "validate=prop:textAreaValidator", "clientId=prop:context.propertyId", 091 "annotationProvider=context", "ensureClientIdUnique=true"}) 092 private TextArea textArea; 093 094 095 @Inject 096 private TypeCoercer typeCoercer; 097 098 public PropertyEditContext getContext() 099 { 100 return context; 101 } 102 103 104 public FieldTranslator getTextFieldTranslator() 105 { 106 return context.getTranslator(textField); 107 } 108 109 public FieldValidator getTextFieldValidator() 110 { 111 return context.getValidator(textField); 112 } 113 114 public FieldTranslator getNumberFieldTranslator() 115 { 116 return context.getTranslator(numberField); 117 } 118 119 public FieldValidator getNumberFieldValidator() 120 { 121 return context.getValidator(numberField); 122 } 123 124 public FieldTranslator getPasswordFieldTranslator() 125 { 126 return context.getTranslator(passwordField); 127 } 128 129 public FieldValidator getPasswordFieldValidator() 130 { 131 return context.getValidator(passwordField); 132 } 133 134 public FieldTranslator getTextAreaTranslator() 135 { 136 return context.getTranslator(textArea); 137 } 138 139 public FieldValidator getTextAreaValidator() 140 { 141 return context.getValidator(textArea); 142 } 143 144 145 public FieldValidator getDateFieldValidator() 146 { 147 return context.getValidator(dateField); 148 } 149 150 public FieldValidator getCalendarFieldValidator() 151 { 152 return context.getValidator(calendarField); 153 } 154 155 public FieldValidator getSelectValidator() 156 { 157 return context.getValidator(select); 158 } 159 160 /** 161 * Provide a value encoder for an enum type. 162 */ 163 @SuppressWarnings("unchecked") 164 public ValueEncoder getValueEncoderForProperty() 165 { 166 return new EnumValueEncoder(typeCoercer, context.getPropertyType()); 167 } 168 169 /** 170 * Provide a select mode for an enum type. 171 */ 172 @SuppressWarnings("unchecked") 173 public SelectModel getSelectModelForProperty() 174 { 175 Class propertyType = context.getPropertyType(); 176 if (!Enum.class.isAssignableFrom(propertyType)) 177 { 178 throw new IllegalStateException("Cannot create a select model for property " + context.getPropertyId() 179 + ". The property type is " + propertyType + " which is not an enum class."); 180 } 181 return new EnumSelectModel(propertyType, context.getContainerMessages()); 182 } 183}