package org.vaadin.viritin.v7;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.vaadin.addonhelpers.AbstractTest;
import org.vaadin.viritin.v7.fields.IntegerField;
import org.vaadin.viritin.v7.fields.MTextField;
import org.vaadin.viritin.v7.fields.SubSetSelector;
import org.vaadin.viritin.v7.form.AbstractForm;
import org.vaadin.viritin.fields.CaptionGenerator;
import org.vaadin.viritin.layouts.MFormLayout;
import org.vaadin.viritin.layouts.MVerticalLayout;
import org.vaadin.viritin.testdomain.Person;
import org.vaadin.viritin.testdomain.Service;
import com.vaadin.annotations.Theme;
import com.vaadin.v7.data.Property;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.Notification;
/**
* Subset selector is a component that is designed to pick an handful of objects
* from a larger set of option.
*
* @author Matti Tahvonen
*/
@Theme("valo")
public class SubSetSelectorExample extends AbstractTest {
@Override
public Component getTestComponent() {
SubSetSelector<Person> sss = new SubSetSelector<Person>(Person.class) {
private static final long serialVersionUID = 3761463604053463442L;
@Override
protected Person instantiateOption(String stringInput) {
Person person = new Person();
if(stringInput != null) {
String[] split = stringInput.split(" ", 2);
person.setFirstName(split[0]);
if(split.length > 1) {
person.setLastName(split[1]);
}
}
// required field, but not used in form, in this test case
person.setAge(69);
return person;
}
};
List<Person> available = Service.getListOfPersons(100);
CaptionGenerator<Person> cg = option -> option.getFirstName() + " " + option.getLastName();
// New Items can be added with combobox text if needed, String goes to instantiateOption method
sss.setNewItemsAllowed(true);
// This is optional and can replace setNewItemsAllowed as well (then new items using + button)
sss.setNewInstanceForm(new AbstractForm<Person>() {
private static final long serialVersionUID = 2112187966786117814L;
MTextField firstName = new MTextField("First name");
MTextField lastName = new MTextField("Last name");
@Override
protected Component createContent() {
return new MFormLayout(firstName, lastName, getToolbar());
}
@Override
protected void adjustSaveButtonState() {
// Always enabled as just adding new ones and option may be valid with combobox input alone
}
});
sss.setNewInstanceForm(null);
sss.setCaptionGenerator(cg);
sss.setVisibleProperties("firstName", "lastName", "age");
sss.setOptions(available);
Set<Person> selected = new HashSet<>();
selected.add(available.get(3));
sss.setValue(selected);
sss.addValueChangeListener((Property.ValueChangeEvent event) -> {
Notification.show("Value now :" + sss.getValue());
});
Button setNull = new Button("setValue(null)");
setNull.addClickListener(e->{sss.setValue(null);});
Button setList = new Button("setValue(new ArrayList())");
setList.addClickListener(e->{sss.setValue(new ArrayList());});
IntegerField limitField = new IntegerField("Selection limit");
limitField.addValueChangeListener(e -> sss.setLimit(((Integer) e.getProperty().getValue()).intValue()));
return new MVerticalLayout(sss, setNull, setList, limitField);
}
}