2011-08-03 14 views
3

私はXTEXT 2.0プラグインを開発しています。私は "仮想"ノードで私のアウトラインの中にいくつかのノードをグループ化したいと思います。この結果を達成する正しい方法はどれですか?グループ概要ノード

現在、私はタイプ「A」のグループノードにしたい場合は、私のOutlineTreeProviderに、私は次のような方法

私はEStructuralFeatureNodeがあることも見たのXtext 2.0のドキュメントを読む
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); 
} 

を定義します。私はこのタイプのノードが何であるか、それをどう使うかを正確に理解できませんでした。あなたはEStructuralFeatureNodeが何のために使われているのか説明できますか?

感謝

答えて

2

あなたのコードで問題がいくつかあります:

this.myContainerNode:あなたのプロバイダが原型であるという保証はありません。誰かがインスタンスをシングルトンとして設定できます。したがって、インスタンスフィールドは使用しないでください。

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

  1. あなたは
  2. があなたのインスタンスにキャッシュを追加して(遅いが、単純な)を必要とするたびに、コンテナノードの親ノードを検索
  3. How do I attach some cached information to an Eclipse editor or resource?を参照してください)

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

最後に、AS3DFactoryImpl.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); 
}