Как использовать команды EMF в действиях редактора? - PullRequest
1 голос
/ 07 марта 2012

Резюме
Я работаю над редактором на основе EMF. До сих пор я не использовал команды EMF, но теперь я хочу реорганизовать свой код для их использования.

Текущее состояние
Я использую дерево просмотра в качестве основной части моего редактора. Я добавил все виды действий через точку расширения org.eclipse.ui.popupMenus. Эти действия напрямую влияют на модель, добавляя и удаляя объекты.

Проблемы
При таком подходе мне приходится вручную удалять все ссылки при удалении объектов в модели, что легко приводит к ошибкам. Кроме того, действия отмены / возврата в редакторе не работают.

Цель
Измените действия, чтобы они правильно использовали команды EMF для изменения модели.


В документации EMF я нашел этот фрагмент кода:

  Department d = ...
  EditingDomain ed = ...
  Command cmd = RemoveCommand.create(ed, d);
  ed.getCommandStack().execute(cmd);

... это похоже на код, который я должен использовать. Но я не знаю, откуда мне взять EditingDomain.

Так вот мои вопросы:

  • Это подход, который я хочу использовать в моих Action с?
  • Где взять EditingDomain?

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Существует простой способ получить доступ к текущему домену редактирования.Просто добавьте этот код в класс Action.

private EditingDomain domain;

public void setActivePart(IAction action, IWorkbenchPart workbenchPart) {
    if (workbenchPart instanceof IEditingDomainProvider) {
        domain = ((IEditingDomainProvider) workbenchPart).getEditingDomain();
    }
}

Метод setActivePart будет автоматически вызываться из среды Eclipse.С этой техникой у вас всегда должен быть доступ к домену редактирования.

Обратите внимание, что это верно только в том случае, если ваш редактор основан на основном нетронутом сгенерированном коде.Если вы управляете EditingDomains самостоятельно, вы должны использовать свои собственные методы.

0 голосов
/ 18 марта 2012

Если у вас еще нет EditingDomain, вы можете его создать. Однако имеет смысл создать одну глобализацию и сохранить ее. Например, внутри синглтона. Ниже вы найдете минимальный пример удаления объекта EObject, прикрепленного к TreeItem, с помощью AbstractCommand.

AdapterFactoryEditingDomain domain = new AdapterFactoryEditingDomain(new ComposedAdapterFactory(
        ComposedAdapterFactory.Descriptor.Registry.INSTANCE), new BasicCommandStack());

domain.getCommandStack().execute(new AbstractCommand() {
    @Override
    public void redo() {
        // TODO Auto-generated method stub
    }

    @Override
    public void execute() {
        EcoreUtil.delete((EObject) treeItem.getData(), true);
    }

    @Override
    public boolean canExecute() {
        return true;
    }
});
...