package ilarkesto.form;
import ilarkesto.base.Factory;
import ilarkesto.base.Reflect;
import ilarkesto.id.CountingIdGenerator;
import ilarkesto.id.IdGenerator;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.commons.fileupload.FileItem;
public class MultiComplexFormField extends AFormField {
private Set<Object> value;
private AddButton addButton;
private Map<Object, RemoveButton> removeButtons = new HashMap<Object, RemoveButton>();
private boolean itemsEditable;
private Map<Object, EditButton> editButtons = new HashMap<Object, EditButton>();
private Factory itemFactory;
private Class<? extends BeanForm> elementFormClass;
private Object uiComponent;
public MultiComplexFormField(String name, Class<? extends BeanForm> elementFormClass) {
super(name);
this.elementFormClass = elementFormClass;
addButton = (AddButton) new AddButton().setValidateForm(false).setLabel("Hinzuf\u00FCgen...").setIcon("add");
}
public BeanForm createSubform() {
// String formBeanName = getForm().getName() + Str.uppercaseFirstLetter(getName()) + "Form";
// BeanForm form = (BeanForm) beanProvider.getBean(formBeanName);
// if (form == null) throw new RuntimeException("Form bean does not exist: " + formBeanName);
BeanForm form = Reflect.newInstance(elementFormClass);
form.setStringKeyPrefix(getForm().getStringKeyPrefix());
return form;
}
public Factory getItemFactory() {
return itemFactory;
}
public MultiComplexFormField setItemFactory(Factory factory) {
this.itemFactory = factory;
return this;
}
public void setItemsEditable(boolean itemsEditable) {
this.itemsEditable = itemsEditable;
}
public AddButton getAddButton() {
return addButton;
}
public RemoveButton getRemoveButton(Object item) {
return removeButtons.get(item);
}
public RemoveButton getRemoveButton(String id) {
for (RemoveButton button : removeButtons.values()) {
if (button.getId().equals(id)) return button;
}
throw new RuntimeException("remove button does not exist: " + id);
}
public EditButton getEditButton(Object item) {
return editButtons.get(item);
}
public EditButton getEditButton(String id) {
for (EditButton button : editButtons.values()) {
if (button.getId().equals(id)) return button;
}
throw new RuntimeException("edit button does not exist: " + id);
}
public MultiComplexFormField setValue(Set<Object> value) {
this.value = value;
removeButtons.clear();
for (Object item : value) {
RemoveButton button = (RemoveButton) new RemoveButton(item).setLabel("Entfernen").setIcon("delete");
removeButtons.put(item, button);
}
editButtons.clear();
for (Object item : value) {
EditButton button = (EditButton) new EditButton(item).setLabel("Bearbeiten").setIcon("edit");
editButtons.put(item, button);
}
return this;
}
public void removeValueItem(Object item) {
value.remove(item);
setValue(value);
}
public void addValueItem(Object item) {
value.add(item);
setValue(value);
}
public Set<Object> 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("Auswahl erforderlich!");
}
public MultiComplexFormField setUiComponent(Object uiComponent) {
this.uiComponent = uiComponent;
return this;
}
public Object getUiComponent() {
return uiComponent;
}
public class AddButton extends FormButton {
public AddButton() {
super(Form.BUTTON_PREFIX + Form.ADD_COMPLEX_BUTTON_NAME_PREFIX + MultiComplexFormField.this.getName());
}
public MultiComplexFormField getField() {
return MultiComplexFormField.this;
}
}
public class RemoveButton extends FormButton {
private String id;
private Object item;
public RemoveButton(Object item) {
this(item, buttonIdGenerator.generateId());
}
private RemoveButton(Object item, String id) {
super(Form.BUTTON_PREFIX + Form.REMOVE_COMPLEX_BUTTON_NAME_PREFIX + MultiComplexFormField.this.getName()
+ "_" + id);
this.item = item;
this.id = id;
setValidateForm(false);
}
public MultiComplexFormField getField() {
return MultiComplexFormField.this;
}
public Object getItem() {
return item;
}
public String getId() {
return id;
}
}
public class EditButton extends FormButton {
private String id;
private Object item;
public EditButton(Object item) {
this(item, buttonIdGenerator.generateId());
}
private EditButton(Object item, String id) {
super(Form.BUTTON_PREFIX + Form.EDIT_COMPLEX_BUTTON_NAME_PREFIX + MultiComplexFormField.this.getName()
+ "_" + id);
this.item = item;
this.id = id;
setValidateForm(false);
}
public MultiComplexFormField getField() {
return MultiComplexFormField.this;
}
public Object getItem() {
return item;
}
public String getId() {
return id;
}
}
// --- dependencies ---
private static IdGenerator buttonIdGenerator = new CountingIdGenerator(MultiComplexFormField.class.getSimpleName());
}