--- /dev/null
+package be.nikiroo.utils.ui;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.swing.Icon;
+
+public class DataNode<T> {
+ private DataNode<T> parent;
+ private List<? extends DataNode<T>> children;
+ private T userData;
+
+ public DataNode(List<? extends DataNode<T>> children, T userData) {
+ if (children == null) {
+ children = new ArrayList<DataNode<T>>();
+ }
+
+ this.children = children;
+ this.userData = userData;
+
+ for (DataNode<T> child : children) {
+ child.parent = this;
+ }
+ }
+
+ public DataNode<T> getRoot() {
+ DataNode<T> root = this;
+ while (root.parent != null) {
+ root = root.parent;
+ }
+
+ return root;
+ }
+
+ public DataNode<T> getParent() {
+ return parent;
+ }
+
+ public List<? extends DataNode<T>> getChildren() {
+ return children;
+ }
+
+ public int size() {
+ return children.size();
+ }
+
+ public boolean isRoot() {
+ return this == getRoot();
+ }
+
+ public boolean isSiblingOf(DataNode<T> node) {
+ if (this == node) {
+ return true;
+ }
+
+ return node != null && parent != null && parent.children.contains(node);
+ }
+
+ public boolean isParentOf(DataNode<T> node) {
+ if (node == null || node.parent == null)
+ return false;
+
+ if (this == node.parent)
+ return true;
+
+ return isParentOf(node.parent);
+ }
+
+ public boolean isChildOf(DataNode<T> node) {
+ if (node == null || node.size() == 0)
+ return false;
+
+ return node.isParentOf(this);
+ }
+
+ public T getUserData() {
+ return userData;
+ }
+
+ protected int count() {
+ int s = 0;
+ for (DataNode<T> child : children) {
+ s += child.count();
+ }
+
+ return s;
+ }
+
+ @Override
+ public String toString() {
+ if (userData == null) {
+ return "";
+ }
+
+ return userData.toString();
+ }
+}
\ No newline at end of file