package com.constellio.app.ui.framework.components.fields; import com.constellio.app.services.factories.ConstellioFactories; import com.constellio.app.ui.application.ConstellioUI; import com.vaadin.data.Property; import com.vaadin.data.Validator; import com.vaadin.ui.Component; import com.vaadin.ui.CustomField; import com.vaadin.ui.VerticalLayout; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import static com.constellio.app.ui.i18n.i18n.$; public class MultilingualTextField extends CustomField<Map<String, String>> { private final Map<String, String> value; private VerticalLayout layout; private final boolean areFieldsSetToRequired; public MultilingualTextField(boolean areFieldsSetToRequired) { value = new HashMap<>(); this.areFieldsSetToRequired = areFieldsSetToRequired; for (String language : getCollectionLanguages()) { value.put(language, null); } } public void clear() { for (String language : getCollectionLanguages()) { value.put(language, null); } prepareEntryFields(); } @Override protected Map<String, String> getInternalValue() { return value; } @Override protected void setInternalValue(Map<String, String> newFieldValue) { value.putAll(newFieldValue); if (layout != null) { prepareEntryFields(); } } @Override @SuppressWarnings("unchecked") public Class<? extends Map<String, String>> getType() { return (Class) Map.class; } @Override protected Component initContent() { layout = new VerticalLayout(); layout.setSpacing(true); prepareEntryFields(); return layout; } private void prepareEntryFields() { layout.removeAllComponents(); for (final String language : getCollectionLanguages()) { final BaseTextField field = new BaseTextField($(language)); field.setValue(value.get(language)); field.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { value.put(language, field.getValue()); setInternalValue(value); } }); field.setRequired(areFieldsSetToRequired); field.setId(language); layout.addComponent(field); } } private List<String> getCollectionLanguages() { String collection = ConstellioUI.getCurrentSessionContext().getCurrentCollection(); return ConstellioFactories.getInstance().getModelLayerFactory().getCollectionsListManager() .getCollectionLanguages(collection); } public void validateFields() throws Validator.InvalidValueException { if(areFieldsSetToRequired) { Iterator<Component> componentIterator = layout.iterator(); while(componentIterator.hasNext()) { BaseTextField field = (BaseTextField) componentIterator.next(); field.setRequiredError($("MultilingualTextField.requiredError", $("Language."+field.getId()).toLowerCase())); field.validate(); } } } }