【发布时间】: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