画像を表示する。(ImageRegistry)

プラグインと言えば、画像。アイコン。ウィザードのバナー。
画像を表示する事は非常に多い。
と言うかまぁ、Diiguみたいに、ビルド特化なツールでない限りはアイコン位使うでしょう。


と言う訳で、今日は、eclipseプラグインで画像を扱うにはどうするのか説明するます。


登場するクラスは、

大体この3つ。
ImageとImageDescriptorは、GCによって綺麗に後始末されないタイプのリソースなので、
扱いを間違えるとガリガリメモリリークするます。
どういう事が起こるかと言えば、まぁ、eclipseがアフォ程重くなる上に、
OutOfMemoryErrorで落ちるます。


そこで、画像をロードしてキャッシュする為の仕組みとして登場するのがImageRegistry。
こいつの中に画像を溜め込んでおけば、必要になった時に、テキトーに後始末してくれます。
ImageRegistryは、どっかにstaticメンバとして抱えるのがまぁ良いのですけど、
ImageRegistry自体のライフサイクルをキチンと管理するのは面倒なので、
他人の庭を勝手に借りるのが、僕は良いと思います。


んで、確信犯的に借りているのが、

  • org.eclipse.jface.resource.JFaceResources

こいつは、JFaceのAPI群に混じって存在しているので、それなりにイイ感じでライフサイクル管理されているます。
又、通常のプラグインならJFaceよりも先に画像リソースが必要にならない筈ですし、
JFaceがその役目を終えるよりも、後に画像リソースが必要になる事も無い筈です。
ちなみに、JFaceは、eclipseSWT上に構築されたGUIを扱う為のフレームワークです。
ついでに、eclipseでよく見かける様なプロジェクトやフォルダのアイコンは、
ちょっと違った所に格納されていて、org.eclipse.ui.IWorkbenchから参照をゲトできる
org.eclipse.ui.ISharedImagesに定義されているキーとメソッドを使って取り出す事が出来るます。
Doltengでは、その事を知らない時間が長かった為に、自前でロードしちゃったりシテマスガ…orz


ImageRegistryのAPIは、非常に簡単で、getとput、getDescriptor位しかありません。
MapみたいなAPIです。必要なタイミングでそれぞれをテキトーに呼ぶのがエエでしょう。
ちなみに、僕とid:y-komoriさん合作のラッピングAPIが、
org.seasar.eclipse.commonプラグインに含まれています。
今は、それぞれが作りこんだAPIが同じパッケージに入っています。
id:y-komoriさんが作りこんだ方はTiger限定ですが、より高機能です。
こやつらを使うと最早ImageRegistryのAPIすら知らなくても画像をメモリリーク無しに扱う事が出来るます。
準備会参加予定者は、是非コードを読んでおいてクダサイ。


本日のネタ元

どちらの記事も、eclipseのworkbench外でリソースを扱うとありますが、
eclipse workbench内で扱うとしても押えておかなければならない基本的な事項については
変わりませんので、熟読するのがヨロシイかと。