package com.jetbrains.actionscript.profiler.util; import com.intellij.ui.treeStructure.treetable.TreeTableModel; import com.intellij.util.ui.tree.TreeUtil; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class JTreeUtil { private JTreeUtil() { } public static boolean isSorted(List<TreePath> paths, Comparator<TreeNode> comparator, TreeTableModel model) { for (TreePath path : paths) { Object node = path.getLastPathComponent(); if (node instanceof DefaultMutableTreeNode && !isSorted((DefaultMutableTreeNode)node, comparator, model)) { return false; } } return true; } private static boolean isSorted(DefaultMutableTreeNode node, Comparator<TreeNode> comparator, TreeTableModel model) { List<TreeNode> children = childrenToArray(node, 0, model.getChildCount(node)); return isNodesSorted(children, comparator); } private static boolean isNodesSorted(List<TreeNode> nodes, Comparator<TreeNode> comparator) { TreeNode prev = null; for (TreeNode node : nodes) { if (prev != null && comparator.compare(prev, node) == 1) { return false; } prev = node; } return true; } public static void sortChildren(final DefaultMutableTreeNode node, final Comparator comparator, final int maxIndex) { final List<TreeNode> childrenSorted = childrenToArray(node, 0, maxIndex); Collections.sort(childrenSorted, comparator); childrenSorted.addAll(childrenToArray(node, maxIndex, node.getChildCount())); node.removeAllChildren(); TreeUtil.addChildrenTo(node, childrenSorted); } private static List<TreeNode> childrenToArray(DefaultMutableTreeNode node, int l, int r) { final List<TreeNode> result = new ArrayList<>(); for (; l < r; ++l) { result.add(node.getChildAt(l)); } return result; } public static void removeChildren(DefaultMutableTreeNode root, DefaultTreeModel model) { if (root.getChildCount() == 0) { return; } int[] childIndices = new int[model.getChildCount(root)]; Object[] removedChildren = new Object[model.getChildCount(root)]; for (int i = 0; i < removedChildren.length; ++i) { childIndices[i] = i; removedChildren[i] = root.getChildAt(i); } root.removeAllChildren(); model.nodesWereRemoved(root, childIndices, removedChildren); } }