package com.vaadin.tests.components.table; import java.math.BigDecimal; import java.text.NumberFormat; import java.util.Arrays; import java.util.Date; import java.util.Locale; import com.vaadin.tests.components.TestBase; 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.tests.util.Log; import com.vaadin.ui.CheckBox; import com.vaadin.ui.ComboBox; import com.vaadin.v7.data.Property.ValueChangeEvent; import com.vaadin.v7.data.Property.ValueChangeListener; import com.vaadin.v7.data.util.BeanItemContainer; import com.vaadin.v7.data.util.converter.Converter; import com.vaadin.v7.data.util.converter.StringToDoubleConverter; import com.vaadin.v7.ui.Table; public class DoublesInTable extends TestBase { BeanItemContainer<Person> personBeanItemContainer = new BeanItemContainer<>( Person.class); private Table table; private Log log = new Log(5); private ComboBox localeSelect; private CheckBox useCustomConverters; private CheckBox editMode; @Override protected void setup() { editMode = new CheckBox("Edit mode"); editMode.addValueChangeListener( event -> table.setEditable(editMode.getValue())); useCustomConverters = new CheckBox("Use custom converters"); useCustomConverters.addValueChangeListener(event -> recreateTable()); localeSelect = createLocaleSelect(); personBeanItemContainer = createContainer(100); addComponent(log); addComponent(localeSelect); addComponent(useCustomConverters); addComponent(editMode); recreateTable(); } private ComboBox createLocaleSelect() { ComboBox<Locale> cb = new ComboBox<>(null, Arrays.asList(Locale.getAvailableLocales())); cb.setValue(Locale.US); cb.addListener(event -> recreateTable()); return cb; } protected void recreateTable() { Table newTable = createTable(useCustomConverters.getValue(), (Locale) localeSelect.getValue()); newTable.setEditable(editMode.getValue()); if (table == null) { addComponent(newTable); } else { replaceComponent(table, newTable); } table = newTable; } private static BeanItemContainer<Person> createContainer(int nr) { BeanItemContainer<Person> bic = new BeanItemContainer<>(Person.class); for (int i = 1; i <= nr; i++) { Person p = new Person(); p.setFirstName("First " + i); p.setLastName("Last " + i); p.setAge(i); p.setDeceased(i % 5 - 2 == 0); p.setEmail("person" + i + "@mail.com"); p.setRent(new BigDecimal(i * 1250.25)); p.setSalary(3000 + i); p.setSex(i % 4 == 0 ? Sex.MALE : Sex.FEMALE); p.setBirthDate(new Date(2011 - 1900 - p.getAge(), 11 - 1, 24)); if (i % 42 == 0) { p.setSex(Sex.UNKNOWN); } String city = "City " + i / 10; Country country = Country.FINLAND; Address address = new Address("Street " + i, 12345 + i * 2, city, country); p.setAddress(address); bic.addBean(p); } return bic; } protected Table createTable(boolean useCustomConverters, Locale locale) { Table t = new Table("Persons"); t.setLocale(locale); t.setContainerDataSource(personBeanItemContainer); t.setSortDisabled(false); if (useCustomConverters) { addConverters(t); } t.setSelectable(true); t.setImmediate(true); t.addListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { log.log("Value is now: " + event.getProperty().getValue()); } }); return t; } private void addConverters(Table t) { t.setConverter("sex", new Converter<String, Sex>() { @Override public Sex convertToModel(String value, Class<? extends Sex> targetType, Locale locale) throws com.vaadin.v7.data.util.converter.Converter.ConversionException { // not used in this test - Table only converts to presentation return null; } @Override public String convertToPresentation(Sex value, Class<? extends String> targetType, Locale locale) throws com.vaadin.v7.data.util.converter.Converter.ConversionException { if (value == null) { value = Sex.UNKNOWN; } return value.getStringRepresentation(); } @Override public Class<Sex> getModelType() { return Sex.class; } @Override public Class<String> getPresentationType() { return String.class; } }); t.setConverter("deceased", new Converter<String, Boolean>() { @Override public Boolean convertToModel(String value, Class<? extends Boolean> targetType, Locale locale) { // not used in this test - Table only converts from source to // target return null; } @Override public String convertToPresentation(Boolean value, Class<? extends String> targetType, Locale locale) { if (value == null || value) { return "YES, DEAD!"; } else { return "-"; } } @Override public Class<Boolean> getModelType() { return Boolean.class; } @Override public Class<String> getPresentationType() { return String.class; } }); t.setConverter("age", new Converter<String, Integer>() { @Override public Integer convertToModel(String value, Class<? extends Integer> targetType, Locale locale) throws com.vaadin.v7.data.util.converter.Converter.ConversionException { // not used in this test - Table only converts from source to // target return null; } @Override public String convertToPresentation(Integer value, Class<? extends String> targetType, Locale locale) throws com.vaadin.v7.data.util.converter.Converter.ConversionException { if (value == null) { return null; } if (value < 3) { return value + " (baby)"; } else if (value < 7) { return value + " (kid)"; } else if (value < 18) { return value + " (young)"; } else { return value + ""; } } @Override public Class<Integer> getModelType() { return Integer.class; } @Override public Class<String> getPresentationType() { return String.class; } }); t.setConverter("address", new Converter<String, Address>() { @Override public Address convertToModel(String value, Class<? extends Address> targetType, Locale locale) throws ConversionException { // not used in this test - Table only converts to presentation return null; } @Override public String convertToPresentation(Address value, Class<? extends String> targetType, Locale locale) throws ConversionException { return value.getStreetAddress() + ", " + value.getCity() + " (" + value.getCountry() + ")"; } @Override public Class<Address> getModelType() { return Address.class; } @Override public Class<String> getPresentationType() { return String.class; } }); t.setConverter("rent", new StringToDoubleConverter() { @Override protected NumberFormat getFormat(Locale locale) { return NumberFormat.getCurrencyInstance(locale); // DecimalFormat df = new DecimalFormat(); // df.setDecimalSeparatorAlwaysShown(true); // df.setGroupingUsed(true); // df.setMinimumFractionDigits(2); // df.setMaximumFractionDigits(2); // return df; } }); } @Override protected String getDescription() { // TODO Auto-generated method stub return null; } @Override protected Integer getTicketNumber() { // TODO Auto-generated method stub return null; } }