package jetbrains.mps.ide.refactoring; /*Generated by MPS */ import com.intellij.ui.components.JBScrollPane; import jetbrains.mps.project.MPSProject; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.ide.ThreadUtils; import javax.swing.tree.TreePath; import jetbrains.mps.ide.hierarchy.AbstractHierarchyTree; import jetbrains.mps.refactoring.framework.ConceptAncestorsProvider; import org.jetbrains.mps.openapi.module.SRepository; import java.util.Set; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import jetbrains.mps.internal.collections.runtime.IWhereFilter; public class NodeHierarchyChooser extends JBScrollPane { private NodeHierarchyChooser.MyHierarchyTree myTree; public NodeHierarchyChooser(MPSProject mpsProject, final SNode node) { // XXX no need to extend ScrollPane, shall aggregate instead this.myTree = new NodeHierarchyChooser.MyHierarchyTree(mpsProject.getRepository()); mpsProject.getModelAccess().runReadAction(new Runnable() { public void run() { NodeHierarchyChooser.this.myTree.setHierarchyNode(SNodeOperations.getNodeAncestor(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration"), false, false)); } }); this.setViewportView(this.myTree); ThreadUtils.runInUIThreadNoWait(new Runnable() { public void run() { NodeHierarchyChooser.this.myTree.rebuildNow(); } }); } public Object getSelectedObject() { TreePath path = myTree.getSelectionPath(); if (path == null) { return null; } return myTree.getSelectionPath().getLastPathComponent(); } public static class MyHierarchyTree extends AbstractHierarchyTree { private ConceptAncestorsProvider ancestorsProvider; public MyHierarchyTree(SRepository repo) { super(repo); } @Override protected Set<SNode> getDescendants(SNode node, Set<SNode> visited) { this.ancestorsProvider = new ConceptAncestorsProvider(); Set<SNode> descendants = this.ancestorsProvider.getDescendants(node); return SetSequence.fromSetWithValues(new HashSet<SNode>(), SetSequence.fromSet(descendants).where(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return !(SNodeOperations.getModel(it).isReadOnly()); } })); } @Override protected SNode getParent(SNode node) { return null; } @Override protected Set<SNode> getParents(SNode node, Set<SNode> visited) { return new HashSet<SNode>(); } @Override protected String noNodeString() { return "no node"; } } }