com.vaadin.ui.DefaultFieldFactory Maven / Gradle / Ivy
/*
* Vaadin Framework 7
*
* Copyright (C) 2000-2024 Vaadin Ltd
*
* This program is available under Vaadin Commercial License and Service Terms.
*
* See for the full
* license.
*/
package com.vaadin.ui;
import java.util.Date;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.shared.util.SharedUtil;
/**
* This class contains a basic implementation for both {@link FormFieldFactory}
* and {@link TableFieldFactory}. The class is singleton, use {@link #get()}
* method to get reference to the instance.
*
*
* 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() {
}
@Override
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;
}
@Override
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) {
return SharedUtil.propertyIdToHumanFriendly(propertyId);
}
/**
* Creates fields based on the property type.
*
* The default field type is {@link TextField}. Other field types generated
* by this method:
*
* Boolean: {@link CheckBox}.
* Date: {@link DateField}(resolution: day).
* Item: {@link Form}.
* default field type: {@link TextField}.
*
*
* @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();
}
}