1

我已经实现了一个视图,它将自己注册为 XText 编辑器和相关大纲中更改的列表器。为此,我添加了这一行

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().addSelectionListener(this);

在视图的 createPartControl 方法中(实现 ISelectionListener 接口)。因此,在 selectionChanged 方法中,我检查选择是否是 ITextSelection(它来自 XTextEditor)或 IStructuredSelection(它来自 Outline)的情况。

问题是,这样做时,当我启动 Eclipse 时,大纲被称为“不可用”。如果我单击它刷新的大纲,则会显示内容并正确更新收听视图。我做错了什么,我应该怎么做才能避免大纲最初的“不可用”?

4

1 回答 1

1

我最近遇到了这个确切的问题,并通过在扩展 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,因为当您的文档发生更改时,视图应该会自动更新

希望这可以帮助!

于 2015-08-28T10:45:52.740 回答