/** * Returns navigation popup that shows list of related items from {@code items} list * * @param items * @param title * @param showContainingModules Whether the popup should show additional information that aligned * at the right side of the dialog.<br> * It's usually a module name or library name of corresponding navigation item.<br> * {@code false} by default * @return */ @NotNull public static JBPopup getRelatedItemsPopup( final List<? extends GotoRelatedItem> items, String title, boolean showContainingModules) { Object[] elements = new Object[items.size()]; // todo[nik] move presentation logic to GotoRelatedItem class final Map<PsiElement, GotoRelatedItem> itemsMap = new HashMap<PsiElement, GotoRelatedItem>(); for (int i = 0; i < items.size(); i++) { GotoRelatedItem item = items.get(i); elements[i] = item.getElement() != null ? item.getElement() : item; itemsMap.put(item.getElement(), item); } return getPsiElementPopup( elements, itemsMap, title, showContainingModules, element -> { if (element instanceof PsiElement) { //noinspection SuspiciousMethodCalls itemsMap.get(element).navigate(); } else { ((GotoRelatedItem) element).navigate(); } return true; }); }