package com.vaadin.tests.components.select; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.HorizontalLayout; import com.vaadin.v7.data.Item; import com.vaadin.v7.data.Property; import com.vaadin.v7.data.util.IndexedContainer; import com.vaadin.v7.ui.Select; public class SelectDisplaysOldValue extends TestBase { @Override protected void setup() { addComponent(new DynamicSelectTestCase()); } public class DynamicSelectTestCase extends HorizontalLayout { private static final String CONTROLLER_COMBO_BOX_CAPTION = "Master : "; private static final String SLAVE_COMBO_BOX_CAPTION = "Slave :"; private Select controllerComboBox; private Select slaveComboBox; private Map<Integer, String> controllerOptionMap = new HashMap<>(); private Map<String, List<String>> slaveOptionMapping = new HashMap<>(); private final Object NAME_PROPERTY_ID = "name"; public DynamicSelectTestCase() { populateControllerOptionMapping(); populateSlaveOptionMappings(); buildDynamicSelectTestCase(); } private void populateControllerOptionMapping() { for (int i = 1; i <= 3; i++) { controllerOptionMap.put(i, "Master " + i); } } private void populateSlaveOptionMappings() { for (String controllerOption : controllerOptionMap.values()) { List<String> slaveOptions = new ArrayList<>(); for (int i = 1; i <= 3; i++) { slaveOptions.add(controllerOption + " - Slave " + i); } slaveOptionMapping.put(controllerOption, slaveOptions); } } private void buildDynamicSelectTestCase() { setSpacing(true); setMargin(true); buildAndConfigureComboBoxes(); addComponent(controllerComboBox); addComponent(slaveComboBox); } private void buildAndConfigureComboBoxes() { IndexedContainer masterOptionContainer = initMasterOptionContainer(); controllerComboBox = new Select(CONTROLLER_COMBO_BOX_CAPTION, masterOptionContainer); configureMasterOptionDropdown(); controllerComboBox.addListener(new ControllerUpdatedListener()); buildSlaveDropdown(1); } private void buildSlaveDropdown(Integer masterId) { IndexedContainer slaveOptionContainer = initSlaveOptionContainer( masterId); slaveComboBox = new Select(SLAVE_COMBO_BOX_CAPTION, slaveOptionContainer); configureSlaveOptionDropdown(); } private IndexedContainer initMasterOptionContainer() { IndexedContainer containerToReturn = new IndexedContainer(); Object defaultValue = null; Item itemAdded; containerToReturn.addContainerProperty(NAME_PROPERTY_ID, String.class, defaultValue); for (Integer optionId : controllerOptionMap.keySet()) { itemAdded = containerToReturn.addItem(optionId); itemAdded.getItemProperty(NAME_PROPERTY_ID) .setValue(controllerOptionMap.get(optionId)); } return containerToReturn; } private IndexedContainer initSlaveOptionContainer(Integer masterId) { IndexedContainer containerToReturn = new IndexedContainer(); Object defaultValue = null; Item itemAdded; List<String> options; options = slaveOptionMapping.get(controllerOptionMap.get(masterId)); containerToReturn.addContainerProperty(NAME_PROPERTY_ID, String.class, defaultValue); for (String option : options) { itemAdded = containerToReturn.addItem(option); itemAdded.getItemProperty(NAME_PROPERTY_ID).setValue(option); } return containerToReturn; } private void configureMasterOptionDropdown() { controllerComboBox.setItemCaptionPropertyId(NAME_PROPERTY_ID); controllerComboBox.setNullSelectionAllowed(false); controllerComboBox.setNewItemsAllowed(false); controllerComboBox.setImmediate(true); controllerComboBox.setBuffered(true); } private void configureSlaveOptionDropdown() { slaveComboBox.setItemCaptionPropertyId(NAME_PROPERTY_ID); slaveComboBox.setNullSelectionAllowed(false); slaveComboBox.setNewItemsAllowed(false); slaveComboBox.setImmediate(true); slaveComboBox.setBuffered(true); } private void refreshSlaveDropdown(Integer masterId) { slaveComboBox .setContainerDataSource(initSlaveOptionContainer(masterId)); System.out.println("Slave value: " + slaveComboBox.getValue()); } private class ControllerUpdatedListener implements Property.ValueChangeListener { @Override public void valueChange( Property.ValueChangeEvent valueChangeEvent) { refreshSlaveDropdown( (Integer) valueChangeEvent.getProperty().getValue()); } } } @Override protected String getDescription() { return "Select an 'master' item from the first combo box, a slave from the second, select another master and focus+blur the slave combo box and the slave combobox will show a value not in the combo box"; } @Override protected Integer getTicketNumber() { return 5556; } }