Community
Participate
Working Groups
Build ID: I20070625-1500 Steps To Reproduce: 1. Run the JDT. 2. Launch a wizard: New > Project. 3. Choose "Java Project". 4. Enter enough data to enable the "Finish" button. 5. Bring up the dialog's help using the "?" button in the lower left. 6. Press the "Finish" button. 7. Proceed through any "perspective" dialog. At this point the "New Java Project" dialog remains, but with white rectangles where the controls were. The controls are redrawn when they are clicked on. More information: I found this in my own Eclipse 3.3 project as well. The following stack trace is printed when I come at the dialog via a cheat sheet: !ENTRY org.eclipse.ui 4 0 2007-09-06 14:29:33.445 !MESSAGE Unhandled event loop exception !STACK 0 org.eclipse.swt.SWTException: Graphic is disposed at org.eclipse.swt.SWT.error(SWT.java:3563) at org.eclipse.swt.SWT.error(SWT.java:3481) at org.eclipse.swt.SWT.error(SWT.java:3452) at org.eclipse.swt.graphics.Image.getBounds(Image.java:609) at org.eclipse.swt.widgets.Label.drawWidget(Label.java:163) at org.eclipse.swt.widgets.Widget.kEventControlDraw(Widget.java:1029) at org.eclipse.swt.widgets.Widget.controlProc(Widget.java:363) at org.eclipse.swt.widgets.Display.controlProc(Display.java:835) at org.eclipse.swt.internal.carbon.OS.StillDown(Native Method) at org.eclipse.swt.widgets.Display.runEnterExit(Display.java:3310) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2953) at org.eclipse.jface.window.Window.runEventLoop(Window.java:820) at org.eclipse.jface.window.Window.open(Window.java:796) at org.eclipse.ui.internal.handlers.WizardHandler.execute(WizardHandler.java:146) at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:239) at org.eclipse.core.commands.Command.executeWithChecks(Command.java:475) at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:429) at org.eclipse.ui.internal.cheatsheets.CommandRunner.executeCommand(CommandRunner.java:83) at org.eclipse.ui.internal.cheatsheets.data.CheatSheetCommand.execute(CheatSheetCommand.java:44) at org.eclipse.ui.internal.cheatsheets.views.CoreItem.runExecutable(CoreItem.java:497) at org.eclipse.ui.internal.cheatsheets.views.CoreItem.runExecutable(CoreItem.java:492) at org.eclipse.ui.internal.cheatsheets.views.CheatSheetViewer.runPerformExecutable(CheatSheetViewer.java:1041) at org.eclipse.ui.internal.cheatsheets.views.CoreItem$1.linkActivated(CoreItem.java:89) at org.eclipse.ui.forms.widgets.AbstractHyperlink.handleActivate(AbstractHyperlink.java:228) at org.eclipse.ui.forms.widgets.ImageHyperlink.handleActivate(ImageHyperlink.java:177) at org.eclipse.ui.forms.widgets.AbstractHyperlink.handleMouseUp(AbstractHyperlink.java:316) at org.eclipse.ui.forms.widgets.AbstractHyperlink.access$2(AbstractHyperlink.java:300) at org.eclipse.ui.forms.widgets.AbstractHyperlink$4.handleEvent(AbstractHyperlink.java:119) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1495) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1519) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1504) at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1295) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3348) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2952) at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2389) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2353) at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2219) at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:466) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:289) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:461) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:106) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:153) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:363) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:176) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:504) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:443) at org.eclipse.equinox.launcher.Main.run(Main.java:1169) at org.eclipse.equinox.launcher.Main.main(Main.java:1144) I am using a Wizard with just one WizardPage. If I don't add my wizard page in Wizard.addPages(), then the error does not occur. If I comment out the code that constructs my wizard page, I still get the error. Hence it seems that the offending label might be in the banner region of the wizard.
I can't reproduce this on Windows.
(In reply to comment #1) > I can't reproduce this on Windows. > We only see this on the Mac.
I have a possible fix for this. The problem is the following: 1. When the user presses Finish or Cancel in a Wizard, then org.eclipse.jface.wizard.WizardDialog.hardClose() is called. This disposes of all wizards owned by the WizardDialog. The currentPage (owned by one of these wizards) then disposes of the wizard title bar image. 2. org.eclipse.help.ui.internal.views.HelpTray has a dispose method which adds a one-time listener, to re-set the wizard shell size to be the size it was without the HelpTray. 3. On the Mac, setting the shell size causes a redraw. Other platforms don't do this for some reason. 4. This redraw tries to draw the wizard title bar image, which has already been disposed, but the wizard label was never informed that the image was disposed. The solution: In org.eclipse.jface.wizard.WizardDialog#hardClose(), after disposing of the wizards, set the title image to null. The code would look like: private boolean hardClose() { // inform wizards for (int i = 0; i < createdWizards.size(); i++) { ... } // One of our wizards might have disposed of our title image, // so be sure to inform the title label. setTitleImage(null); return super.close(); }
I just tried to reproduce this in Eclipse 3.4M6, and it appears to be fixed. I looked at the source code for org.eclipse.jface.wizard.WizardDialog and org.eclipse.help.ui.internal.views.HelpTray, and I don't see any changes that would explain the fixed behavior. Did something else change with closing dialogs that would explain the fixed behavior? Regardless, if someone else can verify, then this bug could be closed out.
Verified on Mac OS X 10.5.2 using: Version: 3.4.0 Build id: I20080330-1350 Following the steps to reproduce simply causes the wizard to close as expected. No log messages or walkbacks are generated.
Created attachment 129400 [details] Patch for 3.4.2 - bug 202534 This bug has not yet been fixed - it is still an issue on Mac OS. The problem arises when the help tray re-sizes its host dialog shell to make the height of the shell more suitable. I have been able to reproduce this problem using the New Java Project wizard using the following modified instructions: 1. Run the JDT. 2. Launch a wizard: New > Project. 3. Choose "Java Project". 4. Enter enough data to enable the "Finish" button. 5. Re-size the dialog 6. Bring up the dialog's help using the "?" button in the lower left. 7. Repeat steps 5 & 6 as necessary until you see the height of the wizard grow when the Help Tray is added to the wizard 8. Press either of the "Finish" or "Cancel" buttons. I have tried the fix suggested by Chris Torrence in a previous post, and it appears to correct the problem. I have proposed Chris' fix as a patch.
Bug is still present (on Mac) - see Paul Adams' comment.
Moving to JFace. Please see suggested fix in comment 3. Thanks!
marking milestone 3.6 so we can fix this as suggested. However I'm downgrading severity from "critical" since this bug is close to two years old.
moving to M7, my plate runneth over with API freeze bugs for M6.
I verified that this is indeed a framework problem (vs. some mistake in the client/Java wizard code). I think the ideal fix would be that the wizard, when disposing its default image, would check to see if this was the image showing in the container dialog, and if so, set the dialog's image to null. However, IWizardContainer doesn't have API for setting the image, so the page would have to presume that the container might be a WizardDialog that is showing the image and cast it. The fix as proposed has the dialog presuming to know that an image could have been disposed by a page. Given that someone has to assume something, the proposed fix seems the most simple and pragmatic. Fixed in HEAD >20100414.
(In reply to comment #11) > Given that someone has to assume something, the proposed fix seems the most > simple and pragmatic. > Fixed in HEAD >20100414. Susan, I believe we need to iplog+ Paul's attachment 129400 [details]?
You are correct, Remy. Because the patch was out of date and I had tried several different solutions in the course of fixing it, I forgot to mark the original patch. I'll also include the attribution in the class header.
Comment on attachment 129400 [details] Patch for 3.4.2 - bug 202534 marking iplog. Updated class header committed to HEAD.
I can't verify this bug since I'm not on a Mac. Can someone who reported bug please verify the bug using the steps in comment 6? Also cc'ing Prakash since he has a Mac (Prakash, can you verify?)
Can't reproduce the bug using the steps in Comment # 6 Verified on I20100426-0852.
With this fix it is not possible to Call GWizardDialog.close() twice. The Method setTitleImage() should check if the dialog is already closed.
(In reply to comment #17) > With this fix it is not possible to Call GWizardDialog.close() twice. The > Method setTitleImage() should check if the dialog is already closed. If something is not working right, please open a new bug and reference this one. PW