我已经实现了一个视图,该视图将自己注册为XText编辑器和相关大纲中的更改的列表器。为此我要添加这一行
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().addSelectionListener(this);
在视图的createPartControl方法中(实现ISelectionListener接口)。因此,在selectionChanged方法中,我检查选择是否是ITextSelection,它是来自XTextEditor的情况,还是IStructuredSelection,它是来自Outline的情况。
问题在于,这样做,当我启动Eclipse时,大纲被称为“不可用”。如果我点击轮廓它会刷新,将显示内容并正确更新监听视图。 我做错了什么,我该怎么做才能避免大纲的最初“不可用”?
答案 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,因为当文档中的某些内容发生更改时,视图应自动更新
希望这有帮助!