Узлы группы контуров - PullRequest
       20

Узлы группы контуров

4 голосов
/ 03 августа 2011

Я разрабатываю плагин 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 Ответ

2 голосов
/ 13 апреля 2012

Есть несколько проблем с вашим кодом:

this.myContainerNode: нет гарантии, что ваш провайдер является прототипом;кто-то может настроить экземпляр как синглтон.Поэтому избегайте полей экземпляра.

Существует два решения этой проблемы:

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