package org.vaadin.viritin.v7;
import com.vaadin.annotations.Theme;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.v7.ui.NativeSelect;
import com.vaadin.ui.Notification;
import org.vaadin.addonhelpers.AbstractTest;
import org.vaadin.viritin.button.MButton;
import org.vaadin.viritin.v7.fields.EnumSelect;
import org.vaadin.viritin.v7.fields.AbstractElementCollection;
import org.vaadin.viritin.v7.fields.ElementCollectionField;
import org.vaadin.viritin.v7.fields.ElementCollectionTable;
import org.vaadin.viritin.v7.fields.MTextField;
import org.vaadin.viritin.v7.form.AbstractForm;
import org.vaadin.viritin.layouts.MVerticalLayout;
import org.vaadin.viritin.testdomain.Address;
import org.vaadin.viritin.testdomain.Address.AddressType;
import org.vaadin.viritin.testdomain.Person;
import org.vaadin.viritin.testdomain.Service;
/**
*
* @author Matti Tahvonen
*/
@Theme("valo")
public class ElementCollections extends AbstractTest {
static AbstractElementCollection.ElementAddedListener<Address> addedListener = new AbstractElementCollection.ElementAddedListener<Address>() {
private static final long serialVersionUID = 9185802788725574433L;
@Override
public void elementAdded(
AbstractElementCollection.ElementAddedEvent<Address> e) {
Notification.show("Added row: " + e.getElement());
}
};
static AbstractElementCollection.ElementRemovedListener<Address> removeListener = new AbstractElementCollection.ElementRemovedListener<Address>() {
private static final long serialVersionUID = -3928632995123662365L;
@Override
public void elementRemoved(
AbstractElementCollection.ElementRemovedEvent<Address> e) {
Notification.show("Removed row: " + e.getElement());
}
};
public static class AddressRow {
EnumSelect type = new EnumSelect();
MTextField street = new MTextField().withInputPrompt("street");
MTextField city = new MTextField().withInputPrompt("city");
MTextField zipCode = new MTextField().withInputPrompt("zip");
}
public static class AddressRow2 {
NativeSelect type = new NativeSelect();
MTextField street = new MTextField().withInputPrompt("street");
MTextField city = new MTextField().withInputPrompt("city");
MTextField zipCode = new MTextField().withInputPrompt("zip");
}
public static class PersonFormManualAddressAddition<Person> extends AbstractForm {
private static final long serialVersionUID = 8579572690133496196L;
private final ElementCollectionField<Address> addresses
= new ElementCollectionField<>(Address.class,
AddressRow2.class).withCaption("Addressess").
setAllowNewElements(false).
setAllowRemovingItems(false).
addElementAddedListener(addedListener).
addElementRemovedListener(removeListener);
private final Button add = new MButton("Add row", new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
Address a = new Address();
addresses.addElement(a);
}
});
private final Button remove = new MButton("Remove first",
new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
Address a = (Address) addresses.getValue().iterator().
next();
addresses.removeElement(a);
}
});
@Override
protected Component createContent() {
/**
* In simple cases the editor row instance don't need to be
* configured or it can be instantiated automatically with empty
* parameter constructor. This would work here as well, but as an
* example lets override the instantiation strategy, where in real
* life you could e.g. populate options to selects from your
* backend.
*/
addresses.setEditorInstantiator(
new AbstractElementCollection.Instantiator<AddressRow2>() {
private static final long serialVersionUID = -5211408262496520519L;
@Override
public AddressRow2 create() {
AddressRow2 addressRow = new AddressRow2();
// Not using EnumSelect here as an example, so
// populating manually.
addressRow.type.addItems((Object[]) AddressType.values());
return addressRow;
}
});
return new MVerticalLayout(
addresses,
add,
remove,
getToolbar()
);
}
}
public static class PersonForm2<Person> extends AbstractForm {
private static final long serialVersionUID = 1463453706744010258L;
private final ElementCollectionTable<Address> addresses
= new ElementCollectionTable<Address>(Address.class,
AddressRow.class).withCaption(
"Addressess").addElementAddedListener(addedListener).
addElementRemovedListener(removeListener).setPropertyHeader("zipCode", "Postal code");
@Override
protected Component createContent() {
return new MVerticalLayout(
addresses,
getToolbar()
);
}
}
@Override
public Component getTestComponent() {
PersonFormManualAddressAddition form = new PersonFormManualAddressAddition();
Person p = Service.getPerson();
form.setEntity(p);
form.setSavedHandler(new AbstractForm.SavedHandler<Person>() {
private static final long serialVersionUID = 2098273655384131557L;
@Override
public void onSave(Person entity) {
Notification.show(entity.toString());
}
});
Person p2 = Service.getPerson();
PersonForm2<Person> form2 = new PersonForm2<>();
form2.setEntity(p2);
form2.setSavedHandler(new AbstractForm.SavedHandler<Person>() {
private static final long serialVersionUID = -4210316283038307410L;
@Override
public void onSave(Person entity) {
Notification.show(entity.toString());
}
});
return new MVerticalLayout(form, form2);
}
@Override
protected void setup() {
super.setup();
content.setSizeUndefined();
}
}