1

我想定义一个自包含的 Eclipse 视图,但只要启动 Workbench 应用程序就能够响应选择事件,即使视图不可见,只要它显示为“背景”之一视图”在文件夹中。换句话说,我需要一个“钩子”,在创建视图的占位符时调用它。

问题是当 Workbench 应用程序启动时,后台视图通常不会被实例化。您当然可以IPerspectiveFactory在 Eclipse 中实现一个初始透视布局,但工厂仅在初始选择透视时使用;之后,在随后的启动中,Eclipse 会保留不涉及创建视图的纪念品。

有没有办法做到这一点?

4

1 回答 1

2

我认为将驱动视图的数据模型与视图 UI 分开是个好主意。这将允许不断更新数据模型并添加或删除视图,而无需维护任何类型的状态。

您可以在插件 Activator 中将数据模型添加为 SelectionService 侦听器:

private ISelectionListener listener;

public void start(BundleContext context) throws Exception {
    super.start(context);
    listener = new ISelectionListener() {

        @Override
        public void selectionChanged(IWorkbenchPart part,
                ISelection selection) {
            // Update model
        }
    };
    PlatformUI.getWorkbench().getActiveWorkbenchWindow()
            .getSelectionService()
            .addSelectionListener(listener);
}

public void stop(BundleContext context) throws Exception {
    PlatformUI.getWorkbench().getActiveWorkbenchWindow()
            .getSelectionService().removeSelectionListener(listener);
    super.stop(context);
}

创建视图时,它可以使用数据模型来填充 UI 组件并监听数据模型以获取任何实时更新。

您需要确保在启动应用程序时激活您的插件。以下问题可以对此有所帮助。

自动启动 OSGi 服务

编辑

即使视图当前处于隐藏状态,以下代码也可用于激活您的视图(调用 createPartControl)。通过将此代码放在您的激活器中,它可以在您的插件激活后立即开始监听模型事件。

PlatformUI.getWorkbench().addWindowListener(new IWindowListener() {

...

    @Override
    public void windowActivated(IWorkbenchWindow window) {
        IViewReference view = window.getActivePage().findViewReference(
            VIEW_ID);
        if (view != null) {
            view.getPart(true);
        }
    }
});
于 2013-07-08T12:46:48.450 回答