package krasa.mavenrun.analyzer.action;
import java.awt.*;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import krasa.mavenrun.analyzer.MyTreeUserObject;
import org.jetbrains.idea.maven.model.MavenArtifact;
import org.jetbrains.idea.maven.model.MavenArtifactNode;
import org.jetbrains.idea.maven.project.MavenProject;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.project.Project;
import com.intellij.ui.PopupHandler;
/**
* @author Vojtech Krasa
*/
public class LeftTreePopupHandler extends PopupHandler {
private final Project project;
private final MavenProject mavenProject;
protected final JTree tree;
public LeftTreePopupHandler(Project project, MavenProject mavenProject, JTree tree) {
this.project = project;
this.mavenProject = mavenProject;
this.tree = tree;
}
private DefaultMutableTreeNode getRoot() {
return (DefaultMutableTreeNode) getModel().getRoot();
}
private DefaultTreeModel getModel() {
return (DefaultTreeModel) tree.getModel();
}
@SuppressWarnings("Duplicates")
public void invokePopup(final Component comp, final int x, final int y) {
final DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
if (selectedNode == null) {
return;
}
final MyTreeUserObject myTreeUserObject = (MyTreeUserObject) selectedNode.getUserObject();
final MavenArtifactNode mavenArtifactNode = myTreeUserObject.getMavenArtifactNode();
DefaultActionGroup actionGroup = new DefaultActionGroup();
if (myTreeUserObject.getMavenArtifactNode().getParent() == null) {
actionGroup.add(new JumpToSourceAction(project, mavenProject, mavenArtifactNode));
actionGroup.add(new RemoveDependencyAction(project, mavenProject, mavenArtifactNode) {
@Override
public void dependencyDeleted() {
getModel().removeNodeFromParent(selectedNode);
}
});
} else {
actionGroup.add(new JumpToSourceAction(project, mavenProject, mavenArtifactNode));
actionGroup.add(new ExcludeDependencyAction(project, mavenProject, mavenArtifactNode) {
@Override
public void dependencyExcluded() {//
// root
// | d1
// | L d2
// | | L d3
// | L d3
// L ...
// After d3 is excluded; remove d3 in the whole subtree.
// getModel().removeNodeFromParent(selectedNode);
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) selectedNode.getPath()[1];
Enumeration enumeration = treeNode.breadthFirstEnumeration();
MavenArtifact excludedArtifact = mavenArtifactNode.getArtifact();
java.util.List<DefaultMutableTreeNode> toRemove = new ArrayList<DefaultMutableTreeNode>();
while (enumeration.hasMoreElements()) {
DefaultMutableTreeNode o = (DefaultMutableTreeNode) enumeration.nextElement();
MyTreeUserObject userObject = (MyTreeUserObject) o.getUserObject();
MavenArtifact artifact = userObject.getArtifact();
if (artifact.getArtifactId().equals(excludedArtifact.getArtifactId())
&& artifact.getGroupId().equals(excludedArtifact.getGroupId())) {
toRemove.add(o);
}
}
for (DefaultMutableTreeNode node : toRemove) {
getModel().removeNodeFromParent(node);
}
}
});
}
ActionManager.getInstance().createActionPopupMenu("", actionGroup).getComponent().show(comp, x, y);
}
}