如何在编辑器操作中使用EMF命令?

时间:2012-03-07 12:48:18

标签: java eclipse-emf eclipse-emf-ecore

摘要
我正在研究一个基于emf的编辑器。到目前为止,我没有使用EMF命令,但现在我想重构我的代码以使用它们。

当前状态
我使用树查看器作为编辑器的主要部分。我通过org.eclipse.ui.popupMenus扩展点添加了所有类型的操作。这些操作直接干扰模型,添加和删除对象。

问题
使用这种方法,我必须在删除模型中容易引入错误的对象时手动删除每个引用。此外,编辑器中的撤消/重做操作也不起作用。

目标
重构动作,以便它们正确使用EMF命令来修改模型。


在EMF文档中,我找到了这段代码:

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

...看起来像我必须使用的代码。但我不知道从哪里可以获得EditingDomain

所以这些是我的问题:

  • 这是我想在我的Action s中使用的方法吗?
  • 我从哪里可以获得EditingDomain

2 个答案:

答案 0 :(得分:2)

有一种简单的方法可以访问当前的编辑域。只需将此代码添加到Action类。

private EditingDomain domain;

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

将自动从Eclipse框架调用方法setActivePart。使用此技术,您应始终可以访问编辑域。

请注意,仅当您的编辑器基于大多数未触及的生成代码时才会出现这种情况。如果你自己管理EditingDomains,你应该使用自己的方法。

答案 1 :(得分:0)

如果您还没有EditingDomain,可以创建一个。但是,创建一个globaly并保留它是有意义的。例如在单身内部。 下面是一个使用AbstractCommand删除附加到TreeItem的EObject的最小示例。

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;
    }
});