private static boolean doChooseLanguageToInject(Editor editor, final Processor<String> onChosen) {
    final String[] langIds = InjectedLanguage.getAvailableLanguageIDs();
    Arrays.sort(langIds);

    final JList list = new JBList(langIds);
    list.setCellRenderer(
        new ListCellRendererWrapper<String>(list.getCellRenderer()) {
          @Override
          public void customize(
              JList list, String value, int index, boolean selected, boolean hasFocus) {
            final Language language = InjectedLanguage.findLanguageById(value);
            assert language != null;
            final FileType ft = language.getAssociatedFileType();
            setIcon(ft != null ? ft.getIcon() : EmptyIcon.ICON_16);
            setText(
                language.getDisplayName() + (ft != null ? " (" + ft.getDescription() + ")" : ""));
          }
        });
    new PopupChooserBuilder(list)
        .setItemChoosenCallback(
            new Runnable() {
              public void run() {
                final String string = (String) list.getSelectedValue();
                onChosen.process(string);
              }
            })
        .setFilteringEnabled(new Function.Self<Object, String>())
        .createPopup()
        .showInBestPositionFor(editor);
    return true;
  }
 public static List<Injectable> getAllInjectables() {
   Language[] languages = InjectedLanguage.getAvailableLanguages();
   List<Injectable> list = new ArrayList<Injectable>();
   for (Language language : languages) {
     list.add(Injectable.fromLanguage(language));
   }
   list.addAll(Arrays.asList(ReferenceInjector.EXTENSION_POINT_NAME.getExtensions()));
   Collections.sort(list);
   return list;
 }
 private static void invokeImpl(Project project, Editor editor, PsiFile file, String languageId) {
   final PsiLanguageInjectionHost host = findInjectionHost(editor, file);
   if (host == null) return;
   if (defaultFunctionalityWorked(host, languageId)) return;
   final Language language = InjectedLanguage.findLanguageById(languageId);
   try {
     for (LanguageInjectionSupport support : InjectorUtils.getActiveInjectionSupports()) {
       if (support.addInjectionInPlace(language, host)) return;
     }
     TemporaryPlacesRegistry.getInstance(project)
         .getLanguageInjectionSupport()
         .addInjectionInPlace(language, host);
   } finally {
     FileContentUtil.reparseFiles(project, Collections.<VirtualFile>emptyList(), true);
   }
 }