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
.event
.TreeExpansionListener
;
18 import javax
.swing
.event
.TreeExpansionEvent
;
19 import javax
.swing
.tree
.DefaultMutableTreeNode
;
20 import javax
.swing
.tree
.DefaultTreeModel
;
23 import java
.util
.ArrayList
;
25 import org
.jetbrains
.annotations
.Nullable
;
27 public class DomModelTreeView
extends Wrapper
implements DataProvider
{
28 public static String DOM_MODEL_TREE_VIEW_KEY
= "DOM_MODEL_TREE_VIEW_KEY";
29 public static String DOM_MODEL_TREE_VIEW_POPUP
= "DOM_MODEL_TREE_VIEW_POPUP";
31 private final SimpleTree myTree
;
32 private final SimpleTreeBuilder myBuilder
;
33 private DomManager myDomManager
;
34 private DomEventListener myDomEventListener
;
35 private DomElement myRootElement
;
37 public DomModelTreeView(DomElement rootElement
) {
38 this(rootElement
, false);
41 public DomModelTreeView(DomElement rootElement
, boolean isRootVisible
) {
42 myRootElement
= rootElement
;
43 myTree
= new SimpleTree(new DefaultTreeModel(new DefaultMutableTreeNode()));
44 myTree
.setRootVisible(isRootVisible
);
45 myTree
.setShowsRootHandles(true);
47 ToolTipManager
.sharedInstance().registerComponent(myTree
);
48 TreeUtil
.installActions(myTree
);
50 final SimpleTreeStructure treeStructure
= rootElement
!= null ?
getTreeStructure(rootElement
) : new SimpleTreeStructure() {
51 public Object
getRootElement() {
56 myBuilder
= new SimpleTreeBuilder(myTree
, (DefaultTreeModel
)myTree
.getModel(), treeStructure
, WeightBasedComparator
.INSTANCE
);
57 myBuilder
.setNodeDescriptorComparator(null);
60 add(myTree
, BorderLayout
.CENTER
);
62 myTree
.addTreeExpansionListener(new TreeExpansionListener() {
63 public void treeExpanded(TreeExpansionEvent event
) {
64 final SimpleNode simpleNode
= myTree
.getNodeFor(event
.getPath());
66 if(simpleNode
instanceof AbstractDomElementNode
) {
67 ((AbstractDomElementNode
)simpleNode
).setExpanded(true);
71 public void treeCollapsed(TreeExpansionEvent event
) {
72 final SimpleNode simpleNode
= myTree
.getNodeFor(event
.getPath());
74 if(simpleNode
instanceof AbstractDomElementNode
) {
75 ((AbstractDomElementNode
)simpleNode
).setExpanded(false);
81 myDomEventListener
= new DomEventListener() {
82 public void eventOccured(DomEvent event
) {
83 myBuilder
.updateFromRoot(false);
86 myDomManager
= rootElement
.getManager();
87 myDomManager
.addDomEventListener(myDomEventListener
);
89 myTree
.setPopupGroup(getPopupActions(), DOM_MODEL_TREE_VIEW_POPUP
);
92 public DomElement
getRootElement() {
96 protected SimpleTreeStructure
getTreeStructure(final DomElement rootDomElement
) {
97 return new DomModelTreeStructure(rootDomElement
);
100 public SimpleTreeBuilder
getBuilder() {
104 public void dispose() {
105 myDomManager
.removeDomEventListener(myDomEventListener
);
108 public SimpleTree
getTree() {
112 protected ActionGroup
getPopupActions() {
113 DefaultActionGroup group
= new DefaultActionGroup();
115 group
.add(ActionManagerEx
.getInstance().getAction("DomElementsTreeView.TreePopup"));
116 group
.addSeparator();
118 group
.add(new ExpandAllAction(myTree
));
119 group
.add(new CollapseAllAction(myTree
));
125 public Object
getData(String dataId
) {
126 if (DOM_MODEL_TREE_VIEW_KEY
.equals(dataId
)) {
132 public void setSelectedDomElement(final DomElement domElement
) {
133 if(domElement
== null) return;
135 final java
.util
.List
<SimpleNode
> parentsNodes
= new ArrayList
<SimpleNode
>();
137 SimpleNodeVisitor visitor
= new SimpleNodeVisitor() {
138 public boolean accept(SimpleNode simpleNode
) {
139 if(simpleNode
instanceof BaseDomElementNode
) {
140 final DomElement nodeElement
= ((AbstractDomElementNode
)simpleNode
).getDomElement();
141 if(isParent(nodeElement
, domElement
)) {
142 parentsNodes
.add(simpleNode
);
148 private boolean isParent(final DomElement potentialParent
, final DomElement domElement
) {
149 DomElement currParent
= domElement
;
150 while(currParent
!= null) {
151 if(currParent
.equals(potentialParent
)) return true;
153 currParent
= currParent
.getParent();
159 getTree().accept(getBuilder(), visitor
);
160 if(parentsNodes
.size() > 0) {
161 getTree().setSelectedNode(getBuilder(), parentsNodes
.get(parentsNodes
.size()-1), true);