4

XTEXT2.0プラグインを開発しています。アウトライン内のいくつかのノードを「仮想」ノードにグループ化したいと思います。この結果を達成するための正しい方法はどれですか?

現在、タイプ「A」のノードをグループ化する場合、OutlineTreeProviderで次のメソッドを定義します

protected void _createNode(IOutlineNode parentNode, A node) {
 if(this.myContainerNode == null){
  A container = S3DFactoryImpl.eINSTANCE.createA();
  super._createNode(parentNode, container);
  List<IOutlineNode> children = parentNode.getChildren();
  this.myContainerNode = children.get(children.size()-1);
 }
 super._createNode(this.myContainerNode, node);
}

Xtext 2.0のドキュメントを読むと、EStructuralFeatureNodeがあることもわかりました。このタイプのノードが何であるか、そしてそれをどのように使用するかを正確に理解していませんでした。EStructuralFeatureNodeが何に使用されているのか説明できますか?

どうもありがとう

4

1 に答える 1

2

コードにはいくつかの問題があります。

this.myContainerNode:プロバイダーがプロトタイプであるという保証はありません。誰かがインスタンスをシングルトンとして構成する可能性があります。したがって、インスタンスフィールドは避けてください。

この問題には2つの解決策があります。

  1. 必要なときにいつでも親ノードでコンテナノードを検索します(低速ですが単純です)
  2. インスタンスにキャッシュを追加します(キャッシュされた情報をEclipseエディターまたはリソースにアタッチするにはどうすればよいですか?

super._createNode():でメソッドを呼び出さないでください。_常にプレーンバージョン(super.createNode())を呼び出してください。そのメソッドは、どのオーバーロードされた_create*メソッドを呼び出すかを判断します。ただし、あなたの場合、ループが発生するため、これらのメソッドを呼び出すことはできません。createEObjectNode()代わりに電話してください。

A最後に、 ( )のインスタンスを作成する必要はありませんS3DFactoryImpl.eINSTANCE.createA()。ノードはモデル要素によってサポートできますが、それはオプションです。

グループ化には、次のクラスを使用します。

public class VirtualOutlineNode extends AbstractOutlineNode {
    protected VirtualOutlineNode( IOutlineNode parent, Image image, Object text, boolean isLeaf ) {
        super( parent, image, text, isLeaf );
    }
}

あなたの場合、コードは次のようになります。

protected void _createNode(IOutlineNode parentNode, A node) {
    VirtualOutlineNode group = findExistingNode();
    if( null == group ) {
        group = new VirtualOutlineNode( parentNode, null, "Group A", false );
    }
    // calling super._createNode() or super.createNode() would create a loop
    createEObjectNode( group, node );
}
于 2012-04-13T13:09:24.100 に答える