package com.vaadin.tests.fieldgroup;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.tests.data.bean.Address;
import com.vaadin.tests.data.bean.Country;
import com.vaadin.tests.data.bean.Person;
import com.vaadin.tests.data.bean.Sex;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Panel;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.v7.data.fieldgroup.BeanFieldGroup;
import com.vaadin.v7.data.fieldgroup.FieldGroup;
import com.vaadin.v7.data.fieldgroup.FieldGroup.CommitEvent;
import com.vaadin.v7.data.fieldgroup.FieldGroup.CommitException;
import com.vaadin.v7.data.fieldgroup.FieldGroup.CommitHandler;
import com.vaadin.v7.data.util.BeanItem;
import com.vaadin.v7.data.util.converter.StringToBooleanConverter;
import com.vaadin.v7.data.validator.EmailValidator;
import com.vaadin.v7.data.validator.IntegerRangeValidator;
import com.vaadin.v7.data.validator.StringLengthValidator;
import com.vaadin.v7.ui.Table;
import com.vaadin.v7.ui.TextArea;
import com.vaadin.v7.ui.TextField;
public class BasicPersonForm extends AbstractTestUIWithLog {
private TextField firstName;
private TextArea lastName;
private TextField email;
private TextField age;
private Table sex;
private TextField deceased;
public class Configuration {
public boolean preCommitFails = false;
public boolean postCommitFails = false;
public boolean isPreCommitFails() {
return preCommitFails;
}
public void setPreCommitFails(boolean preCommitFails) {
this.preCommitFails = preCommitFails;
}
public boolean isPostCommitFails() {
return postCommitFails;
}
public void setPostCommitFails(boolean postCommitFails) {
this.postCommitFails = postCommitFails;
}
}
private Configuration configuration = new Configuration();
private class ConfigurationPanel extends Panel {
private CheckBox preCommitCheckBox = new CheckBox("Pre Commit Fails",
configuration.isPreCommitFails());
private CheckBox postCommitCheckBox = new CheckBox("Post Commit Fails",
configuration.isPostCommitFails());
public ConfigurationPanel() {
super("Configuration", new VerticalLayout());
((VerticalLayout) getContent()).setMargin(true);
preCommitCheckBox.addValueChangeListener(
event -> configuration.setPreCommitFails(event.getValue()));
postCommitCheckBox.addValueChangeListener(event -> configuration
.setPostCommitFails(event.getValue()));
((ComponentContainer) getContent()).addComponents(preCommitCheckBox,
postCommitCheckBox);
}
}
@Override
protected void setup(VaadinRequest request) {
addComponent(log);
Panel confPanel = new ConfigurationPanel();
addComponent(confPanel);
final FieldGroup fieldGroup = new BeanFieldGroup<>(Person.class);
fieldGroup.addCommitHandler(new CommitHandler() {
@Override
public void preCommit(CommitEvent commitEvent)
throws CommitException {
if (configuration.preCommitFails) {
throw new CommitException(
"Error in preCommit because first name is "
+ getPerson(commitEvent.getFieldBinder())
.getFirstName());
}
}
@Override
public void postCommit(CommitEvent commitEvent)
throws CommitException {
if (configuration.postCommitFails) {
throw new CommitException(
"Error in postCommit because first name is "
+ getPerson(commitEvent.getFieldBinder())
.getFirstName());
}
}
});
fieldGroup.setBuffered(true);
fieldGroup.buildAndBindMemberFields(this);
addComponent(firstName);
addComponent(lastName);
addComponent(email);
addComponent(age);
addComponent(sex);
addComponent(deceased);
Button commitButton = new Button("Commit", new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
String msg = "Commit succesful";
try {
fieldGroup.commit();
} catch (CommitException e) {
msg = "Commit failed: " + e.getMessage();
}
Notification notification = new Notification(msg);
notification.setDelayMsec(Notification.DELAY_FOREVER);
notification.show(getPage());
log(msg);
}
});
Button discardButton = new Button("Discard",
new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
fieldGroup.discard();
log("Discarded changes");
}
});
Button showBean = new Button("Show bean values",
new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
log(getPerson(fieldGroup).toString());
}
});
addComponent(commitButton);
addComponent(discardButton);
addComponent(showBean);
email.addValidator(new EmailValidator("Must be a valid address"));
lastName.addValidator(new StringLengthValidator("Must be min 5 chars",
5, null, true));
age.addValidator(new IntegerRangeValidator(
"Must be between 0 and 150, {0} is not", 0, 150));
sex.setPageLength(0);
deceased.setConverter(new StringToBooleanConverter() {
@Override
protected String getTrueString() {
return "YAY!";
}
@Override
protected String getFalseString() {
return "NAAAAAH";
}
});
Person p = new Person("John", "Doe", "john@doe.com", 64, Sex.MALE,
new Address("John street", 11223, "John's town", Country.USA));
fieldGroup.setItemDataSource(new BeanItem<>(p));
}
@SuppressWarnings("unchecked")
public static Person getPerson(FieldGroup binder) {
return ((BeanItem<Person>) binder.getItemDataSource()).getBean();
}
@Override
protected String getTestDescription() {
return "Basic Person Form";
}
@Override
protected Integer getTicketNumber() {
return 8094;
}
}