package de.elatexam.editor.components.listeditor; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.wicket.markup.html.form.IFormModelUpdateListener; import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.model.IModel; public abstract class ListEditor<T> extends RepeatingView implements IFormModelUpdateListener { protected List<T> items; public ListEditor(final String id, final IModel<List<T>> model) { super(id, model); } public void addItem(final T value) { items.add(value); final ListItem<T> item = new ListItem<T>(newChildId(), items.size() - 1); add(item); onPopulateItem(item); } public boolean canMoveDown(final ListItem<?> item) { return item.getIndex() < items.size() - 1; } public boolean canMoveUp(final ListItem<?> item) { return item.getIndex() != 0; } /** * Indicates whether or not the item can be removed, usually by the use of * {@link RemoveButton} * * @param items * @param item * @return */ public boolean canRemove(final List<T> items, final T item) { return true; } @SuppressWarnings("unchecked") final boolean checkRemove(final ListItem<?> item) { final List<T> list = Collections.unmodifiableList(items); final ListItem<T> li = (ListItem<T>) item; return canRemove(list, li.getModelObject()); } /** * Gets model * * @return model */ @SuppressWarnings("unchecked") public final IModel<List<T>> getModel() { return (IModel<List<T>>) getDefaultModel(); } /** * Gets model object * * @return model object */ @SuppressWarnings("unchecked") public final List<T> getModelObject() { return (List<T>) getDefaultModelObject(); } @Override protected void onInitialize() { super.onInitialize(); items = new ArrayList<T>(getModelObject()); for (int i = 0; i < items.size(); i++) { final ListItem<T> li = new ListItem<T>(newChildId(), i); add(li); onPopulateItem(li); } } protected abstract void onPopulateItem(ListItem<T> item); /** * Sets model * * @param model */ public final void setModel(final IModel<List<T>> model) { setDefaultModel(model); } /** * Sets model object * * @param object */ public final void setModelObject(final List<T> object) { setDefaultModelObject(object); } /* * (non-Javadoc) * * @see * org.apache.wicket.markup.html.form.IFormModelUpdateListener#updateModel() */ public void updateModel() { setModelObject(items); } }