diff options
author | Matti Tahvonen <matti.tahvonen@itmill.com> | 2009-05-11 14:34:10 +0000 |
---|---|---|
committer | Matti Tahvonen <matti.tahvonen@itmill.com> | 2009-05-11 14:34:10 +0000 |
commit | 064bc4fe71fa23c9e4a3758e8ff824aeb533686d (patch) | |
tree | fb14da2180bfe354ec5acb8cc6a5b19fc4f844b1 /src/com/vaadin/ui/DefaultFieldFactory.java | |
parent | 64d30355cd9f09ba0faff690fd798abc79533a8e (diff) | |
download | vaadin-framework-064bc4fe71fa23c9e4a3758e8ff824aeb533686d.tar.gz vaadin-framework-064bc4fe71fa23c9e4a3758e8ff824aeb533686d.zip |
Split old FieldFactory into two smaller interfaces. #2499
svn changeset:7744/svn branch:6.0
Diffstat (limited to 'src/com/vaadin/ui/DefaultFieldFactory.java')
-rw-r--r-- | src/com/vaadin/ui/DefaultFieldFactory.java | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/com/vaadin/ui/DefaultFieldFactory.java b/src/com/vaadin/ui/DefaultFieldFactory.java new file mode 100644 index 0000000000..048034a7a9 --- /dev/null +++ b/src/com/vaadin/ui/DefaultFieldFactory.java @@ -0,0 +1,138 @@ +package com.vaadin.ui; + +import java.util.Date; + +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; + +/** + * This class contains basic implementation for both {@link FormFieldFactory} + * and {@link TableFieldFactory}. The class is singleton, use {@link #get()} + * method to get reference to the instance. + * + * <p> + * There are also some static helper methods available for custom built field + * factories. + * + */ +public class DefaultFieldFactory implements FormFieldFactory, TableFieldFactory { + + private static final DefaultFieldFactory instance = new DefaultFieldFactory(); + + /** + * Singleton method to get an instance of DefaultFieldFactory. + * + * @return an instance of DefaultFieldFactory + */ + public static DefaultFieldFactory get() { + return instance; + } + + protected DefaultFieldFactory() { + } + + private static final long serialVersionUID = -8051489865928478009L; + + public Field createField(Item item, Object propertyId, Component uiContext) { + Class<?> type = item.getItemProperty(propertyId).getType(); + Field field = createFieldByPropertyType(type); + field.setCaption(createCaptionByPropertyId(propertyId)); + return field; + } + + public Field createField(Container container, Object itemId, + Object propertyId, Component uiContext) { + Property containerProperty = container.getContainerProperty(itemId, + propertyId); + Class<?> type = containerProperty.getType(); + Field field = createFieldByPropertyType(type); + field.setCaption(createCaptionByPropertyId(propertyId)); + return field; + } + + /** + * If name follows method naming conventions, convert the name to spaced + * upper case text. For example, convert "firstName" to "First Name" + * + * @param propertyId + * @return the formatted caption string + */ + public static String createCaptionByPropertyId(Object propertyId) { + String name = propertyId.toString(); + if (name.length() > 0) { + + if (name.indexOf(' ') < 0 + && name.charAt(0) == Character.toLowerCase(name.charAt(0)) + && name.charAt(0) != Character.toUpperCase(name.charAt(0))) { + StringBuffer out = new StringBuffer(); + out.append(Character.toUpperCase(name.charAt(0))); + int i = 1; + + while (i < name.length()) { + int j = i; + for (; j < name.length(); j++) { + char c = name.charAt(j); + if (Character.toLowerCase(c) != c + && Character.toUpperCase(c) == c) { + break; + } + } + if (j == name.length()) { + out.append(name.substring(i)); + } else { + out.append(name.substring(i, j)); + out.append(" " + name.charAt(j)); + } + i = j + 1; + } + + name = out.toString(); + } + } + return name; + } + + /** + * Creates fields based on the property type. + * <p> + * The default field type is {@link TextField}. Other field types generated + * by this method: + * <p> + * <b>Boolean</b>: {@link CheckBox}.<br/> + * <b>Date</b>: {@link DateField}(resolution: day).<br/> + * <b>Item</b>: {@link Form}. <br/> + * <b>default field type</b>: {@link TextField}. + * <p> + * + * @param type + * the type of the property + * @return the most suitable generic {@link Field} for given type + */ + public static Field createFieldByPropertyType(Class<?> type) { + // Null typed properties can not be edited + if (type == null) { + return null; + } + + // Item field + if (Item.class.isAssignableFrom(type)) { + return new Form(); + } + + // Date field + if (Date.class.isAssignableFrom(type)) { + final DateField df = new DateField(); + df.setResolution(DateField.RESOLUTION_DAY); + return df; + } + + // Boolean field + if (Boolean.class.isAssignableFrom(type)) { + return new CheckBox(); + } + + return new TextField(); + } + +} |