package jetbrains.mps.ide.hierarchy; /*Generated by MPS */ import java.util.Set; import org.jetbrains.mps.openapi.model.SNode; import java.util.HashSet; import java.awt.Color; import java.util.List; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import jetbrains.mps.ide.messages.Icons; import jetbrains.mps.util.StringUtil; public class ChildHierarchyTreeNode extends HierarchyTreeNode { private boolean myInitialized = false; private Set<SNode> myVisited; public ChildHierarchyTreeNode(SNode declaration, AbstractHierarchyTree tree, Set<SNode> visited) { super(declaration, tree); myVisited = new HashSet<SNode>(visited); setColor(new Color(64, 0, 144)); setText(calculateText()); } @Override public boolean isInitialized() { return myInitialized; } @Override protected void doInit() { try { SNode node = (SNode) getUserObject(); List<SNode> descendants = new ArrayList<SNode>(myHierarchyTree.getAbstractChildren(node, myVisited)); Collections.sort(descendants, new Comparator<SNode>() { @Override public int compare(SNode o1, SNode o2) { return ("" + o1.getPresentation()).compareTo(o2.getPresentation()); } }); Set<SNode> visited = new HashSet<SNode>(myVisited); visited.add(node); for (SNode descendant : descendants) { ChildHierarchyTreeNode childHierarchyTreeNode = new ChildHierarchyTreeNode(descendant, myHierarchyTree, visited); add(childHierarchyTreeNode); } } catch (CircularHierarchyException ex) { SNode errorNode = (SNode) ex.getRepeatedObject(); final String message = ex.getMessage(); HierarchyTreeNode errorTreeNode = new HierarchyTreeNode(errorNode, myHierarchyTree) { @Override protected void doUpdatePresentation() { super.doUpdatePresentation(); setIcon(Icons.ERROR_ICON); setColor(Color.RED); } @Override protected String calculateAdditionalText() { return message; } }; add(errorTreeNode); } myInitialized = true; } @Override public boolean isLeaf() { if (!(isInitialized())) { return false; } return getChildCount() == 0; } @Override protected void doUpdate() { this.removeAllChildren(); myInitialized = false; } public String calculateText() { String name = super.toString(); HierarchyTreeNode hierarchyNode = myHierarchyTree.getActiveTreeNode(); if (hierarchyNode == this) { name = StringUtil.escapeXml(name); } return name; } }