@Override public boolean hasChildren(Object element) { return !treeDef.childrenOf((T) element).isEmpty(); }
/** An instance of {@code TreeDef.Parented} for {@link Path}. */ public static TreeDef.Parented<Path> forPath(Consumer<Throwable> errorPolicy) { Errors.Handling errors = Errors.createHandling(errorPolicy); return TreeDef.Parented.of( path -> errors.<List<Path>> getWithDefault(() -> { if (Files.isDirectory(path)) { return Files.list(path).collect(Collectors.toList()); } else { return Collections.emptyList(); } }, Collections.emptyList()), path -> errors.<Path> getWithDefault(() -> { return path.getParent(); }, null)); } }
/** * Creates a mutable list whose first element is {@code node}, and last element is {@code parent}. * @throws IllegalArgumentException if {@code parent} is not a parent of {@code node} */ public static <T> List<T> toParent(TreeDef.Parented<T> treeDef, T node, T parent) { requireNonNull(node); requireNonNull(parent); List<T> list = new ArrayList<>(); T tip = node; while (true) { list.add(tip); tip = treeDef.parentOf(tip); if (tip == null) { throw new IllegalArgumentException(parent + " is not a parent of " + node); } else if (tip.equals(parent)) { list.add(parent); return list; } } }
/** An instance of {@code TreeDef.Parented} for {@link File}. */ public static TreeDef.Parented<File> forFile(Consumer<Throwable> errorPolicy) { Errors.Handling errors = Errors.createHandling(errorPolicy); return TreeDef.Parented.of( file -> errors.<List<File>> getWithDefault(() -> { if (file.isDirectory()) { return Arrays.asList(file.listFiles()); } else { return Collections.emptyList(); } }, Collections.emptyList()), file -> errors.<File> getWithDefault(() -> { return file.getParentFile(); }, null)); }
/** Returns true iff child is a descendant of parent. */ public static <T> boolean isDescendantOf(TreeDef.Parented<T> treeDef, T child, T parent) { requireNonNull(child); requireNonNull(parent); T candidateParent = treeDef.parentOf(child); while (candidateParent != null) { if (candidateParent.equals(parent)) { return true; } else { candidateParent = treeDef.parentOf(candidateParent); } } return false; }
/** A TreeDef for projects. */ public static TreeDef.Parented<Project> treeDef() { return TreeDef.Parented.of(p -> ImmutableList.copyOf(p.getChildProjects().values()), Project::getParent); } }
@Override public Object getParent(Object element) { return treeDef.parentOf((T) element); } });
@Override public void updateChildCount(Object element, int currentChildCount) { viewer.setChildCount(element, treeDef.childrenOf((T) element).size()); }
@Override public Object[] getChildren(Object parentElement) { return treeDef.childrenOf((T) parentElement).toArray(); }
/** Creates a new {@code TreeDef.Parented} whose {@code childrenOf} and {@code parentOf} methods are filtered by {@code predicate}. */ @Override default Parented<T> filter(Predicate<T> predicate) { return of(node -> TreeImp.filteredList(childrenOf(node), predicate), node -> { if (predicate.test(node)) { return parentOf(node); } else { return null; } }); }
@Override public Object getParent(Object element) { return treeDef.parentOf((T) element); }
@Override public void updateElement(Object parent, int index) { T child = treeDef.childrenOf((T) parent).get(index); viewer.replace(parent, index, child); updateChildCount(child, 0); }
/** Creates a mutable list whose first element is {@code node}, and last element is its root parent. */ public static <T> List<T> toRoot(TreeDef.Parented<T> treeDef, T node) { requireNonNull(node); List<T> list = new ArrayList<>(); T tip = node; while (tip != null) { list.add(tip); tip = treeDef.parentOf(tip); } return list; }
/** Returns the root of the given tree. */ public static <T> T root(TreeDef.Parented<T> treeDef, T node) { T lastParent; T parent = node; do { lastParent = parent; parent = treeDef.parentOf(lastParent); } while (parent != null); return lastParent; }