Есть несколько проблем с вашим кодом:
this.myContainerNode
: нет гарантии, что ваш провайдер является прототипом;кто-то может настроить экземпляр как синглтон.Поэтому избегайте полей экземпляра.
Существует два решения этой проблемы:
- Поиск родительского узла для вашего контейнерного узла всякий раз, когда вам это нужно (медленно, но просто)
- Добавить кэш в ваш экземпляр (см. Как мне прикрепить кешированную информацию к редактору или ресурсу 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 );
}