package de.janthomae.leiningenplugin.navigator;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.ui.treeStructure.SimpleNode;
import com.intellij.ui.treeStructure.SimpleTree;
import com.intellij.ui.treeStructure.SimpleTreeBuilder;
import com.intellij.ui.treeStructure.SimpleTreeStructure;
import de.janthomae.leiningenplugin.project.LeiningenProject;
import de.janthomae.leiningenplugin.project.LeiningenProjectsManager;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="janthomae@janthomae.de">Jan Thomä</a>
* @version $Id:$
*/
public class LeiningenProjectStructure extends SimpleTreeStructure {
private SimpleTreeBuilder myTreeBuilder;
private RootNode myRoot = new RootNode(null);
private Project myProject;
private final LeiningenProjectsManager myProjectsManager;
public LeiningenProjectStructure(Project project, LeiningenProjectsManager projectsManager, SimpleTree tree) {
super();
myProject = project;
myProjectsManager = projectsManager;
myTreeBuilder = new SimpleTreeBuilder(tree, (DefaultTreeModel) tree.getModel(), this, null);
Disposer.register(myProject, myTreeBuilder);
myTreeBuilder.initRoot();
myTreeBuilder.expand(myRoot, null);
}
@Override
public Object getRootElement() {
return myRoot;
}
public void update() {
myRoot.clear();
final List<LeiningenProject> projects = myProjectsManager.getLeiningenProjects();
for (LeiningenProject project : projects) {
LeiningenProjectNode lpn = new LeiningenProjectNode(myRoot, project);
myRoot.addProjectNode(lpn);
}
myTreeBuilder.updateFromRoot();
myTreeBuilder.expand(myRoot, null);
}
public static <T extends SimpleNode> List<T> getSelectedNodes(SimpleTree tree, Class<T> nodeClass) {
final List<T> filtered = new ArrayList<T>();
for (SimpleNode node : getSelectedNodes(tree)) {
if ((nodeClass != null) && (!nodeClass.isInstance(node))) {
filtered.clear();
break;
}
//noinspection unchecked
filtered.add((T) node);
}
return filtered;
}
private static List<SimpleNode> getSelectedNodes(SimpleTree tree) {
List<SimpleNode> nodes = new ArrayList<SimpleNode>();
TreePath[] treePaths = tree.getSelectionPaths();
if (treePaths != null) {
for (TreePath treePath : treePaths) {
nodes.add(tree.getNodeFor(treePath));
}
}
return nodes;
}
}