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
.*;
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() {
83 public void valueChanged(TagValueChangeEvent event
) {
84 super.valueChanged(event
);
87 public void elementDefined(ElementDefinedEvent event
) {
88 super.elementDefined(event
);
91 public void elementUndefined(ElementUndefinedEvent event
) {
92 super.elementUndefined(event
);
95 public void elementChanged(ElementChangedEvent event
) {
96 super.elementChanged(event
);
99 public void childAdded(CollectionElementAddedEvent event
) {
100 super.childAdded(event
);
103 public void childRemoved(CollectionElementRemovedEvent event
) {
104 super.childRemoved(event
);
107 public void eventOccured(DomEvent event
) {
108 myBuilder
.updateFromRoot(false);
111 myDomManager
= rootElement
.getManager();
112 myDomManager
.addDomEventListener(myDomEventListener
);
114 myTree
.setPopupGroup(getPopupActions(), DOM_MODEL_TREE_VIEW_POPUP
);
117 public DomElement
getRootElement() {
118 return myRootElement
;
121 protected SimpleTreeStructure
getTreeStructure(final DomElement rootDomElement
) {
122 return new DomModelTreeStructure(rootDomElement
);
125 public SimpleTreeBuilder
getBuilder() {
129 public void dispose() {
130 myDomManager
.removeDomEventListener(myDomEventListener
);
133 public SimpleTree
getTree() {
137 protected ActionGroup
getPopupActions() {
138 DefaultActionGroup group
= new DefaultActionGroup();
140 group
.add(ActionManagerEx
.getInstance().getAction("DomElementsTreeView.TreePopup"));
141 group
.addSeparator();
143 group
.add(new ExpandAllAction(myTree
));
144 group
.add(new CollapseAllAction(myTree
));
150 public Object
getData(String dataId
) {
151 if (DOM_MODEL_TREE_VIEW_KEY
.equals(dataId
)) {
157 public void setSelectedDomElement(final DomElement domElement
) {
158 if(domElement
== null) return;
160 final java
.util
.List
<SimpleNode
> parentsNodes
= new ArrayList
<SimpleNode
>();
162 SimpleNodeVisitor visitor
= new SimpleNodeVisitor() {
163 public boolean accept(SimpleNode simpleNode
) {
164 if(simpleNode
instanceof BaseDomElementNode
) {
165 final DomElement nodeElement
= ((AbstractDomElementNode
)simpleNode
).getDomElement();
166 if(isParent(nodeElement
, domElement
)) {
167 parentsNodes
.add(simpleNode
);
173 private boolean isParent(final DomElement potentialParent
, final DomElement domElement
) {
174 DomElement currParent
= domElement
;
175 while(currParent
!= null) {
176 if(currParent
.equals(potentialParent
)) return true;
178 currParent
= currParent
.getParent();
184 getTree().accept(getBuilder(), visitor
);
185 if(parentsNodes
.size() > 0) {
186 getTree().setSelectedNode(getBuilder(), parentsNodes
.get(parentsNodes
.size()-1), true);