package jetbrains.mps.ide.depanalyzer; /*Generated by MPS */ import jetbrains.mps.ide.ui.tree.MPSTreeNode; import org.jetbrains.mps.openapi.module.SModuleReference; import jetbrains.mps.internal.collections.runtime.Sequence; import org.jetbrains.mps.openapi.module.SRepository; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.ide.icons.IdeIcons; import jetbrains.mps.ide.icons.IconManager; import java.util.Iterator; import jetbrains.mps.openapi.navigation.ProjectPaneNavigator; import jetbrains.mps.project.Project; public class ModuleDependencyNode extends MPSTreeNode { private boolean myInitialized; private Iterable<DepPath> myCycles; private final SModuleReference myModule; private final boolean myIsUsedLang; /*package*/ ModuleDependencyNode(SModuleReference module, Iterable<DepLink> relations, boolean isUsedLanguage) { // module serves as dependency target (dependencies are captured with relations sequence) super(Sequence.fromIterable(relations).toListSequence()); myModule = module; myIsUsedLang = isUsedLanguage; setText(module.getModuleName()); setNodeIdentifier(module.getModuleName()); } /*package*/ void updateIcon(SRepository repo) { SModule m = myModule.resolve(repo); if (m == null) { setIcon(IdeIcons.DEFAULT_ICON); } else { setIcon(IconManager.getIconFor(m)); } } public SModuleReference getModule() { return myModule; } /** * Module associated with this node might be target of few dependencies of the initial module. */ /*package*/ Iterable<DepLink> getCapturedDependencies() { return (Iterable<DepLink>) getUserObject(); } public boolean isUsedLanguage() { return myIsUsedLang; } /*package*/ void setCycles(Iterable<DepPath> cycles) { myCycles = cycles; } public boolean isCyclic() { return Sequence.fromIterable(myCycles).isNotEmpty(); } @Override public boolean isLeaf() { return !(isCyclic()); } @Override protected void doInit() { DependencyTree tree = (DependencyTree) getTree(); for (DepPath c : Sequence.fromIterable(myCycles).distinct()) { Iterator<DepLink> itr = Sequence.fromIterable(c.elements()).iterator(); // skip first path element, which is always the one from my getCapturedDependencies() itr.next(); MPSTreeNode parent = this; while (itr.hasNext()) { DependencyTreeNode dtn = new DependencyTreeNode(tree.getProject(), itr.next()); parent.add(dtn); parent = dtn; } } myInitialized = true; } @Override public boolean isInitialized() { return myInitialized; } @Override public void doubleClick() { if (getProject() == null) { return; } new ProjectPaneNavigator(getProject()).select(myModule); } private Project getProject() { return (getTree() == null ? null : ((DependencyTree) getTree()).getProject()); } }