package lt.inventi.wicket.component.repeater.expandable; import java.util.Iterator; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.repeater.Item; /** * Intended to be used together with ExpandableView. * Removes item via ajax. */ public abstract class RemoveItemLink<T> extends AjaxLink<T> { private final Item<T> item; public RemoveItemLink(String id, Item<T> item) { super(id); this.item = item; } @Override public void onClick(AjaxRequestTarget target) { String markupId = item.getMarkupId(); Item<?> sibling = getSiblingItem(item); onRemoveItem(target); target.prependJavaScript("$('#"+markupId+"').remove();"); item.remove(); if (sibling != null) { Component cmp = Repeaters.getFirstFormComponent(sibling); if (cmp != null) { cmp.setOutputMarkupId(true); target.focusComponent(cmp); } } } /** * In this method remove object from the model * Also use this method to notify listeners or to add extra components to ajax request if needed. */ protected abstract void onRemoveItem(AjaxRequestTarget target); /** * @return the item to be removed by this link */ protected Item<T> item() { return item; } @SuppressWarnings("unchecked") private static Item<?> getSiblingItem(Item<?> item) { if (item.getParent() instanceof ExpandableView) { ExpandableView<Object> listView = (ExpandableView<Object>) item.getParent(); if (listView.size() <= 1) { return null; } Iterator<Item<Object>> items = listView.getItems(); Item<Object> prev = null; while (items.hasNext()) { Item<Object> next = items.next(); if (next.getIndex() == item.getIndex()) { if (items.hasNext()) { return items.next(); } } else { prev = next; } } return prev; } return null; } }