distinguish annotation interfaces in Ctrl-hover popup (IDEADEV-40633)
[fedora-idea.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / packaging / PackagingTreeState.java
blob6662411752b0fb096e045f1e365b4a90549e8e46
1 package com.intellij.openapi.roots.ui.configuration.packaging;
3 import com.intellij.ui.treeStructure.Tree;
4 import com.intellij.util.ArrayUtil;
5 import org.jetbrains.annotations.NotNull;
6 import org.jetbrains.annotations.Nullable;
8 import javax.swing.tree.TreePath;
9 import java.util.Map;
10 import java.util.HashMap;
11 import java.util.List;
12 import java.util.ArrayList;
14 /**
15 * @author nik
17 public class PackagingTreeState {
18 private final PackagingNodeState myRootState;
19 private final List<String[]> mySelectedPaths;
21 private PackagingTreeState(Tree tree) {
22 myRootState = saveState(tree, (PackagingTreeNode)tree.getModel().getRoot());
23 mySelectedPaths = new ArrayList<String[]>();
24 TreePath[] treePaths = tree.getSelectionPaths();
25 if (treePaths != null) {
26 for (TreePath path : treePaths) {
27 Object[] pathElements = path.getPath();
28 String[] names = ArrayUtil.newStringArray(pathElements.length);
29 for (int i = 0; i < pathElements.length; i++) {
30 names[i] = ((PackagingTreeNode)pathElements[i]).getOutputFileName();
32 mySelectedPaths.add(names);
37 public static PackagingTreeState saveState(Tree tree) {
38 return new PackagingTreeState(tree);
41 public void restoreState(Tree tree) {
42 if (myRootState != null) {
43 expandNodes(tree, (PackagingTreeNode)tree.getModel().getRoot(), myRootState);
46 List<TreePath> paths = new ArrayList<TreePath>();
47 for (String[] selectedPath : mySelectedPaths) {
48 PackagingTreeNode node = (PackagingTreeNode)tree.getModel().getRoot();
49 TreePath path = new TreePath(node);
50 for (int i = 1; i < selectedPath.length; i++) {
51 node = node.findChildByName(selectedPath[i]);
52 if (node == null) break;
53 path = path.pathByAddingChild(node);
55 if (path.getPathCount() > 1) {
56 paths.add(path);
59 tree.setSelectionPaths(paths.toArray(new TreePath[paths.size()]));
62 private static void expandNodes(final Tree tree, final PackagingTreeNode node, final PackagingNodeState nodeState) {
63 TreePath path = new TreePath(node.getPath());
64 if (!tree.isExpanded(path)) {
65 tree.expandPath(path);
67 for (PackagingTreeNode child : node.getChildren()) {
68 PackagingNodeState childState = nodeState.findChild(child.getOutputFileName());
69 if (childState != null) {
70 expandNodes(tree, child, childState);
75 @Nullable
76 private static PackagingNodeState saveState(final Tree tree, final PackagingTreeNode node) {
77 if (tree.isExpanded(new TreePath(node.getPath()))) {
78 List<PackagingTreeNode> children = node.getChildren();
79 if (!children.isEmpty()) {
80 PackagingNodeState nodeState = new PackagingNodeState(node.getOutputFileName());
81 for (PackagingTreeNode child : children) {
82 PackagingNodeState childState = saveState(tree, child);
83 if (childState != null) {
84 nodeState.addChild(childState);
87 return nodeState;
90 return null;
93 private static class PackagingNodeState {
94 private final String myName;
95 private Map<String, PackagingNodeState> myChildren;
97 private PackagingNodeState(final String name) {
98 myName = name;
101 public void addChild(@NotNull PackagingNodeState childState) {
102 if (myChildren == null) {
103 myChildren = new HashMap<String, PackagingNodeState>();
105 myChildren.put(childState.myName, childState);
108 public boolean isExpanded() {
109 return myChildren != null && !myChildren.isEmpty();
112 @Nullable
113 private PackagingNodeState findChild(String name) {
114 return myChildren != null ? myChildren.get(name) : null;