\r
public static final Object CAPTION_PROPERTY_ID = "Caption";\r
\r
- public Field createField(Class<?> type, Class<? extends Field> fieldType) {\r
+ public <T extends Field> T createField(Class<?> type, Class<T> fieldType) {\r
if (Enum.class.isAssignableFrom(type)) {\r
return createEnumField(type, fieldType);\r
} else if (Boolean.class.isAssignableFrom(type)\r
return createDefaultField(type, fieldType);\r
}\r
\r
- private Field createEnumField(Class<?> type,\r
- Class<? extends Field> fieldType) {\r
+ private <T extends Field> T createEnumField(Class<?> type,\r
+ Class<T> fieldType) {\r
if (AbstractSelect.class.isAssignableFrom(fieldType)) {\r
AbstractSelect s = createCompatibleSelect((Class<? extends AbstractSelect>) fieldType);\r
populateWithEnumData(s, (Class<? extends Enum>) type);\r
- return s;\r
+ return (T) s;\r
}\r
\r
return null;\r
return select;\r
}\r
\r
- protected Field createBooleanField(Class<? extends Field> fieldType) {\r
+ protected <T extends Field> T createBooleanField(Class<T> fieldType) {\r
if (fieldType.isAssignableFrom(CheckBox.class)) {\r
CheckBox cb = new CheckBox(null);\r
cb.setImmediate(true);\r
- return cb;\r
+ return (T) cb;\r
} else if (AbstractTextField.class.isAssignableFrom(fieldType)) {\r
- return createAbstractTextField((Class<? extends AbstractTextField>) fieldType);\r
+ return (T) createAbstractTextField((Class<? extends AbstractTextField>) fieldType);\r
}\r
\r
return null;\r
}\r
\r
- protected AbstractTextField createAbstractTextField(\r
- Class<? extends AbstractTextField> fieldType) {\r
+ protected <T extends AbstractTextField> T createAbstractTextField(\r
+ Class<T> fieldType) {\r
if (fieldType.isAssignableFrom(PasswordField.class)) {\r
PasswordField pf = new PasswordField();\r
pf.setImmediate(true);\r
- return pf;\r
+ return (T) pf;\r
} else if (fieldType.isAssignableFrom(TextField.class)) {\r
TextField tf = new TextField();\r
tf.setImmediate(true);\r
- return tf;\r
+ return (T) tf;\r
} else if (fieldType.isAssignableFrom(TextArea.class)) {\r
TextArea ta = new TextArea();\r
ta.setImmediate(true);\r
- return ta;\r
+ return (T) ta;\r
}\r
\r
return null;\r
}\r
\r
- protected Field createDefaultField(Class<?> type,\r
- Class<? extends Field> fieldType) {\r
+ protected <T extends Field> T createDefaultField(Class<?> type,\r
+ Class<T> fieldType) {\r
if (AbstractTextField.class.isAssignableFrom(fieldType)) {\r
- return createAbstractTextField((Class<? extends AbstractTextField>) fieldType);\r
+ return (T) createAbstractTextField((Class<? extends AbstractTextField>) fieldType);\r
}\r
return null;\r
}\r
*/\r
protected void populateWithEnumData(AbstractSelect select,\r
Class<? extends Enum> enumClass) {\r
- // TODO EnumContainer?\r
select.removeAllItems();\r
for (Object p : select.getContainerPropertyIds()) {\r
select.removeContainerProperty(p);\r
\r
}\r
\r
+ /**\r
+ * Builds a field using the given caption and binds it to the given property\r
+ * id using the field binder. Ensures the new field is of the given type.\r
+ * \r
+ * @param caption\r
+ * The caption for the field\r
+ * @param propertyId\r
+ * The property id to bind to. Must be present in the field\r
+ * finder.\r
+ * @return The created and bound field. Can be any type of {@link Field}.\r
+ */\r
+ public <T extends Field> T buildAndBind(String caption, Object propertyId,\r
+ Class<T> fieldType) {\r
+ Class<?> type = getFieldBinder().getPropertyType(propertyId);\r
+ return buildAndBind(caption, propertyId, type, fieldType);\r
+\r
+ }\r
+\r
/**\r
* Builds a field with the given type and binds it to the given property id\r
* using the field binder.\r
* The type of field we want to create\r
* @return The created and bound field\r
*/\r
- protected Field<?> buildAndBind(String caption, Object propertyId,\r
- Class<?> type, Class<? extends Field> fieldType) {\r
- Field<?> field = build(caption, type, fieldType);\r
+ protected <T extends Field> T buildAndBind(String caption,\r
+ Object propertyId, Class<?> type, Class<T> fieldType) {\r
+ T field = build(caption, type, fieldType);\r
fieldBinder.bind(field, propertyId);\r
return field;\r
}\r
* The type of field that we want to create\r
* @return A Field capable of editing the given type\r
*/\r
- protected Field<?> build(String caption, Class<?> dataType,\r
- Class<? extends Field> fieldType) {\r
+ protected <T extends Field> T build(String caption, Class<?> dataType,\r
+ Class<T> fieldType) {\r
logger.finest("Building a field with caption " + caption + " of type "\r
+ dataType.getName());\r
- Field<?> field = getFieldFactory().createField(dataType, fieldType);\r
+ T field = getFieldFactory().createField(dataType, fieldType);\r
if (field == null) {\r
throw new BuildException("Unable to build a field of type "\r
+ fieldType.getName() + " for editing "\r