Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 330587 - [Dialogs] NPE in CTabFolderLayout
Summary: [Dialogs] NPE in CTabFolderLayout
Status: CLOSED WONTFIX
Alias: None
Product: Platform
Classification: Eclipse Project
Component: UI (show other bugs)
Version: 3.6.1   Edit
Hardware: PC Mac OS X - Carbon (unsup.)
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Platform UI Triaged CLA
QA Contact:
URL:
Whiteboard: stalebug
Keywords:
Depends on:
Blocks:
 
Reported: 2010-11-18 11:53 EST by Thomas Schindl CLA
Modified: 2019-09-24 13:51 EDT (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Thomas Schindl CLA 2010-11-18 11:53:59 EST
It looks like there's a situation where the renderer in is already nulled but somehow a layout gets computed:

----------8<----------
!ENTRY org.eclipse.core.databinding 4 0 2010-11-18 17:48:20.591
!MESSAGE Unhandled exception: null
!STACK 0
java.lang.NullPointerException
	at org.eclipse.swt.custom.CTabFolderLayout.computeSize(CTabFolderLayout.java:38)
	at org.eclipse.swt.widgets.Composite.computeSize(Composite.java:233)
	at org.eclipse.swt.layout.FillData.computeSize(FillData.java:26)
	at org.eclipse.swt.layout.FillLayout.computeChildSize(FillLayout.java:151)
	at org.eclipse.swt.layout.FillLayout.computeSize(FillLayout.java:122)
	at org.eclipse.swt.widgets.Composite.computeSize(Composite.java:233)
	at org.eclipse.swt.layout.GridData.computeSize(GridData.java:491)
	at org.eclipse.swt.layout.GridLayout.layout(GridLayout.java:217)
	at org.eclipse.swt.layout.GridLayout.computeSize(GridLayout.java:162)
	at org.eclipse.swt.widgets.Composite.computeSize(Composite.java:233)
	at org.eclipse.swt.layout.GridData.computeSize(GridData.java:491)
	at org.eclipse.swt.layout.GridLayout.layout(GridLayout.java:217)
	at org.eclipse.swt.layout.GridLayout.computeSize(GridLayout.java:162)
	at org.eclipse.swt.widgets.Composite.computeSize(Composite.java:233)
	at org.eclipse.swt.layout.FormData.computeSize(FormData.java:128)
	at org.eclipse.swt.layout.FormLayout.layout(FormLayout.java:320)
	at org.eclipse.swt.layout.FormLayout.layout(FormLayout.java:286)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1275)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1261)
	at org.eclipse.swt.widgets.Composite.layout(Composite.java:664)
	at org.eclipse.swt.widgets.Composite.layout(Composite.java:622)
	at org.eclipse.jface.dialogs.TitleAreaDialog.layoutForNewMessage(TitleAreaDialog.java:478)
	at org.eclipse.jface.dialogs.TitleAreaDialog.setErrorMessage(TitleAreaDialog.java:418)
	at com.bizerba.retail.control.ui.views.emf.store.dialogs.DeviceDialog.updateDialogState(DeviceDialog.java:164)
	at com.bizerba.retail.control.ui.views.emf.store.dialogs.DeviceDialog.access$0(DeviceDialog.java:143)
	at com.bizerba.retail.control.ui.views.emf.store.dialogs.DeviceDialog$1.handleValueChange(DeviceDialog.java:106)
	at org.eclipse.core.databinding.observable.value.ValueChangeEvent.dispatch(ValueChangeEvent.java:62)
	at org.eclipse.core.databinding.observable.ChangeManager.fireEvent(ChangeManager.java:119)
	at org.eclipse.core.databinding.observable.value.AbstractObservableValue.fireValueChange(AbstractObservableValue.java:71)
	at org.eclipse.core.databinding.observable.value.ComputedValue.makeDirty(ComputedValue.java:201)
	at org.eclipse.core.databinding.observable.value.ComputedValue$PrivateInterface.handleChange(ComputedValue.java:145)
	at org.eclipse.core.databinding.observable.ChangeEvent.dispatch(ChangeEvent.java:41)
	at org.eclipse.core.databinding.observable.ChangeManager.fireEvent(ChangeManager.java:119)
	at org.eclipse.core.databinding.observable.AbstractObservable.fireChange(AbstractObservable.java:65)
	at org.eclipse.core.databinding.observable.list.ObservableList.fireListChange(ObservableList.java:72)
	at org.eclipse.core.databinding.observable.list.WritableList.remove(WritableList.java:216)
	at org.eclipse.core.databinding.DataBindingContext.removeValidationStatusProvider(DataBindingContext.java:488)
	at org.eclipse.core.databinding.DataBindingContext.removeBinding(DataBindingContext.java:475)
	at org.eclipse.core.databinding.Binding.dispose(Binding.java:132)
	at org.eclipse.core.databinding.ValueBinding.dispose(ValueBinding.java:256)
	at org.eclipse.core.databinding.Binding$2.run(Binding.java:70)
	at org.eclipse.core.databinding.observable.Realm$1.run(Realm.java:148)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.databinding.observable.Realm.safeRun(Realm.java:152)
	at org.eclipse.core.databinding.observable.Realm.exec(Realm.java:170)
	at org.eclipse.core.databinding.Binding$1.handleDispose(Binding.java:67)
	at org.eclipse.core.databinding.observable.DisposeEvent.dispatch(DisposeEvent.java:38)
	at org.eclipse.core.databinding.observable.ChangeManager.fireEvent(ChangeManager.java:119)
	at org.eclipse.core.databinding.observable.AbstractObservable.dispose(AbstractObservable.java:86)
	at org.eclipse.core.databinding.observable.DecoratingObservable.dispose(DecoratingObservable.java:124)
	at org.eclipse.core.databinding.observable.value.DecoratingObservableValue.dispose(DecoratingObservableValue.java:116)
	at org.eclipse.emf.databinding.internal.EMFObservableValueDecorator.dispose(EMFObservableValueDecorator.java:53)
	at org.eclipse.core.databinding.observable.DecoratingObservable$1.handleDispose(DecoratingObservable.java:49)
	at org.eclipse.core.databinding.observable.DisposeEvent.dispatch(DisposeEvent.java:38)
	at org.eclipse.core.databinding.observable.ChangeManager.fireEvent(ChangeManager.java:119)
	at org.eclipse.core.databinding.observable.AbstractObservable.dispose(AbstractObservable.java:86)
	at org.eclipse.core.internal.databinding.property.value.SimplePropertyObservableValue.dispose(SimplePropertyObservableValue.java:151)
	at org.eclipse.core.databinding.observable.DecoratingObservable.dispose(DecoratingObservable.java:120)
	at org.eclipse.core.databinding.observable.value.DecoratingObservableValue.dispose(DecoratingObservableValue.java:116)
	at org.eclipse.emf.databinding.internal.EMFObservableValueDecorator.dispose(EMFObservableValueDecorator.java:53)
	at org.eclipse.core.databinding.ObservablesManager.dispose(ObservablesManager.java:134)
	at com.bizerba.retail.common.parts.BasePart$2.widgetDisposed(BasePart.java:104)
	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.Composite.releaseChildren(Composite.java:872)
	at org.eclipse.swt.widgets.Canvas.releaseChildren(Canvas.java:167)
	at org.eclipse.swt.widgets.Decorations.releaseChildren(Decorations.java:773)
	at org.eclipse.swt.widgets.Shell.releaseChildren(Shell.java:1267)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:811)
	at org.eclipse.swt.widgets.Widget.dispose(Widget.java:446)
	at org.eclipse.swt.widgets.Decorations.dispose(Decorations.java:447)
	at org.eclipse.swt.widgets.Shell.dispose(Shell.java:714)
	at org.eclipse.jface.window.Window.close(Window.java:335)
	at org.eclipse.jface.dialogs.Dialog.close(Dialog.java:979)
	at org.eclipse.jface.dialogs.TrayDialog.close(TrayDialog.java:179)
	at org.eclipse.jface.dialogs.Dialog.cancelPressed(Dialog.java:488)
	at org.eclipse.jface.dialogs.Dialog.buttonPressed(Dialog.java:474)
	at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:624)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234)
	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.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
	at org.eclipse.jface.window.Window.open(Window.java:801)
	at com.bizerba.retail.control.ui.views.emf.store.handlers.NewDeviceHandler.execute(NewDeviceHandler.java:26)
	at com.bizerba.retail.control.ui.views.emf.store.AssignmentPart$10.widgetSelected(AssignmentPart.java:332)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234)
	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.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2641)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2605)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2439)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:672)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:665)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at com.bizerba.basic.rcpapp.internal.Application.start(Application.java:81)
	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:619)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1383)
