package sushi.application.components.tree; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.wicket.extensions.markup.html.repeater.data.sort.ISortState; import org.apache.wicket.extensions.markup.html.repeater.tree.ISortableTreeProvider; import org.apache.wicket.extensions.markup.html.repeater.util.SingleSortState; import sushi.application.components.table.model.AbstractDataProvider; import sushi.event.attribute.SushiAttribute; import sushi.event.collection.SushiTree; import sushi.event.collection.SushiTreeElement; /** * wraps the given tree nodes * * @param <T> */ /** * @author micha * * @param <T> */ public class TreeTableProvider<T> extends AbstractDataProvider implements ISortableTreeProvider<SushiTreeElement<T>, String> { private static final long serialVersionUID = 1L; private List<SushiTreeElement<T>> rootElements; private List<SushiTreeElement<T>> selectedElements = new ArrayList<SushiTreeElement<T>>(); public TreeTableProvider() { this.rootElements = new ArrayList<SushiTreeElement<T>>(); } /** * constructor * * @param treeNodes root nodes of the tree, child nodes are accessed by this component automatically */ public TreeTableProvider(List<SushiTreeElement<T>> treeNodes) { this.rootElements = treeNodes; } @Override public void detach() { } @Override public Iterator<? extends SushiTreeElement<T>> getRoots() { return getRootElements().iterator(); } private List<SushiTreeElement<T>> getRootElements() { return rootElements; } private List<SushiTreeElement<T>> getElements() { List<SushiTreeElement<T>> elements = new ArrayList<SushiTreeElement<T>>(); for (SushiTreeElement<T> root : rootElements) { if (root.hasChildren()) { addElementToSet(root, elements); } elements.add(root); } return elements; } public void setRootElements(List<SushiTreeElement<T>> rootElements) { this.rootElements = rootElements; } private void addElementToSet(SushiTreeElement<T> element, List<SushiTreeElement<T>> elements) { for (SushiTreeElement<T> child : element.getChildren()) { if (child.hasChildren()) { addElementToSet(child, elements); } elements.add(child); } } @Override public boolean hasChildren(SushiTreeElement<T> node) { return node.hasChildren(); } @Override public Iterator<? extends SushiTreeElement<T>> getChildren(SushiTreeElement<T> node) { return node.getChildren().iterator(); } @Override public TreeElementModel<T> model(SushiTreeElement<T> node) { return new TreeElementModel<T>(getRootElements(), node); } @Override public ISortState<String> getSortState() { return new SingleSortState<String>(); } @Override public void selectEntry(int entryId) { for (SushiTreeElement<T> treeTableElement : getElements()) { if(treeTableElement.getID() == entryId) { selectedElements.add(treeTableElement); return; } } } @Override public void deselectEntry(int entryId) { for (SushiTreeElement<T> treeTableElement : getElements()) { if(treeTableElement.getID() == entryId) { selectedElements.remove(treeTableElement); return; } } } @Override public boolean isEntrySelected(int entryId) { for (SushiTreeElement<T> treeTableElement : selectedElements) { if(treeTableElement.getID() == entryId) { return true; } } return false; } @Override public Object getEntry(int entryId) { for (SushiTreeElement<T> treeTableElement : getElements()) { if(treeTableElement.getID() == entryId) { return treeTableElement; } } return null; } /** * Returns the next free ID for an new element. * @return */ public int getNextID() { int highestNumber = 0; for(SushiTreeElement<T> element : getElements()) { highestNumber = element.getID() > highestNumber ? element.getID() : highestNumber; } return ++highestNumber; } public List<SushiTreeElement<T>> getTreeTableElements() { return getElements(); } public List<SushiTreeElement<T>> getSelectedTreeTableElements() { return selectedElements; } public List<SushiTreeElement<T>> getRootTreeTableElements() { return getRootElements(); } public SushiTree<T> getModelAsTree() { SushiTree<T> tree = new SushiTree<T>(); for(SushiTreeElement<T> element : rootElements){ addElementToTree(null, element, tree); } return tree; } private void addElementToTree(SushiTreeElement<T> parent, SushiTreeElement<T> element, SushiTree<T> tree) { if (parent != null) { tree.addChild(parent.getValue(), element.getValue()); } else { tree.addChild(null, element.getValue()); } for (SushiTreeElement<T> child : element.getChildren()) { addElementToTree(element, child, tree); } } }