プラグイン作って覚えたことを淡々と記録するよ(JBPopup編)

これは,EditorTreeプラグインとか,IDEA本体の"Quick Documentation Lookup"や"Quick Definition Lookup"を参考に作ったよ。


いきなり話はズレるが,どうやって"Quick Documentation Lookup"や"Quick Definition Lookup"の実装を調べたかと言えば,IDEAそのものをYourKitにモニタさせて,先のアクションを実行したときのメソッドトレースから調べたのさ。
ちなみに,"Quick Documentation Lookup"は,

  • ShowJavaDocInfoAction
    • JavaDocManager
      • JavaDocInfoComponent

"Quick Definition Lookup"は,

  • ShowImplementationsAction
    • ImplementationViewComponent

となってるよ。


で,ポップアップ自体はOpenAPIのJBPopupってのを利用する。これもコード見た方が早い。

private void showPopup(Project project, Editor editor, String searchText) {
    PopupView popupView = new PopupView(searchText);
    JBPopup jbPopup = JBPopupFactory.getInstance()
                            .createComponentPopupBuilder(popupView.mainPanel, popupView.mainPanel)
                            // これ↓書いとくとポップアップのサイズ(や場所)を覚えるみたい
                            .setDimensionServiceKey(project, "popup", false)
                            .setRequestFocus(true)
                            .setResizable(true)
                            .setMovable(true)
                            .setTitle("popup-dict")
                            .createPopup();

    // showInBestPositionFor()って,なんてステキなんでしょう。:-)
    jbPopup.showInBestPositionFor(editor);
}


PopupViewってのがJBPopupに貼り付けたいコンポーネント
IDEAのGUIエディタでテキトウに作ったスーバーやっつけコードだけど,これがPopupViewの全コードよん。

public class PopupView {
    private JTextPane textPane;
    public JPanel mainPanel;

    public PopupView(String searchText) {
        try {
            // TranslateHelperはGoogle Translateから拝借
            TranslateHelper translateHelper = new TranslateHelper();
            String translatedText = translateHelper.translate(searchText, "en|ja");
            textPane.setText(translatedText);
            textPane.setBackground(HintUtil.INFORMATION_COLOR);
        }
        catch (Exception e) {
            textPane.setText(e.getMessage());
        }
    }
}