package pl.net.bluesoft.rnd.processtool.ui.basewidgets.editor;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.util.BeanItem;
import com.vaadin.data.validator.IntegerValidator;
import com.vaadin.ui.*;
import org.apache.commons.beanutils.BeanUtils;
import org.aperteworkflow.util.vaadin.ui.GenericValueFieldFactory;
import org.aperteworkflow.util.vaadin.ui.GenericValueTextField;
import pl.net.bluesoft.rnd.processtool.ui.basewidgets.xml.jaxb.WidgetElement;
import pl.net.bluesoft.rnd.processtool.ui.basewidgets.xml.validation.XmlValidationError;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AperteDoc;
import java.util.Arrays;
import java.util.List;
import static pl.net.bluesoft.rnd.processtool.ui.basewidgets.editor.EditorHelper.*;
/**
* @author tlipski@bluesoft.net.pl
*/
public class WidgetPropertiesEditorFormComponent extends VerticalLayout {
private Form form;
private Object clone;
private Object itemId;
private ProcessDataHierarchyEditor editor;
public WidgetPropertiesEditorFormComponent(final Object itemId, final ProcessDataHierarchyEditor editor) {
setWidth("100%");
setSpacing(true);
this.itemId = itemId;
this.editor = editor;
final Class classOfItem = itemId.getClass();
clone = clone(itemId);
BeanItem<?> item = new BeanItem<Object>(clone);
form = new Form();
form.setFormFieldFactory(getFieldFactory(classOfItem));
form.setWidth("100%");
form.setWriteThrough(false);
form.setCaption(itemId.getClass().getSimpleName());
form.setItemDataSource(item);
final Button commit = new Button(getLocalizedMessage("commit"));
commit.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
commit();
}
});
addComponent(form);
addComponent(commit);
}
public void commit() {
if (!form.isValid()) {
getApplication().getMainWindow().showNotification(getLocalizedMessage("validation-errors"),
Window.Notification.TYPE_WARNING_MESSAGE);
return;
}
form.commit();
if (clone instanceof WidgetElement) {
List<XmlValidationError> xmlValidationErrors = ((WidgetElement) clone).validateElement();
if (xmlValidationErrors != null && !xmlValidationErrors.isEmpty()) {
String msg = joinValidationErrors(xmlValidationErrors);
getApplication().getMainWindow().showNotification(getLocalizedMessage("validation-errors"),
msg, Window.Notification.TYPE_WARNING_MESSAGE);
return;
}
}
copyProperties(itemId, clone);
editor.refreshRawXmlAndPreview();
}
private void copyProperties(Object dest, Object src) {
try {
BeanUtils.copyProperties(dest, src);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private Object clone(Object itemId) {
final Object clone;
try {
clone = BeanUtils.cloneBean(itemId);
} catch (Exception e) {
throw new RuntimeException(e);
}
return clone;
}
private DefaultFieldFactory getFieldFactory(final Class classOfItem) {
return new GenericValueFieldFactory() {
@Override
public Field createField(Item item, Object propertyId, Component uiContext) {
Property property = item.getItemProperty(propertyId);
Class<?> cls = property.getType();
Class[] supported = new Class[]{String.class, Boolean.class, Integer.class};
if (!Arrays.asList(supported).contains(cls)) {
return null;
}
java.lang.reflect.Field reflectField = findField(propertyId, classOfItem);
if (reflectField != null) {
Field field=null;
field = super.createField(item, propertyId, uiContext);
AvailableOptions opts = reflectField.getAnnotation(AvailableOptions.class);
if (opts != null && opts.value() != null) {
NativeSelect ns = new NativeSelect();
field = ns;
for (String opt : opts.value()) {
ns.addItem(opt);
ns.setItemCaption(opt, getLocalizedMessage(propertyId + "." + opt));
}
}
AperteDoc doc = reflectField.getAnnotation(AperteDoc.class);
if (doc != null) {
field.setCaption(getLocalizedMessage(doc.humanNameKey()));
field.setDescription(getParametrizedLocalizedMessage(
"description.format",
getLocalizedMessage(doc.descriptionKey()),
propertyId
));
} else {
field.setCaption(getLocalizedMessage((String) propertyId));
field.setDescription(getParametrizedLocalizedMessage(
"description.short.format",
propertyId
));
}
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 textArea = (RichTextArea) field;
textArea.setNullRepresentation("");
}
if (cls.equals(Integer.class)) {
field.addValidator(new IntegerValidator(getLocalizedMessage("is.not.an.integer")));
field.setWidth("100px");
} else {
field.setWidth("100%");
}
if (reflectField.getAnnotation(RequiredAttribute.class) != null) {
field.setRequired(true);
}
return field;
}
return null;
}
};
}
public Form getForm() {
return form;
}
public Object getItemId() {
return itemId;
}
}