【问题标题】:Eclipse RCP: Can I remove Orphaned Perspectives from the Perspective Bar?Eclipse RCP:我可以从透视栏中删除孤立的透视吗?
【发布时间】:2016-06-15 18:52:34
【问题描述】:

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

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

有没有办法以编程方式访问透视工具栏,以便删除任何孤立的透视?或者任何其他可行的方法?

【问题讨论】:

  • 对于 Eclipse 4,透视切换器是一个 e4 类,它只查看应用程序模型中 MPerspectiveStack 的内容。对于 Eclipse 3,代码完全不同。
  • 我的目标是 Eclipse 4.5,但我的应用程序使用兼容层具有 Eclipse 3 视图。这是否意味着 MPerspectiveStack 用于填充工具栏?我用 Open Type 找不到那个类。
  • 所有 Eclipse 4 代码都使用 e4 透视切换器。您的视图在核心 e4 之上使用 3.x 兼容模式。 MPerspectiveStack 是 Eclipse 的一部分,因此要让 Open Type 找到它,您需要检查 Preferences > Plug-in Development 首选项页面上的 'include all plugins from target in Java Search' 选项。透视切换器本身是org.eclipse.e4.ui.workbench.addons.perspectiveswitcher.PerspectiveSwitcher
  • 我找到了这两个类,但我不知道如何获得对 PerspectiveSwitcher 实例的引用。没有静态方法,所以我想我需要从主工具栏中获取它,但在搜索时我发现 Paul Webster 的评论说没有办法做到这一点。
  • 我不认为 PerspectiveSwitch 有任何方法可以做你想做的事。我提到了它,以便您可以查看源代码以了解它在做什么。

标签: eclipse-rcp toolbar perspective


【解决方案1】:

我认为一个好的解决方案是创建一个自定义透视切换器,但该路径被 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));
        }
    }
    ...
}

【讨论】:

    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 2011-01-13
    • 2023-03-15
    • 1970-01-01
    • 2010-10-24
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多