EMF Редактирование Создание Команды Домена - PullRequest
0 голосов
/ 10 февраля 2012

Я сейчас погружаюсь в EMF и столкнулся со следующей проблемой:

Я пытаюсь удалить поля из набора полей с помощью следующего кода:

 FieldElem ff = ds.getContent().getNestedFieldset().get(0).getField().get(0);

            Command remove = new RemoveCommand(editingDomain, nf, 
                           DescPackage.eINSTANCE.getNestedFieldsetElem_Field(), ff);
            editingDomain.getCommandStack().execute(remove);

            ff = ds.getContent().getNestedFieldset().get(0).getField().get(0);

            Command remove2 = RemoveCommand.create(editingDomain, nf, 
                    DescPackage.eINSTANCE.getNestedFieldsetElem_Field(), ff);
            editingDomain.getCommandStack().execute(remove2);

            ff = ds.getContent().getNestedFieldset().get(0).getField().get(0);

            Command remove3 = RemoveCommand.create(editingDomain, ff);
            editingDomain.getCommandStack().execute(remove3);

Первые две команды работают нормально, а третья - нет. Я даже не добавляю в стек команд и ничего не удаляю. Что я делаю не так?

ОБНОВЛЕНИЕ: Как я видел в отладчике, метод execute возвращает UNEXECUTABLE_COMMAND.

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Инструкция RemoveCommand.create(editingDomain, ff) может использоваться, только если ff в качестве контейнера (то есть ff.eContainer != null).eContainer устанавливается EMF автоматически при добавлении объекта в отношение со свойством сдерживания.

Команда remove3 определенно не работает, поскольку отношение getField() не является отношением включения.

0 голосов
/ 12 февраля 2012

Наконец я нашел ответ:

Поскольку я использовал XSD в качестве источника, модель была сгенерирована из этого фрагмента:

<xsd:sequence>
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="field" type="fieldElem" />
            <xsd:element name="autofill-field" type="fieldElem" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="fieldset" type="fieldsetElem" />
            <xsd:element name="join-field" type="joinFieldElem"/>
        </xsd:choice>
    </xsd:sequence>

Таким образом, FieldsetElem не содержит FieldElem напрямую, а FieldElem извлекается из соответствующей записи FutureMap. Итак, правильный код:

Command remove = RemoveCommand.create(ed,  ed.getWrapper(fe));
...