Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 330254

Summary: [Compatibility] Part getting closed by workbench window shutdown causes part activation
Product: [Eclipse Project] e4 Reporter: Thomas Kratz <eiswind>
Component: UIAssignee: Remy Suen <remy.suen>
Status: RESOLVED FIXED QA Contact: Remy Suen <remy.suen>
Severity: normal    
Priority: P3 CC: remy.suen
Version: 1.0   
Target Milestone: 4.1 M4   
Hardware: All   
OS: All   
Whiteboard:
Attachments:
Description Flags
WorkbenchWindow patch v1 none

Description Thomas Kratz CLA 2010-11-15 09:45:39 EST
Build Identifier: M3 4.1

running my 3.6 based app on e4 I get an Exception on shutdown of the
workbench. Remy said it may be related to

https://bugs.eclipse.org/bugs/show_bug.cgi?id=308492



org.eclipse.e4.core.di.InjectionException:
org.eclipse.swt.SWTException: Widget is disposed
       at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:59)
       at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:75)
       at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:90)
       at org.eclipse.e4.core.internal.contexts.EclipseContext.processScheduled(EclipseContext.java:326)
       at org.eclipse.e4.core.internal.contexts.EclipseContext.set(EclipseContext.java:343)
       at org.eclipse.e4.core.internal.contexts.EclipseContext.activate(EclipseContext.java:596)
       at org.eclipse.e4.core.internal.contexts.EclipseContext.activateBranch(EclipseContext.java:601)
       at org.eclipse.e4.ui.internal.workbench.PartActivationHistory.activate(PartActivationHistory.java:52)
       at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.activate(PartServiceImpl.java:484)
       at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.activate(PartServiceImpl.java:457)
       at org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer.activate(AbstractPartRenderer.java:105)
       at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer$3.handleEvent(ContributedPartRenderer.java:171)
       at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
       at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
       at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
       at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1058)
       at org.eclipse.swt.widgets.Shell.setActiveControl(Shell.java:1447)
       at org.eclipse.swt.widgets.Control.sendFocusEvent(Control.java:2642)
       at org.eclipse.swt.widgets.Widget.wmSetFocus(Widget.java:2402)
       at org.eclipse.swt.widgets.Control.WM_SETFOCUS(Control.java:4797)
       at org.eclipse.swt.widgets.Canvas.WM_SETFOCUS(Canvas.java:448)
       at org.eclipse.swt.widgets.Control.windowProc(Control.java:4234)
       at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:341)
       at org.eclipse.swt.widgets.Display.windowProc(Display.java:4891)
       at org.eclipse.swt.internal.win32.OS.DestroyWindow(Native Method)
       at org.eclipse.swt.widgets.Control.destroyWidget(Control.java:684)
       at org.eclipse.swt.widgets.Widget.release(Widget.java:818)
       at org.eclipse.swt.widgets.Widget.dispose(Widget.java:446)
       at org.eclipse.jface.action.ToolBarManager.dispose(ToolBarManager.java:153)
       at org.eclipse.ui.internal.forms.widgets.FormHeading$6.widgetDisposed(FormHeading.java:772)
       at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:123)
       at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
       at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
       at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
       at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1058)
       at org.eclipse.swt.widgets.Widget.release(Widget.java:808)
       at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:872)
       at org.eclipse.swt.widgets.Widget.release(Widget.java:811)
       at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:872)
       at org.eclipse.swt.widgets.Widget.release(Widget.java:811)
       at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:872)
       at org.eclipse.swt.widgets.Widget.release(Widget.java:811)
       at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:872)
       at org.eclipse.swt.widgets.Widget.release(Widget.java:811)
       at org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:872)
       at org.eclipse.swt.widgets.Widget.release(Widget.java:811)
       at org.eclipse.swt.widgets.Widget.dispose(Widget.java:446)
       at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.disposeWidget(SWTPartRenderer.java:134)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:628)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:591)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:586)
       at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:572)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:624)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:591)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:586)
       at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:572)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:624)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:591)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:586)
       at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:572)
       at org.eclipse.e4.ui.workbench.renderers.swt.ElementReferenceRenderer.disposeWidget(ElementReferenceRenderer.java:108)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:628)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:591)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:586)
       at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:572)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:624)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:591)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:586)
       at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:572)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:624)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:591)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:586)
       at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:572)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:624)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:591)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:586)
       at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:572)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:624)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$1(PartRenderingEngine.java:591)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:586)
       at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:572)
       at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1389)
       at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1091)
       at org.eclipse.ui.internal.WorkbenchWindow.access$9(WorkbenchWindow.java:1070)
       at org.eclipse.ui.internal.WorkbenchWindow$6.run(WorkbenchWindow.java:1117)
       at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
       at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1115)
       at org.eclipse.ui.internal.Workbench$14.run(Workbench.java:1040)
       at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
       at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1034)
       at org.eclipse.ui.internal.Workbench.access$11(Workbench.java:952)
       at org.eclipse.ui.internal.Workbench$15.run(Workbench.java:1114)
       at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
       at org.eclipse.ui.internal.Workbench.close(Workbench.java:1112)
       at org.eclipse.ui.internal.Workbench.close(Workbench.java:1085)
       at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1088)
       at org.eclipse.ui.internal.WorkbenchWindow.access$9(WorkbenchWindow.java:1070)
       at org.eclipse.ui.internal.WorkbenchWindow$6.run(WorkbenchWindow.java:1117)
       at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
       at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1115)
       at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1131)
       at org.eclipse.ui.internal.WorkbenchWindow$4.close(WorkbenchWindow.java:431)
       at org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer$8.shellClosed(WBWRenderer.java:419)
       at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:98)
       at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
       at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
       at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
       at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062)
       at org.eclipse.swt.widgets.Decorations.closeWidget(Decorations.java:308)
       at org.eclipse.swt.widgets.Decorations.WM_CLOSE(Decorations.java:1665)
       at org.eclipse.swt.widgets.Control.windowProc(Control.java:4167)
       at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:341)
       at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1598)
       at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2061)
       at org.eclipse.swt.widgets.Display.windowProc(Display.java:4891)
       at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
       at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2456)
       at org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:497)
       at org.eclipse.swt.widgets.Control.windowProc(Control.java:4256)
       at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:341)
       at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1598)
       at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2061)
       at org.eclipse.swt.widgets.Display.windowProc(Display.java:4891)
       at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
       at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2456)
       at org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:497)
       at org.eclipse.swt.widgets.Control.windowProc(Control.java:4256)
       at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:341)
       at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1598)
       at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2061)
       at org.eclipse.swt.widgets.Display.windowProc(Display.java:4891)
       at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
       at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2461)
       at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3673)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$6.run(PartRenderingEngine.java:780)
       at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
       at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:689)
       at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:104)
       at org.eclipse.ui.internal.Workbench$3.run(Workbench.java:542)
       at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
       at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:524)
       at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
       at de.eiswind.paris.client.core.Application.start(Application.java:35)
       at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
       at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
       at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
       at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
       at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
       at java.lang.reflect.Method.invoke(Unknown Source)
       at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:621)
       at org.eclipse.equinox.launcher.Main.basicRun(Main.java:576)
       at org.eclipse.equinox.launcher.Main.run(Main.java:1409)
       at org.eclipse.equinox.launcher.Main.main(Main.java:1385)

