2011年1月14日金曜日

プロジェクトのアイコンを変えるプラグインを作ってみる

2011年1回目で早速一発ネタです

NetBans のプロジェクトウィンドウに表示されるアイコンをプラグインで変える方法についての紹介です
なお、7.0 以降に実装予定の API を使用していますので、お試しされる際には 7.0 Beta などをご使用下さい
また、実装予定の機能ですので、正式なリリースでは実装されない可能性があります
ご注意下さい

まず、事前に必要なものはプロジェクトのアイコンと差し替える画像です
16 x 16 のサイズの画像をご用意してください
今回は 以前作成したねこび〜んアイコンの画像を使用します
(オリジナルのねこび〜んはカネウチカズコさんによるものです)

次にモジュール用のプロジェクトを作成します

プロジェクト名などは適当な値を設定してください
プロジェクト作成後、事前に準備した画像ファイルを適当な場所にコピーします
(今回の例では、"resources" ディレクトリを作成し、その中にコピーしています)

次は今回のプラグイン(モジュール)に必要な API の設定を行います
プロジェクトのプロパティ画面の「ライブラリ」カテゴリを選択し、「ライブラリの依存関係」タブの「追加」ボタンをクリックし、"Lookup API"、"プロジェクト API"、"ユーティリティ API"の3つのAPIを追加します
追加後は下記のように表示されます

「了解」ボタンをクリックして、プロパティ画面を閉じます
最後にアイコンの差し替えに必要なクラスを作成します
(といっても、1クラスのみですが…)

クラスの中身は下記の通りです
(パッケージやクラス名は適当ですので、適宜読み替えてください)

package nekobean;

import java.awt.Image;
import javax.swing.event.ChangeListener;
import org.netbeans.api.project.Project;
import org.netbeans.spi.project.ProjectIconAnnotator;
import org.openide.util.ImageUtilities;
import org.openide.util.lookup.ServiceProvider;

@ServiceProvider(service = ProjectIconAnnotator.class)
public class NekoBeanProjectIcon implements ProjectIconAnnotator {

    // アイコンの読み込み
    private final Image nekoBeanIcon = ImageUtilities.loadImage("nekobean/resources/nekobean.png");

    @Override
    public Image annotateIcon(Project project, Image original, boolean bln) {
        // 読み込んだアイコンを返します
        return nekoBeanIcon;
    }

    @Override
    public void addChangeListener(ChangeListener cl) {
    }

    @Override
    public void removeChangeListener(ChangeListener cl) {
    }
}

今回使う API は ProjectIconAnnotator インターフェイスです
インターフェイス名からわかる通り、プロジェクトのアイコンに注釈(エラーマークなどのバッジ)を表示するための API ですので、今回のような使い方はいわば邪道だったりします
なお、 6.9.1 以前のバージョンではこの API が存在しないため、プロジェクトツリーが表示される前にアイコンを変更することは無理っぽいです
(詳しくは、 LogicalViewProvider を実装した各プロジェクトタイプのクラスなんかを見るとわかるかと思います)

最終的に、プロジェクトは以下のような構成になります

このプラグインを実行すると、以下のように表示されます

ということで、プロジェクトのアイコンを変えるプラグインについては以上です
今年は、昨年よりはもう少しエントリの数が増えるよう頑張りたいと思いますので、何卒よろしくお願いします