]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/dialog.mm
Override CanFocus because the wxWindow level test will check if the NSTextView's...
[wxWidgets.git] / src / osx / cocoa / dialog.mm
index b195a8633490fa9f3a58818929a6141bb5a4d3e4..d55449d1b517559bb9079616f5644483788c3826 100644 (file)
 
 extern wxList wxModalDialogs;
 
-void wxDialog::DoShowModal()
+void wxDialog::DoShowWindowModal()
+{   
+    wxTopLevelWindow* parent = static_cast<wxTopLevelWindow*>(wxGetTopLevelParent(GetParent()));
+    
+    wxASSERT_MSG(parent, "ShowWindowModal requires the dialog to have a parent.");
+    
+    NSWindow* parentWindow = parent->GetWXWindow();
+    NSWindow* theWindow = GetWXWindow();
+    
+    [NSApp beginSheet: theWindow
+            modalForWindow: parentWindow
+            modalDelegate: theWindow
+            didEndSelector: nil
+            contextInfo: nil];
+}
+
+void wxDialog::EndWindowModal()
 {
-    wxCHECK_RET( !IsModal(), wxT("DoShowModal() called twice") );
+    [NSApp endSheet: GetWXWindow()];
+    [GetWXWindow() orderOut:GetWXWindow()];
+}
 
-    wxModalDialogs.Append(this);
+void wxDialog::DoShowModal()
+{
+    // If the app hasn't started, flush the event queue
+    // If we don't do this, the Dock doesn't get the message that
+    // the app has started so will refuse to activate it.
+    NSApplication *theNSApp = [NSApplication sharedApplication];
+    if (![theNSApp isRunning])
+    {
+        wxMacAutoreleasePool pool;
+        while(NSEvent *event = [theNSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES])
+        {
+            [theNSApp sendEvent:event];
+        }
+    }
 
     SetFocus() ;
 /*
@@ -45,17 +76,33 @@ void wxDialog::DoShowModal()
     }
 */
     NSWindow* theWindow = GetWXWindow();
-    
+
     NSModalSession session = [NSApp beginModalSessionForWindow:theWindow];
-    int response = 0;
-    while (IsModal()) 
+    while (IsModal())
     {
         wxMacAutoreleasePool autoreleasepool;
         // we cannot break based on the return value, because nested
         // alerts might set this to stopped as well, so it would be
         // unsafe
         [NSApp runModalSession:session];
-        // TODO Idle
+
+        // break if ended, perform no further idle processing
+        if (!IsModal())
+            break;
+
+        // do some idle processing
+        bool needMore = false;
+        if (wxTheApp)
+        {
+            wxTheApp->ProcessPendingEvents();
+            needMore = wxTheApp->ProcessIdle();
+        }
+        
+        if (!needMore)
+        {
+            // no more idle processing wanted - block until the next event
+            [theNSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode:NSDefaultRunLoopMode dequeue:NO];
+        }
     }
     [NSApp endModalSession:session];