techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Intellij Ideaプラグインでセットアップウィザードを作る

Androidの開発やJavaアプリの開発など様々な場面で利用されるintellijですが機能を追加する機能としてプラグインがあります。
そこで新しい言語や新しいプロジェクト構成の画面を作りたい場合にプラグインを作成してサポートする機能を追加することができます。

今回はintellijでプロジェクト作成時のセットアップウィザードを作成し、プロジェクトの作成までご紹介します。

準備

まずはintellijでプロジェクトの新規作成時にIntellij Platfrom Pluginという項目を選ぶと次のような画面が表示されます。
上部のSDKsが設定されていない場合は設定し、Nextを選択します。

f:id:muchiki0226:20160710213355p:plain:w400

Nextを選択するとプロジェクト名とワークスペースの場所を聞かれるので指定します。

そうすると次のフォルダ構成のファイルが生成されます。
今回はSampleというプロジェクト名でプロジェクトを生成しました。

Sample
├── Sample.iml
├── resources
│   └── META-INF
│       └── plugin.xml
└── src

これで下準備ができました。

実装

今回はプロジェクトの作成まで実施することからintellijのウィザード機能を使うのではなくモジュール機能を実装する必要があります。
確認したところウィザード機能はダイアログを表示して切り替えるのみでプロジェクト生成までできませんでした。
(もしかしたら使い方を間違っていた可能性もあります。)

まずはsrc以下にパッケージを切ります。
今回のサンプルはパッケージ名をcom.techium.blogのパッケージとして、次の3つのファイルを作成します。

  • ModuleType
  • ModuleBuilder
  • ModuleWizardStep

それぞれの実装を説明していきます。

まずはModuleTypeはプロジェクトの新規作成画面に遷移した時に呼び出され、ModuleBuilderを返却し生成時の処理を行ったり、 プロジェクト作成時の画面に項目として新規に追加することができるようにします。
そのため画像リソースの指定やモジュールの説明情報を返却することを行います。

[SampleModuleType.java]

public class SampleModuleType extends ModuleType<SampleModuleBuilder> {
  private static final String ID = "SAMPLE_MODULE_TYPE";

  public SampleModuleType() {
    super(ID);
  }

  public static SampleModuleType getInstance() {
    return (SampleModuleType) ModuleTypeManager.getInstance().findByID(ID);
  }

  @NotNull
  @Override
  public SampleModuleBuilder createModuleBuilder() {
    return new SampleModuleBuilder();
  }

  @NotNull
  @Override
  public String getName() {
    return "Sample Module Type";
  }

  @NotNull
  @Override
  public String getDescription() {
    return "Sample Module Type";
  }

  @Override
  public Icon getBigIcon() {
    return AllIcons.General.Information;
  }

  @Override
  public Icon getNodeIcon(@Deprecated boolean b) {
    return AllIcons.General.Information;
  }

  @NotNull
  @Override
  public ModuleWizardStep[] createWizardSteps(@NotNull WizardContext wizardContext,
                                              @NotNull SampleModuleBuilder moduleBuilder,
                                              @NotNull ModulesProvider modulesProvider) {
    return super.createWizardSteps(wizardContext, moduleBuilder, modulesProvider);
  }

コンストラクタでIDの設定をしcreateModuleBuilderでこのモジュール作成時に利用するビルダークラスのインスタンスの返却を行っています。
createModuleBuilderで返却するのはこのあと説明するSampleModuleBuilderのインスタンスを返却します。
また、getNameで返却される文字列は次のようなプロジェクト新規作成画面の左側に表示される項目の文字列となります。

f:id:muchiki0226:20160710213450p:plain:w400

さらにgetNodeIconで返却されるリソースがgetNameの文字列が表示される場所の左側のアイコンとなります。

次はModuleBuilderは新規作成画面でモジュールの種類を選択した時に表示される左側のウィザードのインスタンスを渡す機能を持っています。
ソースコードは次の様になります。

[SampleModuleBuilder]

public class SampleModuleBuilder extends ModuleBuilder {
  @Override
  public void setupRootModel(ModifiableRootModel model) throws ConfigurationException {

  }

  @Override
  public ModuleType getModuleType() {
    return SampleModuleType.getInstance();
  }

  @Nullable
  @Override
  public ModuleWizardStep getCustomOptionsStep(WizardContext context, Disposable parentDisposable) {
    return new SampleModuleWizardStep();
  }
}

getCustomOptionsStepで今回のモジュールのウィザード画面のインスタンスを渡しています。
これによって選択するとここで返却したウィザード画面のインスタンスを利用して描画を行います。

最後にModuleWizardStepはウィザード画面自体の描画に関する情報を設定するクラスになります。
次のように実装します。

public class SampleModuleWizardStep extends ModuleWizardStep {
  @Override
  public JComponent getComponent() {
    return new JLabel("独自のセットアップウィザードです!");
  }

  @Override
  public void updateDataModel() {
  }
}

ここのgetComponentでJLabelで文字列を表示するように設定しています。
ここで返却するインスタンスをかえると表示される内容が変わります。

ソースコードの準備はこれで整いました。
最後にMETA-INF内にあるplugin.xmlにこのセットアップウィザードを表示するように機能を追加します。

  <extensions defaultExtensionNs="com.intellij">
    <moduleType id="SAMPLE_MODULE_TYPE" implementationClass="jp.techium.blog.SampleModuleType"/>
  </extensions>

extensionsという項目内にmoduleTypeというのでModuleTypeクラスとそのIDを設定すると完成です。 Runすると次のような項目が表示されます。

f:id:muchiki0226:20160710213450p:plain:w400

Nextを選択すると次のような画面が表示されます。

f:id:muchiki0226:20160710213515p:plain:w400

ここでOKを押すと空プロジェクトが作成されます。