package sushi.application.pages.transformation.patternbuilder.model; import java.io.Serializable; import java.util.List; import java.util.Set; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; 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.model.IModel; import sushi.application.components.tree.SushiMultiSelectTreeTable; import sushi.application.components.tree.TreeLinkLabel; import sushi.application.pages.transformation.patternbuilder.PatternBuilderPanel; import sushi.event.collection.SushiTreeElement; /** * 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 PatternElementTreeTable extends SushiMultiSelectTreeTable<SushiTreeElement<Serializable>, String> { private static final long serialVersionUID = 1L; private PatternElementTreeTable patternElementTree; private PatternBuilderPanel patternBuilderPanel; /** * 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 PatternElementTreeTable(String id, List<? extends IColumn<SushiTreeElement<Serializable>, String>> columns, ITreeProvider<SushiTreeElement<Serializable>> provider, long rowsPerPage, IModel<Set<SushiTreeElement<Serializable>>> state, PatternBuilderPanel patternBuilderPanel) { super(id, columns, provider, rowsPerPage, state); this.patternElementTree = this; this.patternBuilderPanel = patternBuilderPanel; } @Override protected void toggle(SushiTreeElement<Serializable> element, AbstractTree<SushiTreeElement<Serializable>> tree, final AjaxRequestTarget target) { if (isSelected(element)) { selectedElements.remove(element); } else if (selectedElements.size() <= 1) { SushiTreeElement<Serializable> selectedElement; if (!selectedElements.isEmpty()) { selectedElement = selectedElements.iterator().next(); if (selectedElement.getLevel() != element.getLevel() || ((selectedElement.hasParent() && element.hasParent()) && !selectedElement.getParent().equals(element.getParent()))) { selectedElements.remove(selectedElement); tree.updateNode(selectedElement, target); } } selectedElements.add(element); } tree.updateNode(element, target); } @Override protected Component newContentComponent(String id, IModel<SushiTreeElement<Serializable>> model) { return new TreeLinkLabel<SushiTreeElement<Serializable>>(id, this, model) { private static final long serialVersionUID = 4384788964095089896L; @Override protected void onClick(AjaxRequestTarget target) { patternElementTree.toggle(getModelObject(), patternElementTree, target); patternBuilderPanel.updateOnTreeElementSelection(target); } @Override protected boolean isSelected() { return patternElementTree.isSelected(getModelObject()); } }; } }