我实现了一个视图,该视图将自己注册为列表器,以更改XText编辑器和相关大纲。为此,我要添加此行

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


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

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

最佳答案

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

希望这可以帮助!

10-07 12:19