Eclipse(XText)SelectionListener注册

时间:2013-05-31 13:40:51

标签: java eclipse xtext

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

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

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

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

1 个答案:

答案 0 :(得分: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,因为当文档中的某些内容发生更改时,视图应自动更新

希望这有帮助!