xtext で ContentAssist の実装

コンテンツアシストはエクリプスのエディタでは、コントロール+スペースで表示されるその場で入力するべき候補の事(だと福山は思ってます)

xtextで、作ったエディタも対応していて、uiプロジェクトの中にMyDSLProposalProvider.java みたいな形で用意されてます。
ここにメソッドとか追加すると、自分の好きな候補をコンテンツアシストとして追加で表示してくれる。

あと、テンプレートを用意しておくことも出来る。(この辺は、チュートリアルとかにもあったと思う。また後で書くかも)

今回は、それ以外のキーワードの表示について

DSLの構文で出てくるキーワードがデフォルトの実装ではコンテンツアシストとして出てきます。
これは、このままで、普通に使えるのだけど、問題はその並び順。
キーワードの文字列でソートされてるぽい…
DSLのグラマーに書いた順には表示されないので意味があって順番に並べてると少し微妙です。

ツクールのイベントコマンドのキーワードが100個ほどあるんだけど、イベントコマンド入力位置でアシストしたらばらばらに表示されてとても微妙でした。

で、これを自分の好きなように並べる方法について
(前置き長いな…汗)

ソート用のComparatorとかも実装できて、Injectできるしbindもできるのでこれかな~?って思ったけど、実際には、各コンテンツのプライオリティを設定できて、このプライオリティを元にソートするみたい。
プライオリティが同じだと、キーワード文字列でソート。

で、プライオリティは、その場で表示する場合に変更される事があるので単純にComparatorでのソートをしてしまうより、このプライオリティをちゃんと設定したほうがいいみたい。

具体的にはIContentProposalPrioritiesインタフェースを実装したクラスを、bind すればOK。

福山はいつもどおり、UIModuleに

public class EventDSLUiModule ...

public Class<? extends IContentProposalPriorities> bindIContentProposalPriorities() {
  return EventDSLContentProposalPriorities.class;
}

こんなのを追加

で、プライオリティをつけるクラスは、以下のような感じ

public class EventDSLContentProposalPriorities extends ContentProposalPriorities {
	
  public EventDSLContentProposalPriorities() {
    crossReferencePriority = 900;
    keywordPriority = 300;
    defaultPriority = 600;
  }
	
  @Override
  public void adjustKeywordPriority(ICompletionProposal proposal, String prefix) {
    adjustPriority(proposal, prefix, keywordPriority);
    if (proposal == null || !(proposal instanceof ConfigurableCompletionProposal))
      return;
    ConfigurableCompletionProposal castedProposal = (ConfigurableCompletionProposal) proposal;
    String keyword = proposal.getDisplayString();
    int p = castedProposal.getPriority() + EventDSLUtils.getPrioryty(keyword);
    castedProposal.setPriority(p);
  }
}

ContentProposalPriorities はもともと用意してある、デフォルトの実装で、アシスト時の並び順をプレフィックスとかを元に優先度をつけるようになってるので、それをそのまま利用してしてます。
コンストラクタで、設定している値は、ContentProposalPriorities にあるインスタンス変数で、基本になるプライオリティ。
キーワードだと300ってプライオリティなのだけど、ContentProposalPriorities だと、それ以上の adjust をしないので、キーワードは全部300って言うプライオリティになって、同じ優先度なので、最終的に文字列でソートされちゃう。
で、adjust した後に、改めてキーワード毎にプライオリティをずらすようにしました。

これがまだなかなか…キーワード文字列を書かなくちゃならないので、なかなか大変。う~ん。もう少しどうにかしたいけど、グラマーでキーワード変えたときとか、増えた時とか、またUtilsのキーワード一覧を修正しないとならないし、ちょっとびみょうかな~?とか思ったり思わなかったり。

ま、とりあえず、思うようにキーワードのソートは出来たのでOKとする。

カテゴリー: RPGMKDT, イベントエディタ タグ: パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です