2012-03-07 32 views
1

摘要
我正在使用基于emf的编辑器。到目前为止,我没有使用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

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

private EditingDomain domain; 

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

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

请注意,这只有在您的编辑器基本上基于未触及的生成代码时才是正确的。如果您自己管理EditingDomains,则应使用自己的方法。

0

如果您还没有EditingDomain,可以创建一个。但是,创建一个全局并保留它是有意义的。例如在一个单身人士内。 下面你会发现一个使用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; 
    } 
}); 
+0

使用基于emf的编辑器时,编辑域通常已经在使用。它用于所有自动生成的标准命令,如删除对象。制作一个新的编辑域只会增加混淆。 – Peter 2012-03-22 16:11:36

相关问题