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