EMFオブジェクトのアイコンを装飾する

EMFモデルから生成したEditコードには、EMFモデルのインスタンスをEditor上に表示するためのLabelProviderとContentProviderを兼ねるItemProviderが含まれます。このItemProviderを修正することにより、アイコンを装飾することができます。

例として、以下のような簡単な図書館モデルlib.ecoreを考えます。

この例では、Bookクラスのオブジェクトについて属性titleに値が設定されていない場合に、アイコンの装飾として以下のように警告マークをアイコンに追加することにします。

まず、このEMFモデルを基にModelコード、Editコード、Editorコードを生成します。これにより、例えば
example.library、example.library.edit、example.library.editorプロジェクトが生成されたとします。

example.library.editプロジェクト内に格納されたBookItemProviderクラスのgetImage()メソッドをComposedImageクラスを用いて以下のように修正します。

@Override
public Object getImage(Object object) {
	Object image = overlayImage(object, getResourceLocator().getImage("full/obj16/Book"));
	String title = ((Book)object).getTitle();
	if (title == null || title.equals("")) {
		List<Object> images = new ArrayList<Object>(2);
		images.add(image);
		
		Object ovrImage = getResourceLocator().getImage("full/ovr16/warning_co");
		images.add(ovrImage);
		
		image = new ComposedImage(images) {
			@Override
			public List<Point> getDrawPoints(Size size) {
				List<Point> result = super.getDrawPoints(size);
				// Set the location of Warning image to bottom left.
				//
				((Point)result.get(1)).y = 8;					
				return result;
			}
		};
	}
	return image;
}

上記のコードにおいて、以下の条件文でアイコンを装飾するか否かを判断しています。

if (title == null || title.equals("")) {

再び上記サンプルコードに戻ると、アイコンを装飾する場合には、

  1. リストimagesに装飾されるアイコンと装飾するアイコンをこの順番にadd
  2. リストimagesを引数に渡してComposedImageクラスのオブジェクトを生成
  3. ComposedImageクラスのgetDrawPoints()をオーバライドし、imagesに対し2番目にaddした装飾するアイコンの配置を調整

します。装飾するアイコンの配置はx座標およびy座標を指定します。

装飾されるアイコンのサイズは16x16、装飾するアイコンのサイズは8x8。座標は左上が(0,0)となります。従って、装飾するアイコンを左下に配置するためにはx=0、y=8に設定します。サイズが8x8の装飾するアイコンの配置場所に対するx座標、y座標の組み合わせは以下のようになります。

  • 左上:(x,y)=(0,0)
  • 左下:(x,y)=(0,8)
  • 右上:(x,y)=(8,0)
  • 右下:(x,y)=(8,8)

以上で、EMFオブジェクトのアイコンが装飾されます。EMFが生成するエディタでは、属性titleに何らかの文字が設定されると、EditingDomain内のコマンドスタックにSetCommandが追加され、コマンドスタックの変更を監視するリスナに同変更が通知されツリービューがrefreshされます。その結果、装飾していた警告マークが消滅します。同様に、属性titleに設定されていた文字を消去すると、再び警告マークが表示されます。