dom elements highlighting
[fedora-idea.git] / source / com / intellij / util / xml / tree / DomModelTreeView.java
blobdd67e612bbfc66e7233199689300b0e583f184aa
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;
16 import javax.swing.*;
17 import javax.swing.event.TreeExpansionListener;
18 import javax.swing.event.TreeExpansionEvent;
19 import javax.swing.tree.DefaultMutableTreeNode;
20 import javax.swing.tree.DefaultTreeModel;
21 import java.awt.*;
22 import java.util.Map;
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() {
52 return null;
56 myBuilder = new SimpleTreeBuilder(myTree, (DefaultTreeModel)myTree.getModel(), treeStructure, WeightBasedComparator.INSTANCE);
57 myBuilder.setNodeDescriptorComparator(null);
58 myBuilder.initRoot();
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);
76 simpleNode.update();
79 });
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() {
93 return myRootElement;
96 protected SimpleTreeStructure getTreeStructure(final DomElement rootDomElement) {
97 return new DomModelTreeStructure(rootDomElement);
100 public SimpleTreeBuilder getBuilder() {
101 return myBuilder;
104 public void dispose() {
105 myDomManager.removeDomEventListener(myDomEventListener);
108 public SimpleTree getTree() {
109 return myTree;
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));
121 return group;
124 @Nullable
125 public Object getData(String dataId) {
126 if (DOM_MODEL_TREE_VIEW_KEY.equals(dataId)) {
127 return this;
129 return null;
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);
145 return false;
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();
155 return false;
159 getTree().accept(getBuilder(), visitor);
160 if(parentsNodes.size() > 0) {
161 getTree().setSelectedNode(getBuilder(), parentsNodes.get(parentsNodes.size()-1), true);