Eclipse RCP:我可以从透视栏中删除孤立透视图吗?

时间:2016-03-02 18:33:03

标签: eclipse-rcp toolbar perspective

我正在开发一个具有两个产品版本的RCP,一个核心应用程序和一个带有一些扩展的应用程序。如果用户在同一工作区中打开扩展应用程序后打开核心应用程序,则eclipse会检测仅在扩展应用程序中使用的透视图并制作它的本地副本,因此它在透视工具栏中显示为孤立扩展。 / p>

我在运行核心应用时创建了一个隐藏扩展应用视角的活动。这隐藏在透视菜单和透视快捷菜单中,但它不会从透视工具栏中删除它。我还尝试从活动工作台窗口的活动页面中检测孤立透视图(通过查找标签)并使用PlatformUI.getWorkbench().getPerspectiveRegistry().deletePerspective(perspective)删除它们,但这也不会影响透视工具栏。我删除的视角不在核心应用中。

有没有办法可以通过编程方式访问透视工具栏,这样我就可以删除任何孤立的透视图?或任何其他方法可行吗?

1 个答案:

答案 0 :(得分:0)

我认为一个好的解决方案是创建自定义透视切换器,但该路径被eclipse bug阻止。有一个suggested workaround,但它对我不起作用。我创建了一个自定义透视切换器工具栏,但是当打开或激活透视图时,我发现无法更新它。我的尝试记录在案here

我删除了工作区关闭钩子中的孤立透视图,但由于某种原因,当我在切换器中选择已打开但未选中的透视图时,E4工作台(LazyStackRenderer行238)会抛出NPE。我推出了应用程序。

通过在关闭时关闭所有打开的视角,将其ID存储在首选项值中,然后在WorkbenchWindowAdvisor中启动应用程序后再次打开它,我按照需要工作。这有点像黑客,但这是我能找到避免E4工作台NPE的唯一方法,这也阻止了从工具栏设置透视直到它从Window菜单关闭并重新打开。

这是我的代码。

...

IWorkbench workbench = ...
static final String PERPSECTIVE_ID_1 = ...
static fnal String PERSPECTIVE_ID_2 = ...
static final String PREFERENCE_KEY = ...

workbench.addWorkbenchListener( new IWorkbenchListener() {
        public boolean preShutdown( IWorkbench workbench, boolean forced ) {

            IPerspectiveDescriptor[] openPerspectives = page.getOpenPerspectives();
            page.closeAllPerspectives(false, false);
            StringBuilder sb = new StringBuilder();
            String delim = "";
            for (IPerspectiveDescriptor persp : openPerspectives) {
                if (!persp.getId().equals(PERSPECTIVE_ID_1) && !persp.getId().equals(PERSPECTIVE_ID_2) {
                    sb.append(delim + persp.getId());
                    delim = ";";
                }
            }
            getPreferenceStore().setValue(PREF_KEY, sb.toString());

            return true;
        }

        public void postShutdown( IWorkbench workbench ) {

        }
});

class MyWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {

    static final String PRODUCT_ID_1 = ...
    static final String PRODUCT_ID_2 = ...
    static final String PREFERENCE_KEY = ...

    ...

    @Override
    public void postWindowOpen() {

        IWorkbenchPage page = getWindowConfigurer().getWindow().getActivePage();
        String savedOpenPerspectiveStr = getPreferenceStore().getString(PREFERENCE_KEY);
        if (!"".equals(savedOpenPerspectiveStr)) {
            List<IPerspectiveDescriptor> openPerspectives = new ArrayList<IPerspectiveDescriptor>();
            String[] perspectiveIds = savedOpenPerspectiveStr.split(";");
            if (perspectiveIds.length == 0) {
               openPerspectives.add(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(savedOpenPerspectiveStr));
            } else {
                for (String id : perspectiveIds) {
                   openPerspectives.add(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(id));
                }
            }
            //successively setting perspectives causes them to appear in the perspective switcher toolbar
            for (IPerspectiveDescriptor persp : openPerspectives) {
                page.setPerspective(persp);
            }
        }

        //now we set the appropriate perspective
        if (Platform.getProduct().getId().equals(PRODUCT_ID_1)) {
            page.setPerspective(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(PERSPECTIVE_ID_1));
        } else if (Platform.getProduct().getId().equals(PRODUCT_ID_2)) {
            page.setPerspective(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(PERSPECTIVE_ID_2));
        }
    }
    ...
}