我最近遇到了这个确切的问题,并通过在扩展 ViewPart 的类中实现 IPartListener2 然后在 createPartcontrol 方法中添加一个部分侦听器来解决它,如下所示:
getSite().getWorkbenchWindow().getPartService().addPartListener(this);
现在通过在您的 partOpened 方法中使用类似的东西(必须在您实际使用部分侦听器之前实现),您将获得最初可用的视图内容:
public void partOpened(IWorkbenchPartReference partRef) {
if(partRef.getPage().getActiveEditor() instanceof XtextEditor) {
somepart=partRef.getPage().getActiveEditor();
final XtextEditor editor = (XtextEditor)somepart;
final IXtextDocument document = editor.getDocument();
document.readOnly(new IUnitOfWork.Void<XtextResource>(){
public void process (XtextResource resource) throws Exception {
IParseResult parseResult = resource.getParseResult();
if(parseResult ==null)
return;
CompositeNode rootNode=(CompositeNode) parseResult.getRootNode();
LeafNode node = (LeafNode)NodeModelUtils.findLeafNodeAtOffset(rootNode, 0);
EObject object =NodeModelUtils.findActualSemanticObjectFor(node);
view.setInput(object);
}
});
}
}
这将使您正在实现的视图在您激活 XtextEditor(特定于您的 DSL)时获得它的内容。为了在您更改编辑器中活动文件中的任何内容时实时更改视图内容,您应该实现 IDocumentListener 并覆盖 DocumentChanged 方法。如果您这样做,您将不再依赖 SelectionListener,因为当您的文档发生更改时,视图应该会自动更新
希望这可以帮助!