我正在开发一个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用于什么吗?
非常感谢
最佳答案 您的代码存在一些问题:
this.myContainerNode:无法保证您的提供者是原型;有人可以将实例配置为单例.因此,请避免实例字段.
这个问题有两种解决方案:
>在需要时搜索父节点以查找容器节点(缓慢但简单)
>为您的实例添加缓存(请参阅How do I attach some cached information to an Eclipse editor or resource?)
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 );
}