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

时间:2011-07-16 01:10:45

标签: eclipse-rcp

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

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

在我看来,我使用:

IWorkbench workbench = PlatformUI.getWorkbench();
        workbench.getActiveWorkbenchWindow().getActivePage().addSelectionListener(DocumentsEditor.ID,(ISelectionListener)this);

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

1 个答案:

答案 0 :(得分:9)

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

  

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

     

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

     

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

因此,当您想要跟踪编辑器选择时,请不要使用此方法。而是使用ISelectionService.addSelectionListener(ISelectionListener listener)并使用ISelectionListener.selectionChanged(IWorkbenchPart part, ISelection selection) ...

检查instanceof中的给定部分

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

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

ISelectionService ss = getSite().getWorkbenchWindow().getSelectionService();
ss.addPostSelectionListener(listener);

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