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