首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分组大纲节点

分组大纲节点
EN

Stack Overflow用户
提问于 2011-08-03 23:58:19
回答 1查看 517关注 0票数 4

我正在开发一个XTEXT2.0插件。我想将大纲中的一些节点分组到一个“虚拟”节点中。哪种方法才是实现这一结果的正确方法?

目前,如果我想对"A“类型的节点进行分组,那么在我的OutlineTreeProvider中,我定义了以下方法

代码语言:javascript
复制
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);
}

阅读XText2.0文档时,我还看到有一个EStructuralFeatureNode。我不太了解这种类型的节点是什么以及如何使用它。你能解释一下EStructuralFeatureNode是用来做什么的吗?

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-13 21:09:24

你的代码有几个问题:

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

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

  1. 在需要时搜索父节点中的容器节点(速度较慢但很简单)
  2. 将缓存添加到实例(请参见

super._createNode():不要用_调用方法,总是调用普通版本(super.createNode())。该方法将确定为您调用哪个重载的_create*方法。但是在你的例子中,你不能调用这些方法中的任何一个,因为你会得到一个循环。改为调用createEObjectNode()

最后,您不需要创建A (S3DFactoryImpl.eINSTANCE.createA())的实例。节点可以由模型元素支持,但这是可选的。

对于分组,我使用这个类:

代码语言:javascript
复制
public class VirtualOutlineNode extends AbstractOutlineNode {
    protected VirtualOutlineNode( IOutlineNode parent, Image image, Object text, boolean isLeaf ) {
        super( parent, image, text, isLeaf );
    }
}

在您的示例中,代码将如下所示:

代码语言:javascript
复制
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 );
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6929456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档