Xtextのネイチャーのメモ。
|
|
Xtextで生成されたエディターを起動すると、初回に「Do you want to add the Xtext nature to the project 'プロジェクト名'?」というダイアログが表示される。
ここでYesを選択しないと、Xtextの一部の機能(「Open Model Element」ダイアログとか)が使えないし、別のファイルのエディターを開いたときに再び同じダイアログが表示される。
このダイアログは、エディターを使おうとしているファイルのプロジェクトに「Xtextネイチャー」を追加するかどうかを確認するもの。
ネイチャーはEclipseの仕組みのひとつであり、例えばJavaの開発を行う場合はJDTのJavaNatureが使われている。
Xtextを使う場合は、ユーザーに対してXtextネイチャーを使うかどうかを明示的に確認する、という方針らしい。
プロジェクトにXtextネイチャーを追加すると、.projectファイルにXtextネイチャーの指定が加わる。
<?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>プロジェクト名</name> 〜 <natures> <nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.xtext.ui.shared.xtextNature</nature> </natures> </projectDescription>
Mavenを使ってプロジェクトを作っている場合、「mvn
eclipse:eclipse
」コマンドを実行すると、.projectファイルが作り直される。
その為、以前にXtextネイチャーを登録していてもネイチャーの情報が消えてしまい、再度Xtextネイチャーを登録するかどうか確認するダイアログが表示されることになる。
pom.xmlのmaven-eclipse-pluginにネイチャーを追加しておけば 生成される.projectファイル内にそのネイチャーが追加されるので、確認ダイアログが出なくなる。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>${plugin.eclipse.version}</version> <configuration> <additionalProjectnatures> <projectnature>org.eclipse.xtext.ui.shared.xtextNature</projectnature> </additionalProjectnatures> <downloadSources>true</downloadSources> <downloadJavadocs>false</downloadJavadocs> 〜 </configuration> </plugin>
Gradleを使ってプロジェクトを作っている場合、build.gradleにEclipseプラグインを導入して「gradle cleanEclipse eclipse
」コマンドを実行すると、.projectファイルが作り直される。[2014-04-25]
その為、以前にXtextネイチャーを登録していてもネイチャーの情報が消えてしまい、再度Xtextネイチャーを登録するかどうか確認するダイアログが表示されることになる。
build.gradleのeclipse.projectにネイチャーを追加しておけば 生成される.projectファイル内にそのネイチャーが追加されるので、確認ダイアログが出なくなる。
apply plugin: 'eclipse'
eclipse {
project {
natures 'org.eclipse.xtext.ui.shared.xtextNature'
}
}
Xtextでエディターを作っても、そのエディターを使うだけのユーザーにはXtextとか関係ないので、Xtextネイチャーを追加するダイアログは不可解だろう。
このダイアログはNatureAddingEditorCallbackというクラスで出している。
したがって、このダイアログを出さないようにするには、NatureAddingEditorCallbackに代わるクラスを用意してやればよい。
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.xtext.builder.nature.NatureAddingEditorCallback; import org.eclipse.xtext.builder.nature.ToggleXtextNatureAction; import org.eclipse.xtext.ui.editor.XtextEditor; import com.google.inject.Inject;
@SuppressWarnings("restriction") public class MyEditorCallback extends NatureAddingEditorCallback {
@Inject private ToggleXtextNatureAction toggleNature;
@Override public void afterCreatePartControl(XtextEditor editor) { IResource resource = editor.getResource(); if (resource != null) { IProject project = resource.getProject(); if (!hasNature(project) && project.isAccessible() && !project.isHidden()) { addNature(project); } } super.afterCreatePartControl(editor); }
private boolean hasNature(IProject project) { return toggleNature.hasNature(project); } private void addNature(IProject project) { toggleNature.toggleNature(project); } }
NatureAddingEditorCallbackは(Eclipseプラグインの機構によって)外部に公開されていないので、restrictionの警告が出る。[2014-10-18]
(Xtext2.4ではNatureAddingEditorCallbackの親クラスであるAbstractDirtyStateAwareEditorCallbackを継承する方法でもよかったが、Xtext2.7で非推奨になって挙動がおかしくなったので、AbstractDirtyStateAwareEditorCallbackは使わない方が良い)
作成したCallbackクラスをUiModuleで指定する。
public class MyUiModule extends com.example.ui.AbstractMyUiModule { 〜
@Override public Class<? extends org.eclipse.xtext.ui.editor.IXtextEditorCallback> bindIXtextEditorCallback() { return MyEditorCallback.class; } }