Eclipse RCP - 如何从编辑器中聆听选择

Kri*_*ris 3 eclipse-rcp

我创建了一个简单的Eclipse RCP应用程序,我可以根据用户操作打开多个编辑器实例.我有一个单独的视图(ViewPart),我在那里听取编辑器上的选择更改.问题是视图仅通知上次打开的编辑器中的选择,之前打开的其他编辑器不再提供事件/或者视图只能侦听最后打开的编辑器而没有其他内容.即使先前打开的编辑获得关注,也会发生这种情况.

换句话说,只有编辑器区域中的最新编辑器提供选择事件,我想要的是,当我单击其他编辑器的选项卡时,我想在单击以前打开的编辑器之一时查看视图上的更改.

在我看来,我使用:

IWorkbench workbench = PlatformUI.getWorkbench();
        workbench.getActiveWorkbenchWindow().getActivePage().addSelectionListener(DocumentsEditor.ID,(ISelectionListener)this);
Run Code Online (Sandbox Code Playgroud)

其中DocumentEditor是在应用程序编辑器区域中打开的编辑器之一.

Ton*_*sen 9

来自JavaDoc ISelectionService.addSelectionListener(String partId, ISelectionListener listener)(重点是我的):

添加特定于部件的选择侦听器,当具有给定id的部件中的选择发生更改时,将通知该侦听器.这与部分激活无关 - 该部分无需激活即可发送通知.

创建零件时,将向侦听器传递零件的初始选择.处理部件时,将向侦听器传递空选择,但前提是侦听器实现INullSelectionListener.

注意:由于每个编辑器没有唯一的partId,因此无法正确跟踪编辑器部件.

因此,当您想要跟踪编辑器选择时,请不要使用此方法.而是使用ISelectionService.addSelectionListener(ISelectionListener listener)和检查给定的部分ISelectionListener.selectionChanged(IWorkbenchPart part, ISelection selection)使用instanceof...

代码的小注释:选择服务基于每个窗口存在,因此如果您有多个工作台窗口,它们每个都有自己的服务实例.

出于这个原因,我通常在我的视图和编辑器中使用以下代码:

ISelectionService ss = getSite().getWorkbenchWindow().getSelectionService();
ss.addPostSelectionListener(listener);
Run Code Online (Sandbox Code Playgroud)

这样使用的侦听器将来自正确的窗口.