Reproducible: Always

Steps to Reproduce:
1. Create a FormEditor
2. Open it
3. Shutdown workbench
Comment 1 Paul Webster CLA 2010-11-15 10:16:40 EST
Second part of the exception:

Caused by: org.eclipse.swt.SWTException: Widget is disposed
       at org.eclipse.swt.SWT.error(SWT.java:4091)
       at org.eclipse.swt.SWT.error(SWT.java:4006)
       at org.eclipse.swt.SWT.error(SWT.java:3977)
       at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
       at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:340)
       at org.eclipse.swt.widgets.Widget.getData(Widget.java:525)
       at org.eclipse.ui.part.MultiPageEditorPart.getEditor(MultiPageEditorPart.java:610)
       at org.eclipse.ui.part.MultiPageEditorPart.getActiveEditor(MultiPageEditorPart.java:534)
       at org.eclipse.ui.forms.editor.FormEditor.getActiveEditor(FormEditor.java:430)
       at org.eclipse.ui.part.MultiPageEditorPart.getAdapter(MultiPageEditorPart.java:1173)
       at org.eclipse.ui.internal.util.Util.getAdapter(Util.java:110)
       at org.eclipse.ui.internal.WorkbenchPage.getShowInSource(WorkbenchPage.java:236)
       at org.eclipse.ui.internal.WorkbenchPage.getContext(WorkbenchPage.java:240)
       at org.eclipse.ui.internal.WorkbenchPage.updateShowInSources(WorkbenchPage.java:228)
       at org.eclipse.ui.internal.WorkbenchPage.updateActivations(WorkbenchPage.java:171)
       at org.eclipse.ui.internal.WorkbenchPage.access$7(WorkbenchPage.java:166)
       at org.eclipse.ui.internal.WorkbenchPage$E4PartListener.partActivated(WorkbenchPage.java:134)
       at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.firePartActivated(PartServiceImpl.java:170)
       at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.setPart(PartServiceImpl.java:144)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
       at java.lang.reflect.Method.invoke(Unknown Source)
       at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:52)
