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
;
10 import java
.util
.HashMap
;
11 import java
.util
.List
;
12 import java
.util
.ArrayList
;
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) {
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
);
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
);
93 private static class PackagingNodeState
{
94 private final String myName
;
95 private Map
<String
, PackagingNodeState
> myChildren
;
97 private PackagingNodeState(final String 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();
113 private PackagingNodeState
findChild(String name
) {
114 return myChildren
!= null ? myChildren
.get(name
) : null;