前に、NetBeans6.1で無理やりコードジェネレータを作ったことがある。
http://blogs.wankuma.com/kazuki/archive/2008/05/14/137729.aspx
これが、NetBens6.5では普通に作れるようになってるようだ。ということでやってみた。
最終的に、ハローワールド的なコードをサクッと挿入してくれるものが出来上がる予定で進めていく。
因みにNetBeans6.5 Dev 200809130201版で書いてるので正式版とは微妙に違うかもしれないです。
プロジェクトの作成
CodeGenSampleという名前でモジュールプロジェクトを作成する。
作っていくよ!
新規ファイルから、コードジェネレータを作る。
MINEタイプは、Javaを想定してるのでx-javaにした。MINEタイプを指定できるってことはJava以外でも出来るってことなのかな?出来たらいいな~と思いながら完了ボタンをクリックした。
そうすると、1つのjavaのファイルとlayer.xmlが作られる。Javaのコードは、前作った時とほとんど同じっぽい。
微妙な違いといえばinvokeメソッドにJTextComponentが渡ってきていたのに渡ってこなくなっている。どうやらコンストラクタで渡されてくるLookupから取得するようになってるらしい。
package com.wankuma.kazuki.netbeans.codegen;
import java.util.Collections;
import java.util.List;
import javax.swing.text.JTextComponent;
import org.netbeans.spi.editor.codegen.CodeGenerator;
import org.openide.util.Lookup;
public class HelloWorldCodeGenerator implements CodeGenerator {
// コードを挿入するJTextComponent
JTextComponent textComp;
// コンストラクタでlookupしてJTextComponentを取得
private HelloWorldCodeGenerator(Lookup context) {
textComp = context.lookup(JTextComponent.class);
}
// このジェネレータを作成するためのファクトリ
public static class Factory implements CodeGenerator.Factory {
public List<? extends CodeGenerator> create(Lookup context) {
return Collections.singletonList(new HelloWorldCodeGenerator(context));
}
}
// Alt + Insertしたときの画面に表示する文字列
public String getDisplayName() {
return "Sample Generator";
}
public void invoke() {
// ここにコード挿入の処理を書く
}
}
layer.xmlは、x-javaのコードジェネレータ部分にFactoryを登録するようになっている。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
<filesystem>
<folder name="Editors">
<folder name="text">
<folder name="x-java">
<folder name="CodeGenerators">
<file name="com-wankuma-kazuki-netbeans-codegen-HelloWorldCodeGenerator$Factory.instance"/>
</folder>
</folder>
</folder>
</folder>
</filesystem>
じゃぁ、HelloWorldのコードを挿入する処理を書き足していこうと思う。HelloWorldCodeGeneratorクラスのinvokeメソッドを下のようにする。JTextComponentとDocumentクラスのAPIを使って文字列を挿入してるだけのシンプル実装にしてみた。
ついでに、getDisplayNameで返す文字列も変えてみた。
// Alt + Insertしたときの画面に表示する文字列
public String getDisplayName() {
return "こんにちは世界";
}
public void invoke() {
// ここにコード挿入の処理を書く
int mark = textComp.getCaret().getMark();
try {
textComp.getDocument().insertString(mark, "System.out.println(\"こんにちは世界\");", null);
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
}
さて、たったこれだけで完成だ。F6を押して実行してみよう。
NetBeansが起動してくるので、Javaアプリケーションのプロジェクトを適当に作ってコードエディタでAlt + Insertを押してみると、さっき作ったこんにちは世界が表示されていると思う。
選択すると、ちゃんとコードが挿入される。
作るのが簡単になった。いいことだ。