hallvard / plantuml

Embed UML diagrams in files and view them in Eclipse
http://plantuml.sourceforge.net/
212 stars 58 forks source link

NPE when showing pull-down menu #113

Closed steghoja closed 3 years ago

steghoja commented 4 years ago

The first time I click on the little arrow to show the pull-down menu in the PlantUML view after starting Eclipse, I sometimes get the following exception:

!STACK 0
java.lang.NullPointerException
    at net.sourceforge.plantuml.eclipse.views.AbstractDiagramSourceView.getEditorSelectionActions(AbstractDiagramSourceView.java:366)
    at net.sourceforge.plantuml.eclipse.views.PlantUmlView$12.menuAboutToShow(PlantUmlView.java:268)
    at org.eclipse.jface.action.MenuManager.fireAboutToShow(MenuManager.java:342)
    at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:473)
    at org.eclipse.jface.action.MenuManager.access$1(MenuManager.java:468)
    at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:500)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:259)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4363)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1512)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1535)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1516)
    at org.eclipse.swt.widgets.Menu.menuWillOpen(Menu.java:808)
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:6142)
    at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method)
    at org.eclipse.swt.internal.cocoa.NSMenu.popUpContextMenu(NSMenu.java:80)
    at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:270)
    at org.eclipse.swt.widgets.Display.runPopups(Display.java:4227)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3760)
    at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.showMenu(StackRenderer.java:1345)
    at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer$1.widgetSelected(StackRenderer.java:728)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:252)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4363)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1512)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1535)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1520)
    at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1324)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4150)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3767)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1173)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1062)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)
    at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:644)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:566)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:155)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:661)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:597)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1476)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1449)

The offending line is:

final ISelectionProvider selectionProvider = editor.getSite().getSelectionProvider();

It looks like editor is null under some circumstances, i.e., when the active part after initialisation is an IViewPart. I suggest to change this and the preceding line to:

final IWorkbenchPart activePart = (pinnedTo != null ? pinnedTo : getSite().getPage().getActivePart());
if (activePart != null) {
    if (activePart != null && activePart instanceof IEditorPart) {
            IEditorPart editor = (IEditorPart) activePart;
            final ISelectionProvider selectionProvider = activePart.getSite().getSelectionProvider();
            if (selectionProvider != null) {

This should take care of these exceptions.