组轮廓节点

时间:2011-08-03 15:58:19

标签: eclipse eclipse-plugin eclipse-rcp xtext

我正在开发一个XTEXT 2.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的用途吗?

非常感谢

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题:

this.myContainerNode:无法保证您的提供商是原型;有人可以将实例配置为单例。因此,请避免使用实例字段。

这个问题有两种解决方案:

  1. 在您需要时(缓慢但简单)在父节点中搜索容器节点
  2. 向您的实例添加缓存(请参阅How do I attach some cached information to an Eclipse editor or resource?
  3. 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 );
    }