我创建了一个简单的Eclipse RCP应用程序,我可以根据用户操作打开多个编辑器实例。我有一个单独的视图(ViewPart),我在那里听取编辑器上的选择更改。 问题是视图仅通知上次打开的编辑器中的选择,之前打开的其他编辑器不再提供事件/或者视图仅侦听最后打开的编辑器而没有其他内容。即使之前打开的编辑获得了关注,也会发生这种情况。
换句话说,只有编辑区域中的最新编辑器提供选择事件,我想要的是,当我点击其他编辑器的选项卡时,我想在我点击之前打开的编辑器之一时看到我的视图上的更改
在我看来,我使用:
IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getActiveWorkbenchWindow().getActivePage().addSelectionListener(DocumentsEditor.ID,(ISelectionListener)this);
其中DocumentEditor是在应用程序编辑器区域中打开的编辑器之一。
答案 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);
这样使用的侦听器将来自正确的窗口。