----------8<----------
Comment 1 Thomas Schindl CLA 2010-11-18 11:55:23 EST
Bogdan, is this maybe a regression introduced through the new CTabFolder-Rendering?
Comment 2 Thomas Schindl CLA 2010-11-18 12:02:30 EST
On a second thought I think the Dialog code is wrong because it tries to compute a new layout while we are disposing the widgets
Comment 3 Bogdan Gheorghe CLA 2010-11-19 18:12:01 EST
I agree with your conclusion. ;)
Comment 4 Thomas Schindl CLA 2010-11-20 02:56:52 EST
As suggested by Bogdan I'm moving this to UI. We should probably check if we are bringing the dialog down before acutally doing a relayout.
Comment 5 Susan McCourt CLA 2010-12-16 18:08:01 EST
Tom, do you see this frequently and do you have a way to consistently reproduce?  All of my naive test cases (close the dialog and then set the message) will fail much earlier than the layout, because disposed message labels will be touched.  If only the CTabFolder is destroyed, there is no failure.  So I think it's a specific timing/disposal problem that may well depend on the individual dialog.

I could check for disposal of the work area and not do the layout, but I'm reticent to apply a band-aid when I can't force it to happen in a test.
Comment 6 Remy Suen CLA 2011-01-06 14:09:52 EST
See also bug 333684 which may be related.
Comment 7 Susan McCourt CLA 2011-01-11 12:48:27 EST
I can see several places where a band-aid could be applied.  (Such as bailing out of TitleAreaDialog#layoutForNewMessage when the dialog area is disposed).  The problem here is reproducing the sequence that causes the problem.  I don't know if the band-aid will work (depending on where we are in the dispose sequence, etc.)  Looking at the stack, it seems as if the client dialog is setting an error message in the middle of its dispose handling.

com.bizerba.retail.control.ui.views.emf.store.dialogs.DeviceDialog.updateDialogState(DeviceDialog.java:164)


I agree that we could handle this better, but I'll need a snippet that shows the problem in an SDK dialog.

(In reply to comment #6)
> See also bug 333684 which may be related.

This is similar, but not the same.  In that one, it appears that the bounds are being set in the middle of handling a close event, so a layout on a partially disposed widget tree is occurring.  I'll comment in that bug.

Tom, do you know whose dialog that is?
Comment 8 Lars Vogel CLA 2019-09-24 13:51:02 EDT
This bug hasn't had any activity in quite some time. Maybe the problem got resolved, was a duplicate of something else, or became less pressing for some reason - or maybe it's still relevant but just hasn't been looked at yet.

If you have further information on the current state of the bug, please add it. The information can be, for example, that the problem still occurs, that you still want the feature, that more information is needed, or that the bug is (for whatever reason) no longer relevant.