]> source.dussan.org Git - vaadin-framework.git/commitdiff
Added generics to FieldBinderFieldFactory
authorArtur Signell <artur@vaadin.com>
Mon, 19 Dec 2011 14:01:11 +0000 (16:01 +0200)
committerArtur Signell <artur@vaadin.com>
Mon, 19 Dec 2011 14:41:06 +0000 (16:41 +0200)
src/com/vaadin/data/fieldbinder/DefaultFieldBinderFieldFactory.java
src/com/vaadin/data/fieldbinder/FieldBinderFieldFactory.java
src/com/vaadin/data/fieldbinder/FormBuilder.java

index 18a979cf655d82522fa4a4d82537e3b9fc73c099..95fa24f23355f6223afe7773159b474fe6ee2b76 100644 (file)
@@ -23,7 +23,7 @@ public class DefaultFieldBinderFieldFactory implements FieldBinderFieldFactory {
 \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
@@ -33,12 +33,12 @@ public class DefaultFieldBinderFieldFactory implements FieldBinderFieldFactory {
         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
@@ -68,41 +68,41 @@ public class DefaultFieldBinderFieldFactory implements FieldBinderFieldFactory {
         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
@@ -113,7 +113,6 @@ public class DefaultFieldBinderFieldFactory implements FieldBinderFieldFactory {
      */\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
index 3d4b0b49a3ac2038eb5aad2c98126f50dd62433e..5af4d2254613a57ef5776c43b6dc4088600c4d21 100644 (file)
@@ -27,5 +27,5 @@ public interface FieldBinderFieldFactory extends Serializable {
      * @return A field that can be assigned to the given fieldType and that is\r
      *         capable of editing the given type of data\r
      */\r
-    Field<?> createField(Class<?> dataType, Class<? extends Field> fieldType);\r
+    <T extends Field> T createField(Class<?> dataType, Class<T> fieldType);\r
 }\r
index c5f88185b192ff6a813bfe2cfef40e4a29506bdd..3e78fa85e6310cc56bd7fefe8a2e02af9b7d5d40 100644 (file)
@@ -90,6 +90,24 @@ public class FormBuilder implements Serializable {
 \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
@@ -105,9 +123,9 @@ public class FormBuilder implements Serializable {
      *            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
@@ -128,11 +146,11 @@ public class FormBuilder implements Serializable {
      *            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