当xtext的EMF模型使用适当的值更改时,如何获取通知

时间:2014-02-07 13:13:31

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

我们有一个包含四个页面的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中收到通知,只要当用户在源页面上进行某些更改(即XTextEditor)时EMF模型发生更改。

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

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

有人可以提供一些指示吗?

此致 AKHIL

1 个答案:

答案 0 :(得分:0)

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

他们实现了一个自己的验证服务,它可以完成您所描述的内容:

  

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

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

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