ポップアップメニューのアイコンをカスタマイズする

前回は、以下のようにポップアップメニューのテキストをカスタマイズする方法を紹介しました。

今回は、ポップアップメニューに表示されるアイコンをカスタマイズする方法を紹介します。アイコンをカスタマイズする方法は、"GMF Best Practices Slides"にも紹介されていますが、ここではそれと少し違う方法を紹介します。

前回、テキストをカスタマイズするために、拡張ポイント「org.eclipse.gmf.runtime.emf.type.core.elementTypes」に登録されているElementTypeの"name"属性を変更しました。よく見ると、ElementTypeには"icon"属性もあります。

そこで、この"icon"属性にGIFファイルパスを指定してやっても、ポップアップメニューに表示されるアイコンは変更されません。実際、私が調べた限り、ElementTypeの"icon"属性は、現状のGMFではまったく使用されていません。

GMFでは、ポップアップメニューに表示するアイコンはXXIconProviderクラスが提供します。そこで自動生成されたソースコードを見ると以下のように、XXElementTypeRegistry.getImage()を返しています。

/**
 * @generated
 */
public class PoIconProvider extends AbstractProvider implements IIconProvider {

	/**
	 * @generated
	 */
	public Image getIcon(IAdaptable hint, int flags) {
		return PoElementTypes.getImage(hint);
	}

	/**
	 * @generated
	 */
	public boolean provides(IOperation operation) {
		if (operation instanceof GetIconOperation) {
			return ((GetIconOperation) operation).execute(this) != null;
		}
		return false;
	}
}

XXIconProvider.getIcon()を直接変更してもよいですが、ここでは、拡張ポイント「org.eclipse.gmf.runtime.emf.type.core.elementTypes」のElementTypeのicon属性にファイルパスが指定されている場合には、そのアイコンイメージを返すように、XXElementTypes.getImage()を変更します。

/**
 * @generated NOT
 */
public static Image getImage(IAdaptable hint) {
	Image image = getElementTypeImage(hint);
	if (image != null) {
		return image;
	}
	
	ENamedElement element = getElement(hint);
	if (element == null) {
		return null;
	}
	return getImage(element);
}

private static Image getElementTypeImage(IAdaptable hint) {
	IElementType elementType = (IElementType) hint
		.getAdapter(IElementType.class);
	if (elementType != null && elementType.getIconURL() != null) {
		return PoDiagramEditorPlugin.getInstance().getBundledImage(
				elementType.getIconURL().getPath());
	}
	return null;
}

上記のように修正することにより、拡張ポイント「org.eclipse.gmf.runtime.emf.type.core.elementTypes」に登録されているElementTypeのicon属性にファイルパスを指定すると、以下のように指定したアイコンがポップアップメニューに使用されるようになります。

なお、ElementTypeのicon属性を変更したということはplugin.xmlを変更したことになります。id:kojihashi:20071009で紹介したように、plugin.xmlはGMFの再生成の対象となりますので、以下のように再生成の際に上書きされるのを防止することをお忘れなく。

<?gmfgen generated="false">