HandledContributionItem.canExecuteItem中的NPE

时间:2017-10-30 14:21:40

标签: java eclipse-plugin e4

我有一个小编辑器,其中包含由 plugin.xml 提供的工具栏:

public class MyEditor extends EditorPart {

    public static final String ID = "org.acme.project.MyEditor";

    @Override
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        setSite(site);
        setInput(input);
    }

    @Override
    public void createPartControl(Composite parent) {
        final ToolBarManager localToolBarmanager = new ToolBarManager();
        final IMenuService menuService = PlatformUI.getWorkbench().getService(IMenuService.class);
        menuService.populateContributionManager(localToolBarmanager, "toolbar:org.acme.menu");
        localToolBarmanager.createControl(parent);

    }
}

当然,我的 plugin.xml 有一个贡献:

<extension point="org.eclipse.ui.menus">
  <menuContribution allPopups="false" locationURI="toolbar:org.acme.menu">
        <command commandId="org.eclipse.ui.file.saveAll" style="push" />
    </menuContribution>
</extension>

编辑器打开,工具栏得到贡献,一切都很好。当我关闭打开编辑器时处于活动状态的工作台部件时,我得到以下异常:

!ENTRY org.eclipse.e4.ui.workbench.renderers.swt 4 2 2017-10-30 15:12:53.110
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.renderers.swt".
!STACK 0
java.lang.NullPointerException
    at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.canExecuteItem(HandledContributionItem.java:443)
    at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem$4.run(AbstractContributionItem.java:524)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem.updateItemEnablement(AbstractContributionItem.java:564)
    at org.eclipse.e4.ui.workbench.renderers.swt.ToolItemUpdater.updateContributionItems(ToolItemUpdater.java:36)
    at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer.subscribeTopicUpdateToolbarEnablement(ToolBarManagerRenderer.java:295)
    at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
    at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler$1.run(UIEventObjectSupplier.java:56)
    at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827)

而且它实际上只是关注的一部分。我可以关闭其他部分就好了。此异常导致工具栏中的处理程序被破坏,工具栏不再工作。

我发现了一些例外的错误:Bug 388516&amp; Bug 394500

但这些应该在4.2中修复(我们使用的是4.6)。除此之外,我找不到任何可能导致类似奇怪错误消息的内容。

有没有人知道如何修复我们的工具栏?

1 个答案:

答案 0 :(得分:1)

这是愚蠢的E4错误之一。对我们来说可能是前3名。

WorkbenchMenuService.populateContributionManager(ContributionManager, String)获取当前活动的工作台部分以注册菜单。由于工具栏通常是在IWorkbenchPart.createPartControl(Composite)中创建的,这意味着新部件尚未完全创建,因此 尚未成为活动部件。

因此,工具栏不再适用于所有视图和编辑器!

我找到了一个解决方法(这真的很难看,但是你要做什么?)来修复这个庞大的E4错误。对populateContributionManager的调用必须替换为以下行:

    final MPart part = getSite().getService(MPart.class);
    String menuLocation = "toolbar:org.acme.menu";

    if (menuService instanceof WorkbenchMenuService) {
        ((WorkbenchMenuService) menuService).populateContributionManager(part, manager, menuLocation);
    } else if (menuService instanceof SlaveMenuService) {
        ((SlaveMenuService) menuService).populateContributionManager(part, manager, menuLocation);
    } else
        throw new UnsupportedOperationException("Do not know how to handle " + menuService); //$NON-NLS-1$