summaryrefslogtreecommitdiffstats
path: root/src/com/vaadin/ui/DefaultFieldFactory.java
diff options
context:
space:
mode:
authorMatti Tahvonen <matti.tahvonen@itmill.com>2009-05-11 14:34:10 +0000
committerMatti Tahvonen <matti.tahvonen@itmill.com>2009-05-11 14:34:10 +0000
commit064bc4fe71fa23c9e4a3758e8ff824aeb533686d (patch)
treefb14da2180bfe354ec5acb8cc6a5b19fc4f844b1 /src/com/vaadin/ui/DefaultFieldFactory.java
parent64d30355cd9f09ba0faff690fd798abc79533a8e (diff)
downloadvaadin-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.java138
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();
+ }
+
+}