package org.infernus.idea.checkstyle.toolwindow; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; import java.util.Collections; import java.util.List; /** * Tree node with togglable visibility. */ public class TogglableTreeNode extends DefaultMutableTreeNode { private static final long serialVersionUID = -4490734768175672868L; private boolean visible = true; public TogglableTreeNode() { } public TogglableTreeNode(final Object userObject) { super(userObject); } public boolean isVisible() { return visible; } public void setVisible(final boolean visible) { this.visible = visible; } @SuppressWarnings("unchecked") List<TogglableTreeNode> getAllChildren() { return Collections.unmodifiableList(children); } @Override public TreeNode getChildAt(final int index) { int realIndex = -1; int visibleIndex = -1; for (final Object child : children) { final TogglableTreeNode node = (TogglableTreeNode) child; if (node.isVisible()) { ++visibleIndex; } ++realIndex; if (visibleIndex == index) { return (TreeNode) children.get(realIndex); } } throw new ArrayIndexOutOfBoundsException("Invalid index: " + index); } @Override public int getChildCount() { if (children == null) { return 0; } int count = 0; for (final Object child : children) { final TogglableTreeNode node = (TogglableTreeNode) child; if (node.isVisible()) { ++count; } } return count; } }