Comment 2 Remy Suen CLA 2010-11-15 16:08:31 EST
Is this consistently reproducible? I can't seem to get it to happen with the PDE editors.
Comment 3 Thomas Kratz CLA 2010-11-16 03:05:26 EST
Yes happens on every shutdown at my side. Don't know how to provide further help. Let me know
Comment 4 Remy Suen CLA 2010-11-16 05:37:52 EST
(In reply to comment #3)
> Yes happens on every shutdown at my side.

Do you get the problem if you launch a second Eclipse instance and shutdown with PDE editors up?
Comment 5 Thomas Kratz CLA 2010-11-16 05:49:25 EST
no it happens only with my own editors. maybe its in getAdapter where i should provide something from the superclasses ?
Comment 6 Remy Suen CLA 2010-11-16 05:51:22 EST
(In reply to comment #5)
> no it happens only with my own editors.

If you make a very simple form editor (just make a few pages and put buttons in them or something), does the same problem occur?

> maybe its in getAdapter where i should
> provide something from the superclasses ?

No, I don't think that's the problem. And if it is, why does your code work in 3.x? :)
Comment 7 Thomas Kratz CLA 2010-11-16 06:00:11 EST
The editor is only some pages with textfields, labels and tables. But I have Actions in the Form Header Toolbar
at org.eclipse.swt.widgets.Widget.dispose(Widget.java:446)
	at org.eclipse.jface.action.ToolBarManager.dispose(ToolBarManager.java:153)
	at org.eclipse.ui.internal.forms.widgets.FormHeading$6.widgetDisposed(FormHeading.java:772)
	
is it there ?
Comment 8 Remy Suen CLA 2010-11-16 06:03:30 EST
(In reply to comment #7)
> The editor is only some pages with textfields, labels and tables. But I have
> Actions in the Form Header Toolbar
> at org.eclipse.swt.widgets.Widget.dispose(Widget.java:446)
>     at org.eclipse.jface.action.ToolBarManager.dispose(ToolBarManager.java:153)
>     at
> org.eclipse.ui.internal.forms.widgets.FormHeading$6.widgetDisposed(FormHeading.java:772)
> 
> is it there ?

It's possible that's the cause although I think the PDE editors also have actions. If you comment out the action contribution code does the problem stop happening?
Comment 9 Thomas Kratz CLA 2010-11-16 06:17:13 EST
Yes, if I completely remove the actions from the form toolbar, the exception does not occur anymore
Comment 10 Remy Suen CLA 2010-11-17 11:17:02 EST
Created attachment 183311 [details]
WorkbenchWindow patch v1

Hi Thomas, could you give this patch a spin and see if it fixes your problem? Thanks.
Comment 11 Thomas Kratz CLA 2010-11-18 04:48:26 EST
Patch makes Exception go away.
Comment 12 Remy Suen CLA 2010-11-18 07:42:13 EST
(In reply to comment #10)
> Created an attachment (id=183311) [details]
> WorkbenchWindow patch v1

Fix released to HEAD. Thanks for helping investigate the cause and testing the fix, Thomas!

Please feel free to let us know if you see any other problems.