]> git.saurik.com Git - wxWidgets.git/blobdiff - src/cocoa/dialog.mm
concentrating content and structure region calculations
[wxWidgets.git] / src / cocoa / dialog.mm
index 59cf2fb0a2103642e2310115c207a39fe3486133..eede94cdfc59fcb683f7af5f720e99241c7af9a1 100644 (file)
@@ -9,13 +9,21 @@
 // Licence:    wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
-#include "wx/dialog.h"
-#include "wx/app.h"
-#include "wx/settings.h"
-#include "wx/log.h"
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
+    #include "wx/log.h"
+    #include "wx/app.h"
+    #include "wx/dialog.h"
+    #include "wx/settings.h"
+#endif //WX_PRECOMP
+
+#include "wx/cocoa/autorelease.h"
+#include "wx/cocoa/string.h"
 
 #import <AppKit/NSPanel.h>
 #import <AppKit/NSApplication.h>
+#import <AppKit/NSEvent.h>
+#import <Foundation/NSRunLoop.h>
 
 // Lists to keep track of windows, so we can disable/enable them
 // for modal dialogs
@@ -44,6 +52,7 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID winid,
            long style,
            const wxString& name)
 {
+    wxAutoNSAutoreleasePool pool;
     wxTopLevelWindows.Append(this);
 
     if(!CreateBase(parent,winid,pos,size,style,wxDefaultValidator,name))
@@ -66,24 +75,23 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID winid,
     // Because we do not release on close, the following release matches the
     // above alloc and thus the retain count will be 1.
     [m_cocoaNSWindow release];
-    wxLogDebug("wxDialog m_cocoaNSWindow retainCount=%d",[m_cocoaNSWindow retainCount]);
+    wxLogTrace(wxTRACE_COCOA_RetainRelease,wxT("wxDialog m_cocoaNSWindow retainCount=%d"),[m_cocoaNSWindow retainCount]);
+    [m_cocoaNSWindow setTitle:wxNSStringWithWxString(title)];
+    [m_cocoaNSWindow setHidesOnDeactivate:NO];
 
     return true;
 }
 
 wxDialog::~wxDialog()
 {
-    wxLogDebug("Destroying");
-    // setReleasedWhenClosed: NO
-    [m_cocoaNSWindow close];
-    SetNSPanel(NULL);
+    DisassociateNSPanel(GetNSPanel());
 }
 
-void wxDialog::Cocoa_close(void)
+void wxDialog::CocoaDelegate_windowWillClose(void)
 {
     m_closed = true;
     /* Actually, this isn't true anymore */
-    wxLogDebug("Woah: Dialogs are not generally closed");
+    wxLogTrace(wxTRACE_COCOA,wxT("Woah: Dialogs are not generally closed"));
 }
 
 void wxDialog::SetModal(bool flag)
@@ -102,24 +110,45 @@ void wxDialog::SetModal(bool flag)
 
 bool wxDialog::Show(bool show)
 {
+    if(m_isShown == show)
+        return false;
     if(show)
         InitDialog();
     if(IsModal())
     {
+        m_isShown = show;
         if(show)
         {
+            wxAutoNSAutoreleasePool pool;
             wxModalDialogs.Append(this);
-            wxLogDebug("runModal");
+            wxLogTrace(wxTRACE_COCOA,wxT("runModal"));
+            NSApplication *theNSApp = wxTheApp->GetNSApplication();
+            // 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.
+            if(![theNSApp isRunning])
+            {
+                while(NSEvent *event = [theNSApp
+                            nextEventMatchingMask:NSAnyEventMask
+                            untilDate:[NSDate distantPast]
+                            inMode:NSDefaultRunLoopMode
+                            dequeue: YES])
+                {
+                    [theNSApp sendEvent: event];
+                }
+            }
             [wxTheApp->GetNSApplication() runModalForWindow:m_cocoaNSWindow];
-            wxLogDebug("runModal END");
+            wxLogTrace(wxTRACE_COCOA,wxT("runModal END"));
         }
         else
         {
-            wxLogDebug("abortModal");
+            wxLogTrace(wxTRACE_COCOA,wxT("abortModal"));
             [wxTheApp->GetNSApplication() abortModal];
             wxModalDialogs.DeleteObject(this);
         }
     }
+    else
+        return wxTopLevelWindow::Show(show);
     return true;
 }
 
@@ -166,13 +195,13 @@ void wxDialog::OnCloseWindow(wxCloseEvent& event)
     
     if ( closing.Member(this) )
     {
-        wxLogDebug("WARNING: Attempting to recursively call Close for dialog");
+        wxLogDebug(wxT("WARNING: Attempting to recursively call Close for dialog"));
         return;
     }
     
     closing.Append(this);
     
-    wxLogDebug("Sending Cancel Event");
+    wxLogTrace(wxTRACE_COCOA,wxT("Sending Cancel Event"));
     wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
     cancelEvent.SetEventObject( this );
     GetEventHandler()->ProcessEvent(cancelEvent); // This may close the dialog
@@ -198,7 +227,7 @@ void wxDialog::OnApply(wxCommandEvent& event)
 
 void wxDialog::OnCancel(wxCommandEvent& event)
 {
-    wxLogDebug("Cancelled!");
+    wxLogTrace(wxTRACE_COCOA,wxT("Cancelled!"));
     EndModal(wxID_CANCEL);
 }