Index: windows/src/org/netbeans/core/windows/WindowSystemImpl.java =================================================================== RCS file: /shared/data/ccvs/repository/core/windows/src/org/netbeans/core/windows/WindowSystemImpl.java,v --- windows/src/org/netbeans/core/windows/WindowSystemImpl.java 31 Jul 2006 08:59:09 -0000 1.14 +++ windows/src/org/netbeans/core/windows/WindowSystemImpl.java 15 Jan 2007 15:40:28 -0000 @@ -23,6 +23,7 @@ import org.netbeans.core.NbTopManager; import org.netbeans.core.windows.persistence.PersistenceManager; +import org.netbeans.core.windows.services.DialogDisplayerImpl; /** @@ -59,6 +60,7 @@ public void show() { WindowManagerImpl.assertEventDispatchThread(); + DialogDisplayerImpl.runDelayed(); ShortcutAndMenuKeyEventProcessor.install(); WindowManagerImpl.getInstance().setVisible(true); } Index: windows/src/org/netbeans/core/windows/services/DialogDisplayerImpl.java =================================================================== RCS file: /shared/data/ccvs/repository/core/windows/src/org/netbeans/core/windows/services/DialogDisplayerImpl.java,v --- windows/src/org/netbeans/core/windows/services/DialogDisplayerImpl.java 20 Sep 2006 19:15:12 -0000 1.13 +++ windows/src/org/netbeans/core/windows/services/DialogDisplayerImpl.java 15 Jan 2007 15:40:28 -0000 @@ -21,16 +21,20 @@ package org.netbeans.core.windows.services; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import javax.swing.JDialog; +import java.awt.Component; +import java.awt.Dialog; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.KeyboardFocusManager; +import java.awt.Window; import org.openide.DialogDescriptor; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.util.Mutex; import org.openide.windows.WindowManager; - -import java.awt.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; // Extracted from core/NbTopManager. @@ -40,6 +44,9 @@ * @author Jesse Glick */ public class DialogDisplayerImpl extends DialogDisplayer { + /** delayed runnables */ + private static List run = Collections.synchronizedList(new ArrayList()); + /** non-null if we are running in unit test and should no show any dialogs */ private Object testResult; @@ -51,6 +58,20 @@ DialogDisplayerImpl (Object testResult) { this.testResult = testResult; } + + public static void runDelayed() { + List local = run; + run = null; + if (local == null) { + return; + } + + assert EventQueue.isDispatchThread(); + for (Runnable r : local) { + r.run(); + } + } + /** Creates new dialog. */ public Dialog createDialog (final DialogDescriptor d) { @@ -91,7 +112,11 @@ /** Notifies user by a dialog. * @param descriptor description that contains needed informations * @return the option that has been choosen in the notification. */ - public Object notify (final NotifyDescriptor descriptor) { + public Object notify (NotifyDescriptor descriptor) { + return notify(descriptor, false); + } + + private Object notify (final NotifyDescriptor descriptor, final boolean noParent) { class AWTQuery implements Runnable { public Object result; public boolean running; @@ -150,6 +175,10 @@ instanceof Frame ? (Frame) KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow() : WindowManager.getDefault().getMainWindow(); + + if (noParent) { + f = null; + } presenter = new NbPresenter(descriptor, f, true); } } @@ -204,4 +233,22 @@ } } + public void notifyLater(final NotifyDescriptor descriptor) { + class R implements Runnable { + public boolean noParent; + + public void run() { + DialogDisplayerImpl.this.notify(descriptor, noParent); + } + } + R r = new R(); + + List local = run; + if (local != null) { + r.noParent = true; + local.add(r); + } else { + EventQueue.invokeLater(r); + } + } } Index: windows/test/unit/src/org/netbeans/core/windows/services/DialogDisplayerImplTest.java =================================================================== RCS file: /shared/data/ccvs/repository/core/windows/test/unit/src/org/netbeans/core/windows/services/DialogDisplayerImplTest.java,v --- windows/test/unit/src/org/netbeans/core/windows/services/DialogDisplayerImplTest.java 1 Jul 2006 08:53:48 -0000 1.5 +++ windows/test/unit/src/org/netbeans/core/windows/services/DialogDisplayerImplTest.java 15 Jan 2007 15:40:28 -0000 @@ -226,4 +226,45 @@ } } + private void waitAWT() throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { public void run() { } }); + } + + public void testIfLasterWhenSplashShownThanWaitTillItFinished() throws Exception { + class MyObj extends Object { + public int called; + + public String toString() { + called = 1; + return "Kuk"; + } + } + MyObj obj = new MyObj(); + + NotifyDescriptor ownerDD = new NotifyDescriptor.Message(obj); + + + + DialogDisplayer.getDefault ().notifyLater(ownerDD); + waitAWT(); + assertEquals("No notify yet", 0, obj.called); + + postInAwtAndWaitOutsideAwt(new Runnable () { + public void run() { + DialogDisplayerImpl.runDelayed(); + } + }); + + + waitAWT(); + assertEquals("Now it is showing", 1, obj.called); + + SwingUtilities.invokeAndWait(new Runnable () { + public void run() { + DialogDisplayerImpl.runDelayed(); + } + }); + + } + }