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";
}