package com.constellio.app.ui.framework.components;
import java.io.Serializable;
import java.util.List;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.framework.components.OverridingMetadataFieldFactory.FieldOverridePresenter;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Field;
public class OverridingMetadataFieldFactory<T extends FieldOverridePresenter> extends MetadataFieldFactory {
public interface FieldOverridePresenter extends Serializable {
OverrideMode getOverride(String metadataCode);
List<Choice> getChoices(String metadataCode);
}
public static class Choice implements Serializable {
private final Object value;
private final String caption;
public Choice(Object value, String caption) {
this.value = value;
this.caption = caption;
}
public Object getValue() {
return value;
}
public String getCaption() {
return caption;
}
}
public enum OverrideMode {
NONE, DROPDOWN
}
protected final T presenter;
public OverridingMetadataFieldFactory(T presenter) {
this.presenter = presenter;
}
@Override
protected Field<?> newSingleValueField(MetadataVO metadata) {
switch (presenter.getOverride(metadata.getCode())) {
case DROPDOWN:
return buildDropdown(metadata);
}
return super.newSingleValueField(metadata);
}
private Field<?> buildDropdown(MetadataVO metadata) {
ComboBox comboBox = new ComboBox();
for (Choice choice : presenter.getChoices(metadata.getCode())) {
comboBox.addItem(choice.getValue());
comboBox.setItemCaption(choice.getValue(), choice.getCaption());
}
comboBox.setNullSelectionAllowed(!metadata.isRequired());
postBuild(comboBox, metadata);
return comboBox;
}
}