1 package com
.intellij
.util
.xml
.tree
;
3 import com
.intellij
.openapi
.actionSystem
.*;
4 import com
.intellij
.openapi
.actionSystem
.ex
.ActionManagerEx
;
5 import com
.intellij
.openapi
.util
.IconLoader
;
6 import com
.intellij
.ui
.components
.panels
.Wrapper
;
7 import com
.intellij
.util
.ui
.tree
.TreeUtil
;
8 import com
.intellij
.util
.xml
.DomElement
;
9 import com
.intellij
.util
.xml
.DomEventListener
;
10 import com
.intellij
.util
.xml
.DomManager
;
11 import com
.intellij
.util
.xml
.events
.DomEvent
;
12 import jetbrains
.fabrique
.ui
.treeStructure
.*;
13 import jetbrains
.fabrique
.ui
.treeStructure
.actions
.CollapseAllAction
;
14 import jetbrains
.fabrique
.ui
.treeStructure
.actions
.ExpandAllAction
;
17 import javax
.swing
.tree
.DefaultMutableTreeNode
;
18 import javax
.swing
.tree
.DefaultTreeModel
;
21 import java
.util
.ArrayList
;
23 import org
.jetbrains
.annotations
.Nullable
;
25 public class DomModelTreeView
extends Wrapper
implements DataProvider
{
26 public static String DOM_MODEL_TREE_VIEW_KEY
= "DOM_MODEL_TREE_VIEW_KEY";
27 public static String DOM_MODEL_TREE_VIEW_POPUP
= "DOM_MODEL_TREE_VIEW_POPUP";
29 private final SimpleTree myTree
;
30 private final SimpleTreeBuilder myBuilder
;
31 private DomManager myDomManager
;
32 private DomEventListener myDomEventListener
;
33 private DomElement myRootElement
;
35 public DomModelTreeView(DomElement rootElement
) {
36 this(rootElement
, false);
39 public DomModelTreeView(DomElement rootElement
, boolean isRootVisible
) {
40 myRootElement
= rootElement
;
41 myTree
= new SimpleTree(new DefaultTreeModel(new DefaultMutableTreeNode()));
42 myTree
.setRootVisible(isRootVisible
);
43 myTree
.setShowsRootHandles(true);
45 ToolTipManager
.sharedInstance().registerComponent(myTree
);
46 TreeUtil
.installActions(myTree
);
48 final SimpleTreeStructure treeStructure
= rootElement
!= null ?
getTreeStructure(rootElement
) : new SimpleTreeStructure() {
49 public Object
getRootElement() {
54 myBuilder
= new SimpleTreeBuilder(myTree
, (DefaultTreeModel
)myTree
.getModel(), treeStructure
, WeightBasedComparator
.INSTANCE
);
55 myBuilder
.setNodeDescriptorComparator(null);
58 add(myTree
, BorderLayout
.CENTER
);
60 myDomEventListener
= new DomEventListener() {
61 public void eventOccured(DomEvent event
) {
62 myBuilder
.updateFromRoot(false);
65 myDomManager
= rootElement
.getManager();
66 myDomManager
.addDomEventListener(myDomEventListener
);
68 myTree
.setPopupGroup(getPopupActions(), DOM_MODEL_TREE_VIEW_POPUP
);
71 public DomElement
getRootElement() {
75 protected SimpleTreeStructure
getTreeStructure(final DomElement rootDomElement
) {
76 return new DomModelTreeStructure(rootDomElement
);
79 public SimpleTreeBuilder
getBuilder() {
83 public void dispose() {
84 myDomManager
.removeDomEventListener(myDomEventListener
);
87 public SimpleTree
getTree() {
91 protected ActionGroup
getPopupActions() {
92 DefaultActionGroup group
= new DefaultActionGroup();
94 group
.add(ActionManagerEx
.getInstance().getAction("DomElementsTreeView.TreePopup"));
97 group
.add(new ExpandAllAction(myTree
));
98 group
.add(new CollapseAllAction(myTree
));
104 public Object
getData(String dataId
) {
105 if (DOM_MODEL_TREE_VIEW_KEY
.equals(dataId
)) {
111 public void setSelectedDomElement(final DomElement domElement
) {
112 if(domElement
== null) return;
114 final java
.util
.List
<SimpleNode
> parentsNodes
= new ArrayList
<SimpleNode
>();
116 SimpleNodeVisitor visitor
= new SimpleNodeVisitor() {
117 public boolean accept(SimpleNode simpleNode
) {
118 if(simpleNode
instanceof BaseDomElementNode
) {
119 final DomElement nodeElement
= ((AbstractDomElementNode
)simpleNode
).getDomElement();
120 if(isParent(nodeElement
, domElement
)) {
121 parentsNodes
.add(simpleNode
);
127 private boolean isParent(final DomElement potentialParent
, final DomElement domElement
) {
128 DomElement currParent
= domElement
;
129 while(currParent
!= null) {
130 if(currParent
.equals(potentialParent
)) return true;
132 currParent
= currParent
.getParent();
138 getTree().accept(getBuilder(), visitor
);
139 if(parentsNodes
.size() > 0) {
140 getTree().setSelectedNode(getBuilder(), parentsNodes
.get(parentsNodes
.size()-1), true);