package ilarkesto.form; import ilarkesto.base.StringProvider; import ilarkesto.id.CountingIdGenerator; import ilarkesto.id.IdGenerator; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.apache.commons.fileupload.FileItem; public class MultiItemFormField<T> extends AFormField { private Set<T> value; private AddButton addButton; private RemoveAllButton removeAllButton; private Collection<T> selectableItems; private Collection<MultiItem<T>> selectableMultiItems = Collections.emptyList(); private Map<T, RemoveButton<T>> removeButtons = new HashMap<T, RemoveButton<T>>(); private StringProvider<T> itemTooltipProvider; private StringProvider<T> itemLabelProvider; private String noSelectionLabel; public MultiItemFormField(String name) { super(name); addButton = (AddButton) new AddButton().setValidateForm(false).setLabel("Hinzuf\u00FCgen...").setIcon("add"); removeAllButton = (RemoveAllButton) new RemoveAllButton().setValidateForm(false).setLabel("Alle entferenen") .setIcon("delete"); } public MultiItemFormField<T> setNoSelectionLabel(String noSelectionLabel) { this.noSelectionLabel = noSelectionLabel; return this; } public String getNoSelectionLabel() { return noSelectionLabel; } public MultiItemFormField<T> setItemLabelProvider(StringProvider<T> itemLabelProvider) { this.itemLabelProvider = itemLabelProvider; return this; } public StringProvider<T> getItemLabelProvider() { return itemLabelProvider; } public MultiItemFormField<T> setItemTooltipProvider(StringProvider<T> itemTooltipProvider) { this.itemTooltipProvider = itemTooltipProvider; return this; } public StringProvider<T> getItemTooltipProvider() { return itemTooltipProvider; } public MultiItemFormField<T> setSelectableItems(Collection<T> items) { this.selectableItems = items == null ? new HashSet<T>() : items; return this; } public Collection<T> getSelectableItems() { Set<T> result = new HashSet<T>(selectableItems); result.removeAll(value); return result; } public MultiItemFormField<T> setSelectableMultiItems(Collection<MultiItem<T>> multiItmes) { this.selectableMultiItems = multiItmes; return this; } public Collection<MultiItem<T>> getSelectableMultiItems() { return selectableMultiItems; } public AddButton getAddButton() { return addButton; } public RemoveAllButton getRemoveAllButton() { return removeAllButton; } public RemoveButton<T> getRemoveButton(T item) { return removeButtons.get(item); } public RemoveButton<T> getRemoveButton(String id) { for (RemoveButton<T> button : removeButtons.values()) { if (button.getId().equals(id)) return button; } throw new RuntimeException("button does not exist: " + id); } public MultiItemFormField<T> setValue(Collection<T> value) { this.value = value == null ? null : new HashSet<T>(value); removeButtons.clear(); for (T item : value) { RemoveButton button = (RemoveButton) new RemoveButton(item).setLabel("Entfernen").setIcon("delete"); removeButtons.put(item, button); } return this; } public void removeValueItem(T item) { value.remove(item); setValue(value); } public void removeAllItems() { value.clear(); setValue(value); } public void addValueItem(T item) { value.add(item); setValue(value); } public void addValueItems(Collection<T> items) { value.addAll(items); setValue(value); } public Set<T> getValue() { return value; } public String getValueAsString() { return value == null ? "0" : String.valueOf(value.size()); } public void update(Map<String, String> data, Collection<FileItem> uploadedFiles) { // nop } public void validate() throws ValidationException { if (isRequired() && (value == null || value.size() == 0)) throw new ValidationException("Hier ist eine Auswahl erforderlich."); } public class AddButton extends FormButton { public AddButton() { super(Form.BUTTON_PREFIX + Form.ADD_ITEM_BUTTON_NAME_PREFIX + MultiItemFormField.this.getName()); } public MultiItemFormField getField() { return MultiItemFormField.this; } } public class RemoveAllButton extends FormButton { public RemoveAllButton() { super(Form.BUTTON_PREFIX + Form.REMOVE_ALLITEMS_BUTTON_NAME_PREFIX + MultiItemFormField.this.getName()); } public MultiItemFormField getField() { return MultiItemFormField.this; } } public class RemoveButton<T> extends FormButton { private String id; private T item; public RemoveButton(T item) { this(item, buttonIdGenerator.generateId()); } private RemoveButton(T item, String id) { super(Form.BUTTON_PREFIX + Form.REMOVE_ITEM_BUTTON_NAME_PREFIX + MultiItemFormField.this.getName() + "_" + id); this.item = item; this.id = id; setValidateForm(false); } public MultiItemFormField<T> getField() { return (MultiItemFormField<T>) MultiItemFormField.this; } public T getItem() { return item; } public String getId() { return id; } } public class EditButton<T> extends FormButton { private String id; private T item; public EditButton(T item) { this(item, buttonIdGenerator.generateId()); } private EditButton(T item, String id) { super(Form.BUTTON_PREFIX + Form.REMOVE_ITEM_BUTTON_NAME_PREFIX + MultiItemFormField.this.getName() + "_" + id); this.item = item; this.id = id; setValidateForm(false); } public MultiItemFormField<T> getField() { return (MultiItemFormField<T>) MultiItemFormField.this; } public T getItem() { return item; } public String getId() { return id; } } // --- dependencies --- private static IdGenerator buttonIdGenerator = new CountingIdGenerator(MultiItemFormField.class.getSimpleName()); // --- --- }