fixed for tree updates for invalid model elements
[fedora-idea.git] / source / com / intellij / util / xml / tree / BaseDomElementNode.java
blobbdb95c34db939cd6d1a03201205309c5dc97ca1e
1 package com.intellij.util.xml.tree;
3 import jetbrains.fabrique.ui.treeStructure.SimpleNode;
4 import com.intellij.openapi.diagnostic.Logger;
5 import com.intellij.ui.SimpleTextAttributes;
6 import com.intellij.util.xml.DomElement;
7 import com.intellij.util.xml.GenericValue;
9 import java.util.*;
10 import java.lang.reflect.Method;
13 public class BaseDomElementNode extends AbstractDomElementNode {
14 static final private Logger LOG = Logger.getInstance(DomModelTreeStructure.class.getName());
16 protected DomElement myDomElement;
17 protected String myTagName;
19 public BaseDomElementNode(final DomElement modelElement) {
20 this(modelElement, modelElement.getTagName(), null);
23 public BaseDomElementNode(final DomElement modelElement, final String tagName, SimpleNode parent) {
24 super(parent);
26 myDomElement = modelElement;
27 myTagName = tagName == null ? "unknown" : tagName;
30 public SimpleNode[] getChildren() {
31 return doGetChildren(myDomElement);
34 protected SimpleNode[] doGetChildren(final DomElement domlElement) {
35 if (!domlElement.isValid()) return NO_CHILDREN;
36 List<SimpleNode> children = new ArrayList<SimpleNode>();
38 final Collection<Method> methods = domlElement.getMethodsInfo().getFixedChildrenGetterMethods();
40 for (Method method : methods) {
41 try {
42 final Object result = method.invoke(domlElement, new Object[0]);
44 if (result instanceof DomElement) {
45 final String tagName = domlElement.getMethodsInfo().getTagName(method);
47 if (showGenericValues() && result instanceof GenericValue) {
48 children.add(new GenericValueNode((GenericValue)result, tagName, this));
49 } else {
51 children.add(getDomElementNode((DomElement)result, tagName, this));
55 catch (Throwable e) {
56 LOG.error(e);
60 final Collection<Method> collectionMethods = domlElement.getMethodsInfo().getCollectionChildrenGetterMethods();
62 for (Method method : collectionMethods) {
63 children.add(getDomElementsGroupNode(domlElement, method));
66 AbstractDomElementNode[] childrenNodes = children.toArray(new AbstractDomElementNode[children.size()]);
67 if (showOrdered()) {
68 Arrays.sort(childrenNodes, getComparator());
71 return childrenNodes;
74 protected DomElementsGroupNode getDomElementsGroupNode(final DomElement domElement, final Method method) {
75 return new DomElementsGroupNode(domElement, method);
78 protected boolean showOrdered() {
79 return true;
82 protected boolean showGenericValues() {
83 return true;
86 public Object[] getEqualityObjects() {
87 return NONE;
90 protected boolean doUpdate() {
91 setUniformIcon(getNodeIcon());
92 clearColoredText();
93 addColoredFragment(getNodeName(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
95 return super.doUpdate();
98 public String getNodeName() {
99 return getPropertyName(myTagName);
102 public String getTagName() {
103 return myTagName;
106 public DomElement getDomElement() {
107 return myDomElement;
110 protected Comparator<AbstractDomElementNode> getComparator() {
111 return new Comparator<AbstractDomElementNode>() {
112 public int compare(final AbstractDomElementNode node1, final AbstractDomElementNode node2) {
113 return node1.getNodeName().toLowerCase().compareTo(node2.getNodeName().toLowerCase());
118 public boolean isAutoExpandNode() {
119 return getParent() == null;