摘要
我正在研究一个基于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
?答案 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;
}
});