在后台创建“实时”视图

时间:2013-07-05 21:37:54

标签: eclipse eclipse-rcp

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

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

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分: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组件,并监听数据模型以获取任何实时更新。

您需要确保在启动应用程序时激活插件。以下问题可以帮助解决这个问题。

auto-start OSGi service

修改

即使视图当前处于隐藏状态,也可以使用以下代码激活视图(调用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);
        }
    }
});