NetBeans6系で気に入ってる機能の1つ!Alt + Insertでコードを色々生成出来るってのがある。
エディタ上でAlt + Insert(若干押しにくい)を押すと下のようなものが出てくる
ここから生成したいコードを選ぶと、さくっとコードが出力される。
例えば、equals() and hashCode()...を選ぶと
どのフィールドを対象にするかを選択するダイアログが出てきて
こんな感じのコードが出力される
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Employees other = (Employees) obj;
if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
return false;
}
if (this.name != other.name && (this.name == null || !this.name.equals(other.name))) {
return false;
}
if (this.entDate != other.entDate && (this.entDate == null || !this.entDate.equals(other.entDate))) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 7;
hash = 19 * hash + (this.id != null ? this.id.hashCode() : 0);
hash = 19 * hash + (this.name != null ? this.name.hashCode() : 0);
hash = 19 * hash + (this.entDate != null ? this.entDate.hashCode() : 0);
return hash;
}
これをカスタマイズしてみようと思う。
プロジェクト作成
まず、モジュールのプロジェクトを作成する。名前は何でもいいけど、とりあえずinsertという名前にした。
パッケージはcom.wankuma.kazuki.insertにしておいた。layer.xmlを使うので生成するようにしておく。
そして、ライブラリに以下の3つを追加する。Java Editorのほうは、公式に公開されてるものじゃないみたいなので、Non-API Modulesからみつけるようにする。
- Javac API Wrapper
- Java Editor(Show Non-API Modulesにチェックを入れないと出てこない)
- Java Source
そして、ここでもう一手間。
これから使うクラスは、まだ公開されてないということなので、無理やり使うように設定する。
Java Editorで右クリックしてEdit...を選択する。
出てきたダイアログで、Specification VersionからImplementation Versionに変更する。
Let's プログラミング!
そしたらおもむろにクラスを作成する。名前はcom.wankuma.kazuki.insert.HelloCodeGeneratorにする。
そしてorg.netbeans.modules.java.editor.codegen.CodeGeneratorをimplementsする。
package com.wankuma.kazuki.insert;
import javax.swing.text.JTextComponent;
import org.netbeans.modules.java.editor.codegen.CodeGenerator;
public class HelloCodeGenerator implements CodeGenerator {
public String getDisplayName() {
return null;
}
public void invoke(JTextComponent textComponent) {
}
}
getDisplayNameはAlt + Insertのときに表示されるテキスト。invokeは、実際の挿入処理を行うみたい。
さくっと実装してみた。
public String getDisplayName() {
return "Hello world";
}
public void invoke(JTextComponent textComponent) {
// キャレットの位置を取得して
int mark = textComponent.getCaret().getMark();
try {
// そこに適当な文字列を挿入する
textComponent.getDocument().insertString(
mark, "System.out.println(\"Hello world\");", null);
} catch (BadLocationException ex) {
Logger.getLogger(HelloCodeGenerator.class.getName()).log(Level.SEVERE, null, ex);
}
}
そして、Generatorを生成するためのファクトリクラスを作成する。
とりあえずHelloCodeGeneratorの内部クラスにする。
public class HelloCodeGenerator implements CodeGenerator {
// ファクトリクラス!
public static class Factory implements CodeGenerator.Factory {
// Iterableを返すらしいので、さくっとね
public Iterable<? extends CodeGenerator> create(CompilationController arg0, TreePath arg1) throws IOException {
return Collections.singleton(new HelloCodeGenerator());
}
}
public String getDisplayName() {
// 以下略
}
後は、ファクトリクラスを、layer.xmlのEditors/text/x-java/codegeneratorsに登録する。
<?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-insert-HelloCodeGenerator$Factory.instance" />
</folder>
</folder>
</folder>
</folder>
</filesystem>
これで完成!!
実行してみよう
F6を押して実行!テスト用NetBeansが立ち上がる。
適当にJavaのプロジェクトを作成してJavaのコードエディタ内でAlt + Insertをしてみると....
出た!!選択すると…
お~出た~。
こんな手軽にいけるなら、がんがん俺様フレームワークのスニペットみたいなのを作れるんじゃないだろうか。
単純に固定区を入れるものから、設定ファイルからコード生成するものとか…
夢は広がる。