【问题标题】:How to use EMF commands within editor actions?如何在编辑器操作中使用 EMF 命令?
【发布时间】:2012-03-25 00:01:25
【问题描述】:

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

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

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

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


在 EMF 文档中,我发现了这段代码 sn-p:

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

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

所以这些是我的问题:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    请注意,仅当您的编辑器基于大部分未修改的生成代码时才适用。如果您自己管理EditingDomains,您应该使用自己的方法。

    【讨论】:

      【解决方案2】:

      如果您还没有 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;
          }
      });
      

      【讨论】:

      • 使用基于 emf 的编辑器,编辑域通常已经在运行。它用于所有自动生成的标准命令,例如删除对象。创建一个新的编辑域只会增加混乱。
      猜你喜欢
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-09
      • 2017-01-05
      • 2012-08-15
      • 2022-09-23
      • 2015-08-15
      相关资源
      最近更新 更多