/* * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.ui; import javax.swing.*; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; public class TreeExpandCollapse { public static void collapse(JTree tree) { TreePath selectionPath = tree.getSelectionPath(); tree.collapsePath(selectionPath); } public static void expand(JTree tree) { TreePath selectionPath = tree.getSelectionPath(); tree.expandPath(selectionPath); } public static void expandAll(JTree tree) { TreePath path = tree.getSelectionPath(); if (path == null) path = new TreePath(tree.getModel().getRoot()); new ExpandContext(300, 10).expand(tree, path); } private static class ExpandContext { private final int myLevelsLeft; private int myExpansionLimit; public ExpandContext(int expansionLimit, int levelsLeft) { myExpansionLimit = expansionLimit; myLevelsLeft = levelsLeft; } public int expand(JTree tree, TreePath path) { if (myLevelsLeft == 0) return myExpansionLimit; TreeModel model = tree.getModel(); Object node = path.getLastPathComponent(); int levelDecrement = 0; if (!tree.isExpanded(path) && !model.isLeaf(node)) { tree.expandPath(path); levelDecrement = 1; myExpansionLimit--; } for (int i = 0; i < model.getChildCount(node); i++) { Object child = model.getChild(node, i); if (model.isLeaf(child)) continue; ExpandContext childContext = new ExpandContext(myExpansionLimit, myLevelsLeft - levelDecrement); myExpansionLimit = childContext.expand(tree, path.pathByAddingChild(child)); if (myExpansionLimit <= 0) return 0; } return myExpansionLimit; } } }