faces highlighting
[fedora-idea.git] / source / com / intellij / util / xml / tree / DomModelTreeView.java
blob0cb02b069674cb7775a94e4a16e7e6913350fcbf
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.tree.DefaultMutableTreeNode;
18 import javax.swing.tree.DefaultTreeModel;
19 import java.awt.*;
20 import java.util.Map;
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() {
50 return null;
54 myBuilder = new SimpleTreeBuilder(myTree, (DefaultTreeModel)myTree.getModel(), treeStructure, WeightBasedComparator.INSTANCE);
55 myBuilder.setNodeDescriptorComparator(null);
56 myBuilder.initRoot();
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() {
72 return myRootElement;
75 protected SimpleTreeStructure getTreeStructure(final DomElement rootDomElement) {
76 return new DomModelTreeStructure(rootDomElement);
79 public SimpleTreeBuilder getBuilder() {
80 return myBuilder;
83 public void dispose() {
84 myDomManager.removeDomEventListener(myDomEventListener);
87 public SimpleTree getTree() {
88 return myTree;
91 protected ActionGroup getPopupActions() {
92 DefaultActionGroup group = new DefaultActionGroup();
94 group.add(ActionManagerEx.getInstance().getAction("DomElementsTreeView.TreePopup"));
95 group.addSeparator();
97 group.add(new ExpandAllAction(myTree));
98 group.add(new CollapseAllAction(myTree));
100 return group;
103 @Nullable
104 public Object getData(String dataId) {
105 if (DOM_MODEL_TREE_VIEW_KEY.equals(dataId)) {
106 return this;
108 return null;
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);
124 return false;
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();
134 return false;
138 getTree().accept(getBuilder(), visitor);
139 if(parentsNodes.size() > 0) {
140 getTree().setSelectedNode(getBuilder(), parentsNodes.get(parentsNodes.size()-1), true);