package com.chrisfolger.needsmoredojo.intellij.toolwindows; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; import com.intellij.ui.components.JBScrollPane; import com.intellij.ui.treeStructure.Tree; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.*; import java.util.List; public class FindCyclicDependenciesToolWindow { public void mousePressed(MouseEvent e, Tree tree, final String results) { if(SwingUtilities.isRightMouseButton(e)) { JPopupMenu popup = new JPopupMenu(); JMenuItem menuItem = new JMenuItem("Copy results to clipboard"); popup.add(menuItem); popup.show(tree, e.getX(), e.getY()); menuItem.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { super.mouseClicked(e); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); StringBuilder builder = new StringBuilder(); clipboard.setContents(new StringSelection(results), null); } }); } } public void createContent(Project project, ToolWindow toolWindow, final Map<String, List<String>> modules, int numberOfPaths) { final Tree tree = new Tree(); DefaultMutableTreeNode root = new DefaultMutableTreeNode("Modules that are part of a cyclic dependency, sorted by number of occurrences. There were " + numberOfPaths + " paths with cycles"); List<String> sortedKeys = new ArrayList<String>(); for(String key : modules.keySet()) { sortedKeys.add(key); } Collections.sort(sortedKeys, new Comparator<String>() { @Override public int compare(String o1, String o2) { return modules.get(o2).size() - modules.get(o1).size(); } }); final StringBuilder result = new StringBuilder(); for(String module : sortedKeys) { DefaultMutableTreeNode node = new DefaultMutableTreeNode(module + "(" + modules.get(module).size() + ")"); result.append(node.toString() + "\n"); for(String child : modules.get(module)) { node.add(new DefaultMutableTreeNode(child)); result.append("\t" + child + "\n"); } root.add(node); } final FindCyclicDependenciesToolWindow window = this; DefaultTreeModel model = new DefaultTreeModel(root); tree.setModel(model); tree.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { super.mousePressed(e); window.mousePressed(e, tree, result.toString()); } }); JScrollPane scrollPane = new JBScrollPane(tree); toolWindow.getComponent().add(scrollPane); } }