【问题标题】:How to get notifications when xtext's EMF model changes with proper values当 xtext 的 EMF 模型以适当的值更改时如何获取通知
【发布时间】:2014-03-04 22:08:25
【问题描述】:

我们有一个包含四个页面的 FormEditor:三个 FormPages,第四个页面是 XTextEditor 作为源页面。

每当用户在 FormPages 上进行任何更改(例如更改文本框中的值)时,我们都会更改 XTextDocument.modify() 方法中的 EMF 模型内容,如下所示:

    xtextEditor.getDocument().modify(new IUnitOfWork.Void<XtextResource>() {

        @Override
        public void process(XtextResource state) throws Exception {
            IParseResult parseResult = state.getParseResult();
            Assert.isNotNull(parseResult);
            EObject rootASTElement = parseResult.getRootASTElement();

            if (rootASTElement instanceof MyModel) {
               XyzType t = ((MyModel) rootASTElement).getXyzType();
                t.setName(name);   <- ‘name’ is the new value entered on FormPage text box
            }
        }
    });

现在,我们希望在 FormPages 中获得通知,只要 EMF 模型在用户对源页面(即 XTextEditor)进行一些更改时发生更改。

我们尝试将 IXtextModelListener 和 IXtextDocumentContentObserver 添加到 IXtextDocument;但是对于在 XTextEditor 中输入的每个字符都会调用这些。

我们的要求是仅在 EMF 模型中的值发生更改时才收到通知(而不是文本格式,例如插入/删除空格时)。

有人可以指点一下吗?

问候, 阿基尔

【问题讨论】:

  • 您是否也尝试在 org.eclipse.emf.common.notify.Notifier 的基础上进行构建?
  • @SpaceTrucker:感谢您的快速回复!我没有使用这种方法。能详细介绍一下吗?
  • 我自己没有使用过那个 API,但是由于每个 EObject 都实现了它,我认为建议它是一个好主意。您必须为模型中的每个对象注册相同的 org.eclipse.emf.common.notify.Adapter。当您的模型更改时,此适配器将收到通知。但为了让它工作,xtext 编辑器不能每次都创建一个新模型,而必须修改现有模型。
  • 您找到问题的解决方案了吗?
  • 因为 xtext 确实重新创建了 emf 模型,所以听众不会提供帮助。您必须始终保留模型的副本,并始终将副本与模型的当前状态进行比较,以了解是否确实发生了变化

标签: java eclipse-plugin xtext eclipse-emf emf


【解决方案1】:

您可以使用 EMF 客户端平台 (ECP),它添加了 Observer Bus to an EMF model 的实现。

他们实现了自己的验证服务,可以按照您的描述进行:

ecp.view.validation 这是验证服务,它监控领域模型和 计算验证错误。

验证服务已经使用 ECP 的观察者总线注册到 EMF 更改事件。 Observer Bus 本身被实现为一个 EContentAdapter,监听模型的每一个变化。它已经过滤了更改事件,并按照观察者总线模式将它们提供给您可以注册的事件总线。在那里,您只能获得您注册的事件,而不是所有您必须自己过滤的 EContentAdapter 事件。

我认为他们主要使用它来验证模型以在其 EMF 表单 GUI 中显示结果。但是,您也可以单独使用这些服务。

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多