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());
}
}