package sushi.application.components.tree; import java.util.Set; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.tree.AbstractTree; import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider; import org.apache.wicket.model.IModel; /** * tree component for visualization of hierarchical elements * one node can be selected at a time * * @param <T> the type of nodes to be stored in the tree */ public class SushiSelectTree<T> extends SushiLabelTree<T> { private static final long serialVersionUID = 1L; private IModel<T> selectedElement; private SushiSelectTree<T> selectTree; private ITreeProvider<T> provider; /** * constructor * * @param id wicket identifier used in the corresponding HTML file * @param provider see sushi.application.components.tree.NestedTreeProvider * @param state see sushi.application.components.tree.NestedTreeExpansionModel */ public SushiSelectTree(String id, ITreeProvider<T> provider, IModel<Set<T>> state) { super(id, provider, state); this.provider = provider; this.selectTree = this; } public T getSelectedElement() { if (selectedElement == null) { return null; } return selectedElement.getObject(); } protected boolean isSelected(T element) { return selectedElement != null && selectedElement.equals(provider.model(element)); } protected void select(T element, AbstractTree<T> tree, final AjaxRequestTarget target) { if (isSelected(element)) { selectedElement = null; } else { if (selectedElement != null) { tree.updateNode(selectedElement.getObject(), target); selectedElement = null; } selectedElement = provider.model(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 = -5152504744506997839L; @Override protected void onClick(AjaxRequestTarget target) { selectTree.select(getModelObject(), selectTree, target); if (selectedElement != null) { System.out.println("Selected element: " + selectedElement.getObject()); } else { System.out.println("No element selected"); } } @Override protected boolean isSelected() { return selectTree.isSelected(getModelObject()); } }; } }