idea
Plugin
IntelliJ
JetBrains

IntelliJ IDEAのプラグインを作ろう!(アクションの追加, 通知, ダイアログ)

まえがき

この記事シリーズのソースコードは以下のリポジトリで管理されています。
Qiita Artifact Plugin

目次

  1. プロジェクト作成と設定まで
  2. アクションの追加, 通知, ダイアログ(ここ)
  3. 拡張ポイント

はじめに

前回の記事で独自言語作るとか言いましたがまずは基礎から行きましょう。

アクション

アクションとは

プラグインはメニューやツールバーに新しい項目を追加しUIをカスタマイズできます。
AnActionクラスが用意されactionPerformedがクリックするたびに呼び出されます。

独自のアクションを作成するには
1. AnActionを継承したクラスを作りactionPerformedを実装
1. plugin.xmlにアクションを定義
という2つの手順が必要です。

アクションの定義

  1. まずは例としてTestActionクラスを作成します。 New -> JavaClassより作成してください。

標準でPlugin DevKit -> Actionという便利なものがありますが最初のうちはわかりづらいので無視

下のように実装してください

TestAction.java
public class TestAction extends AnAction {
    public TestAction() {
        super("Test Action");
    }

    @Override
    public void actionPerformed(AnActionEvent event) {
        Messages.showMessageDialog(event.getProject(), "Clicked!", "Fire Action", Messages.getInformationIcon());
    }
}

ちょっとした解説

AnActionクラスにはString text, String description, Icon iconの3つを指定できます。
今回はString titleのみ指定しています。

アクションの登録

plugin.xml内の<actions>タグに書くことで登録できます。
今回はIDEの上部のメニューに登録します。
<action>内を以下のように記述してください。

plugin.xml
<idea-plugin>
  ...
  <actions>
    <group id="<プラグイン名>.Menu" text="<表示名>">
      <add-to-group group-id="MainMenu" anchor="last" />
      <action class="<パッケージ名>.TestAction" id="<プラグイン名>.TestAction" />
    </group>
  </actions>
</idea-plugin>

アクション追加のまとめ

  1. AnAction実装
  2. plugin.xml登録でOK

でも....
めんどくさくない?
今回はIDE上部のメニューに登録したが他の場所にはどうやって登録するのか,キーボードショートカットとかどうするとかわからないことだらけです。

ので
New -> Plugin DevKit -> Actionの出番です。
これを選択するとウィンドウが出てくるので簡単に設定できます。

  • Action ID: さっきの"<プラグイン名>.TestAction"
  • Class Name: さっきの"<パッケージ名>.TestAction"
  • Name: メニューに表示される名前(さっきの"Test Action")
  • Description: 説明
  • Add to Group
    • Groups: どこに追加するかです,他のプラグインが利用しているgroupも表示されます。
    • Actions: どのプルダウンの中に属するか
  • Keyboard Shortcuts: TextBoxにフォーカスして入力すれば自動でShift, Ctrlなど書いてくれる

のように簡単に設定できます。

(次に通知の説明するので)試しに新しいActionを追加しましょう
- Action ID: <プラグイン名>.NotificationAction
- Class Name: <パッケージ名>.NotificationAction
を「アクションの登録」内で作成したgroup内に作成してください。
また、Class Nameに対応するAnActionを実装したクラスも作成してください。

plugin.xml
<actions>
  <group ...>
    <add-to-group ... />

    <action class="<パッケージ名>.NotificationAction" id="<プラグイン名>.NotificationAction"
              text="Notification" icon="AllIcons.General.Balloon"/>
  </group>
</actions>

<action>二行目はsuper("title")などで記述していたものをplugin.xmlで記述した場合の例です

こんな感じになりましたか?

通知

ここまで長過ぎたから端折る

通知とは

右下に出てくるのみたことありますか?あれです。
右下,Event Logからも確認できます。

通知の実装

通知はNotifications.Bus.notify(Notification notification)メソッドを用いて発行します。
Notificationクラスには

  • String groupDisplayId:<プラグイン名>など
  • String title: 通知のタイトル
  • String content: 内容
  • NotificationType type:
    • INFORMATION
    • WARNING
    • ERROR
  • NotificationListener listener: (よくわからなかった)

が指定できます。
Actionと組み合わせて発行してみましょう。
先ほど作成したNotificationActionに下のように記述してください。

NotificationAction.java
    @Override
    public void actionPerformed(AnActionEvent event) {
        Notifications.Bus.notify(new Notification("<プラグイン名>", "Title", "Content", NotificationType.INFORMATION));
    }

実行し,Notification Actionを実行すると通知が発行されます。

ダイアログ

ダイアログとは

メッセージを表示したり,OK, Cancelなどの選択, 文字入力などいろいろなことができます。

ダイアログの実装

ダイアログはMessages.show(.*)Dialogメソッドで表示できます。

まず以下のActionを「アクションの登録」内で作成したgroup内に追加してください。

plugin.xml
<action class="<パッケージ名>.DialogAction" id="<プラグイン名>.DialogAction"
              text="Dialog" icon="AllIcons.Debugger.Console" />

DialogActionクラス内に下のように記述してください。

DialogAction.java
@Override
    public void actionPerformed(AnActionEvent event) {
        String name = Messages.showInputDialog("What's your name?", "Ask Name", AllIcons.General.QuestionDialog);
        Messages.showMessageDialog("Hello, " + name + ". I'll help you.", "Greeting", Messages.getInformationIcon());
    }

このように特定の値を取得できるDialogからなにもないものもあります。
補完時に返り値を確認することで簡単にわかりますね。
JavascriptみたいにCallback地獄じゃなくてよかった

おわりに

ちょっと量が多くなりました。そして後半端折り過ぎました。
わからない部分はこの記事のコメント欄で聞いていただけると返信できるかと思います。

さて、そろそろこんなクソみたいな導入を終えて独自言語はよと思うかもしれませんがまだです。
次はIDEがいろいろな動作をしたときにそれを受けて動作させられるExtension Pointについて解説します。

ここ