Xtextのラベルのメモ。
|
Xtextで生成されたエディターでは、アウトラインやツールチップ等で表示される名前(ラベル)やアイコンはLabelProviderを経由して取得している。
ラベルは、デフォルトでは構文ルールのname変数の値となる。
また、リンクを張っているオブジェクトを検索した際に出るツリーにはDescriptionLabelProviderから取得されたラベルが使われている。
デフォルトでは「名前 - ルールクラス名」という表示になる。
LabelProviderやDescriptionLabelProviderの雛形クラスは自動生成されているので、それらをカスタマイズすることが出来る。
Xtext 2.4.2では、ソース整形クラスとして生成されるファイルはXtend用である。[2015-04-28]
個人的には新しい言語を覚えるよりJavaの方が分かり易いので、Javaで実装したい。
XtendはJavaに似ているので、Javaに変換するのも難しくない。
元のxtendファイルは、ファイル自体は削除せずに、中身を空にしておく。
中身が残っていると同じクラスがJavaとXtendの両方で定義されることになり、コンパイルエラーになる。
xtendファイル自体を消してしまうと、次にxtextファイルをビルドしたときにまた生成されてしまうので、ファイル自体は残しておく必要がある。
package com.example.ui.labeling;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider; import com.google.inject.Inject;
/** * Provides labels for a EObjects. * * see http://www.eclipse.org/Xtext/documentation.html#labelProvider */ public class ExampleLabelProvider extends DefaultEObjectLabelProvider { @Inject public ExampleLabelProvider(AdapterFactoryLabelProvider delegate) { super(delegate); } }
ラベルを定義するには、textメソッドを実装する。[2015-04-28]
引数はルールのクラス。
import com.example.QualifiedName; import org.eclipse.emf.common.util.EList;
public class ExampleLabelProvider extends DefaultEObjectLabelProvider { 〜
protected String text(QualifiedName element) { StringBuilder sb = new StringBuilder(); EList<String> list = element.getName(); for (String s : list) { if (sb.length() != 0) { sb.append('.'); } sb.append(s); } return sb.toString(); } }
イメージ(アイコン)を定義するには、imageメソッドを実装する。[2015-04-28]
引数はルールのクラス。
import jp.hishidama.xtext.dmdl_editor.dmdl.Attribute; import org.eclipse.swt.graphics.Image;
public class DMDLLabelProvider extends DefaultEObjectLabelProvider { 〜
protected Image image(Attribute element) { return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_ANNOTATION); } }
Imageを返す他に、ファイル名を返すことも出来る。
この場合、プロジェクト直下のiconsディレクトリーにあるファイルが読み込まれる。
protected String image(Model element) { return "hoge.gif"; }