问候Stackoverflowians,
我正在开发一个Eclipse RCP应用程序,并且必须添加SelectionListener到Project Explorer view它的创建后的时刻.
我已经意识到我不能在我的贡献插件的Activator中执行此操作,而为了获取SelectionService通道,PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService()我必须有一个活动的工作台窗口(null在Activator start()调用时)
所以我的问题:我什么时候可以拿到SelectionService,以使Project Explorer view已经建立并是可见的,但用户至今还没有能够"推动任何按钮的?
任何意见和建议表示赞赏!
如果您真的想要从启动时跟踪用户选择而没有可以注册ISelectionListener创建的UI(如视图),那么您可以使用启动挂钩.
Eclipse提供了扩展点org.eclipse.ui.startup.它接受一个实现接口的类org.eclipse.ui.IStartup.它将在UI创建后调用,因此ISelectionService已经可用:
public class StartupHook implements IStartup, ISelectionListener {
@Override
public void earlyStartup() {
final IWorkbench workbench = PlatformUI.getWorkbench();
workbench.addWindowListener(new IWindowListener() {
@Override
public void windowOpened(IWorkbenchWindow window) {
addSelectionListener(window);
}
@Override
public void windowClosed(IWorkbenchWindow window) {
removeSelectionListener(window);
}
/* ... */
});
workbench.getDisplay().asyncExec(new Runnable() {
public void run() {
for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
addSelectionListener(window);
}
}
});
}
private void addSelectionListener(IWorkbenchWindow window) {
if (window != null) {
window.getSelectionService().addSelectionListener("org.eclipse.ui.navigator.ProjectExplorer", this);
}
}
private void removeSelectionListener(IWorkbenchWindow window) {
if (window != null) {
window.getSelectionService().removeSelectionListener("org.eclipse.ui.navigator.ProjectExplorer", this);
}
}
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
// TODO handle selection changes
System.out.println("selection changed");
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,不鼓励使用此UI启动挂钩,因为它迫使OSGi很早就激活您的捆绑包(所以所有依赖捆绑包也是如此!)并减慢系统启动速度.所以请确保你的包很整齐.将捆绑依赖性降至最低.有时需要将启动钩子代码移动到一个单独的包中以实现这一点.