package jetbrains.mps.ide.editor.util; /*Generated by MPS */ import jetbrains.mps.project.Project; import java.util.List; import org.jetbrains.mps.openapi.model.SNodeReference; import jetbrains.mps.ide.editor.util.renderer.BaseRenderer; import com.intellij.ui.awt.RelativePoint; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.ide.navigation.NodeNavigatable; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import jetbrains.mps.openapi.editor.cells.EditorCell; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import jetbrains.mps.nodeEditor.EditorComponent; import java.awt.Point; import javax.swing.ListCellRenderer; import jetbrains.mps.classloading.ModuleClassLoader; import javax.swing.JList; import com.intellij.ui.components.JBList; import com.intellij.openapi.ui.popup.PopupChooserBuilder; public class GoToContextMenuUtil { public static void showMenu(Project project, String title, List<SNodeReference> nodes, final BaseRenderer renderer, RelativePoint point) { if (ListSequence.fromList(nodes).isEmpty()) { return; } List<NodeNavigatable> navigatables = new ArrayList<NodeNavigatable>(); for (SNodeReference node : nodes) { navigatables.add(new NodeNavigatable(project, node)); } Collections.sort(navigatables, new Comparator<NodeNavigatable>() { @Override public int compare(NodeNavigatable o1, NodeNavigatable o2) { return getText(o1).compareTo(getText(o2)); } private String getText(NodeNavigatable element) { return element.getNodePointer().toString(); } }); openTargets(point, navigatables, title, renderer); } public static RelativePoint getRelativePoint(EditorCell selectedCell, InputEvent inputEvent) { if (inputEvent instanceof MouseEvent) { return new RelativePoint(((MouseEvent) inputEvent)); } return new RelativePoint((EditorComponent) selectedCell.getEditorComponent(), new Point(selectedCell.getX(), selectedCell.getY())); } private static void openTargets(RelativePoint p, List<NodeNavigatable> targets, String title, ListCellRenderer listRenderer) { assert !(GoToHelper.class.getClassLoader() instanceof ModuleClassLoader) : "if this class is loaded by a reloadable classloader, this will cause memleaks. See MPS-13481"; if (targets.isEmpty()) { return; } if (targets.size() == 1) { targets.get(0).navigate(true); } else { final JList list = new JBList(targets.toArray()); list.setCellRenderer(listRenderer); new PopupChooserBuilder(list).setTitle(title).setMovable(true).setItemChoosenCallback(new Runnable() { @Override public void run() { int[] ids = list.getSelectedIndices(); if (ids == null || ids.length == 0) { return; } Object[] selectedElements = list.getSelectedValues(); for (Object element : selectedElements) { NodeNavigatable selected = (NodeNavigatable) element; selected.navigate(true); } } }).createPopup().show(p); } } }