package org.aperteworkflow.editor.stepeditor.user;
import com.vaadin.data.util.ObjectProperty;
import com.vaadin.data.validator.IntegerValidator;
import com.vaadin.terminal.Sizeable;
import com.vaadin.ui.*;
import pl.net.bluesoft.rnd.processtool.ui.widgets.form.FormAwareField;
import pl.net.bluesoft.rnd.util.i18n.I18NSource;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.aperteworkflow.util.vaadin.ui.GenericValueFieldFactory;
public class WidgetConfigFormFieldFactory extends GenericValueFieldFactory {
private static final Logger logger = Logger.getLogger(WidgetConfigFormFieldFactory.class.getName());
public Field createField(Property<?> property, Form form) {
Field field = createBaseField(property, form);
if (property.getType() == Integer.class) {
field.addValidator(new IntegerValidator("is.not.an.integer"));
}
if (field instanceof AbstractField) {
AbstractField abstractField = (AbstractField) field;
abstractField.setImmediate(true);
}
if (field instanceof AbstractTextField) {
AbstractTextField textField = (AbstractTextField) field;
textField.setNullRepresentation("");
}
if (field instanceof RichTextArea) {
// RichTextArea does not extend AbstractTextField like TextArea or TextField
RichTextArea textArea = (RichTextArea) field;
textArea.setNullRepresentation("");
}
return field;
}
protected Field createBaseField(Property<?> property, Form form) {
Field field = null;
if (property.getPropertyFieldClass() != null) {
try {
field = property.getPropertyFieldClass().newInstance();
} catch (InstantiationException e) {
logger.log(Level.WARNING, "Failed to create field using class from property", e);
} catch (IllegalAccessException e) {
logger.log(Level.WARNING, "Failed to create field using class from property", e);
}
}
if (field == null) {
field = createFieldByPropertyType(property.getType());
}
if (field instanceof FormAwareField) {
Collection<?> itemPropertyIds = form.getItemPropertyIds();
Map<String, com.vaadin.data.Property> map = new HashMap<String, com.vaadin.data.Property>();
for (Object o : itemPropertyIds){
Property p = (Property) o;
map.put(p.getPropertyId(), p);
}
((FormAwareField)field).setFormProperties(map);
}
field.setPropertyDataSource(property);
field.setRequired(property.isRequired());
field.setWidth(100, Sizeable.UNITS_PERCENTAGE);
if (property.getName() == null) {
field.setCaption(createCaptionByPropertyId(property.getPropertyId()));
} else {
field.setCaption(property.getName());
}
I18NSource messages = I18NSource.ThreadUtil.getThreadI18nSource();
if (property.getDescription() == null) {
field.setDescription(messages.getMessage(
"property.field.description.short.format",
new Object[] { property.getPropertyId() }
));
} else {
field.setDescription(messages.getMessage(
"property.field.description.format",
new Object[] { property.getDescription(), property.getPropertyId() }
));
}
return field;
}
}