如何在分离视图获得焦点时在 Mac OS 上显示主菜单?

How to show main menu on Mac OS when a detached view is focused?

我有一个 Eclipse RCP 应用程序,使用 Eclipse 3.8,在 Mac OS 上,主菜单栏仅在主 window 获得焦点时显示。当我将焦点更改为分离的 window 时,菜单栏消失了。

所以,我明白Mac根据焦点window显示菜单,如果window不提供菜单栏,什么都不显示。

在 Eclipse 上,行为是相同的。

主要 window 重点:https://i.stack.imgur.com/4aRMa.png

分离 window 专注:https://i.stack.imgur.com/easMD.png

有没有办法设置主菜单而不考虑焦点视图?

我们找到了执行此操作的方法,但您必须分支 SWT 的本地副本。

首先我们获取到活动的workbenchwindow菜单栏:

Menu menuBar = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().getMenuBar();

直接在 shell 上设置它,使用 .setMenuBar( menuBar ) 将不起作用,因为它会检查菜单的父项并抛出 IllegalArgumentException。什么必须在 Decorations 上创建一个新方法,它是原始 setMenuBar 方法的副本,减去 父检查:

public void setAdoptedMenuBar( Menu menu ) {
    checkWidget();
    if (menuBar == menu) return;
    if (menu != null) {
        if (menu.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT);
        if ((menu.style & SWT.BAR) == 0) error (SWT.ERROR_MENU_NOT_BAR);
    }
    menuBar = menu;
}

我们还必须在 Shell 上添加一个新方法,以确保它使用 Decorations 上的新方法。它是 Shell.setMenuBar 的副本,在第二行进行了更改。

public void setAdoptedMenuBar( Menu menu ) {
    checkWidget();
    super.setAdoptedMenuBar( menu );
    if (display.getActiveShell () == this) {
        display.setMenuBar (menuBar);
    }
}

完成这些更改后,我们可以使用新方法在 shell 上设置活动的 workbench window 菜单栏。

我们还向我们的 shell 添加了一个处理侦听器,以确保我们从 shell 中解开菜单,以防止其被处理:

 shell.addDisposeListener( event -> shell.setMenuBar( null ) );