package sushi.application.components.tree;
import java.util.List;
import java.util.Set;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.tree.AbstractTree;
import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
import org.apache.wicket.extensions.markup.html.repeater.tree.TableTree;
import org.apache.wicket.extensions.markup.html.repeater.tree.theme.HumanTheme;
import org.apache.wicket.extensions.markup.html.repeater.util.ProviderSubset;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
/**
* tree table component for visualization of hierarchical elements
* nodes are selectable
*
* @param <T> the type of nodes to be stored in the tree
* @param <S> the type of the sort property
*/
public class SushiMultiSelectTreeTable<T, S> extends SushiLabelTreeTable<T, S> {
private static final long serialVersionUID = 1L;
protected ProviderSubset<T> selectedElements;
private SushiMultiSelectTreeTable<T, S> multiSelectTree;
/**
* constructor
*
* @param id wicket identifier used in the corresponding HTML file
* @param columns list of IColumn objects
* @param provider provider see sushi.application.components.tree.NestedTreeProvider
* @param rowsPerPage number of rows per page
* @param state state see sushi.application.components.tree.NestedTreeExpansionModel
*/
public SushiMultiSelectTreeTable(String id, List<? extends IColumn<T, S>> columns, ITreeProvider<T> provider, long rowsPerPage, IModel<Set<T>> state) {
super(id, columns, provider, rowsPerPage, state);
this.multiSelectTree = this;
this.selectedElements = new ProviderSubset<T>(provider, false);
}
public int numberOfSelectedElements() {
return selectedElements.size();
}
public ProviderSubset<T> getSelectedElements() {
return selectedElements;
}
protected boolean isSelected(T element) {
return selectedElements.contains(element);
}
protected void toggle(T element, AbstractTree<T> tree, final AjaxRequestTarget target) {
if (isSelected(element)) {
selectedElements.remove(element);
} else {
selectedElements.add(element);
}
tree.updateNode(element, target);
}
@Override
protected Component newContentComponent(String id, IModel<T> model) {
return new TreeLinkLabel<T>(id, this, model) {
private static final long serialVersionUID = 4384788964095089896L;
@Override
protected void onClick(AjaxRequestTarget target) {
multiSelectTree.toggle(getModelObject(), multiSelectTree, target);
}
@Override
protected boolean isSelected() {
return multiSelectTree.isSelected(getModelObject());
}
};
}
}