]> git.saurik.com Git - wxWidgets.git/blobdiff - src/cocoa/dialog.mm
readability cleanup
[wxWidgets.git] / src / cocoa / dialog.mm
index 9a41cdaaaca64814c0b46baf9564c7d566ddd24b..d18483cc868d4b17b052ff37b756fde1f448a4bf 100644 (file)
@@ -4,9 +4,9 @@
 // Author:      David Elliott
 // Modified by:
 // Created:     2002/12/15
-// RCS-ID:      $Id: 
+// RCS-ID:      $Id:
 // Copyright:   2002 David Elliott
-// Licence:    wxWindows license
+// Licence:     wxWidgets licence
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/wxprec.h"
@@ -42,7 +42,8 @@ WX_IMPLEMENT_COCOA_OWNER(wxDialog,NSPanel,NSWindow,NSWindow)
 
 void wxDialog::Init()
 {
-    SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
+    m_isModal = false;
+    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
 }
 
 bool wxDialog::Create(wxWindow *parent, wxWindowID winid,
@@ -96,82 +97,90 @@ void wxDialog::CocoaDelegate_windowWillClose(void)
 
 void wxDialog::SetModal(bool flag)
 {
-    if ( flag )
-    {
-        wxModelessWindows.DeleteObject(this);
-        m_windowStyle |= wxDIALOG_MODAL ;
-    }
-    else
-    {
-        m_windowStyle &= ~wxDIALOG_MODAL ;
-        wxModelessWindows.Append(this);
-    }
+    wxFAIL_MSG( wxT("wxDialog:SetModal obsolete now") );
 }
 
 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);
-            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];
-            wxLogTrace(wxTRACE_COCOA,wxT("runModal END"));
+        wxAutoNSAutoreleasePool pool;
+        InitDialog();
+        if(IsModal())
+        {   // ShowModal() will show the dialog
+            m_isShown = true;
+            return true;
         }
-        else
-        {
+    }
+    else
+    {
+        if(IsModal())
+        {   // this doesn't hide the dialog, base class Show(false) does.
             wxLogTrace(wxTRACE_COCOA,wxT("abortModal"));
             [wxTheApp->GetNSApplication() abortModal];
-            [m_cocoaNSWindow orderOut:m_cocoaNSWindow];
             wxModalDialogs.DeleteObject(this);
+            m_isModal = false;
         }
     }
-    else
-        return wxTopLevelWindow::Show(show);
-    return true;
+    return wxTopLevelWindow::Show(show);
 }
 
-// Replacement for Show(TRUE) for modal dialogs - returns return code
+// Shows the dialog and begins a modal event loop.  When the event loop
+// is stopped (via EndModal()) it returns the exit code.
 int wxDialog::ShowModal()
 {
-    if(!IsModal())
-        SetModal(true);
+    wxCHECK_MSG(!IsModal(),GetReturnCode(),wxT("wxDialog::ShowModal called within its own modal loop"));
+
+    // Show(true) will set m_isShown = true
+    m_isShown = false;
+    m_isModal = true;
+    wxModalDialogs.Append(this);
+
+    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])
+    {
+        // We should only do a few iterations so one pool should be okay
+        wxAutoNSAutoreleasePool pool;
+        while(NSEvent *event = [theNSApp
+                    nextEventMatchingMask:NSAnyEventMask
+                    untilDate:[NSDate distantPast]
+                    inMode:NSDefaultRunLoopMode
+                    dequeue: YES])
+        {
+            [theNSApp sendEvent: event];
+        }
+    }
+
     Show(true);
+    do {
+        wxAutoNSAutoreleasePool pool;
+        [wxTheApp->GetNSApplication() runModalForWindow:m_cocoaNSWindow];
+    } while(0);
+    wxLogTrace(wxTRACE_COCOA,wxT("runModal END"));
+
     return GetReturnCode();
 }
 
-// EndModal will work for any dialog
 void wxDialog::EndModal(int retCode)
 {
+    wxASSERT_MSG(IsModal(), wxT("EndModal() should only be used within ShowModal()"));
     SetReturnCode(retCode);
     Show(false);
 }
 
-bool wxDialog::IsModal() const
+void wxDialog::EndDialog(int retCode)
 {
-    return (GetWindowStyleFlag() & wxDIALOG_MODAL);
+    if(IsModal())
+        EndModal(retCode);
+    else
+        Show(false);
 }
 
 void wxDialog::OnCloseWindow(wxCloseEvent& event)
@@ -193,15 +202,15 @@ void wxDialog::OnCloseWindow(wxCloseEvent& event)
     event.Veto();
 
     static wxList closing;
-    
+
     if ( closing.Member(this) )
     {
         wxLogDebug(wxT("WARNING: Attempting to recursively call Close for dialog"));
         return;
     }
-    
+
     closing.Append(this);
-    
+
     wxLogTrace(wxTRACE_COCOA,wxT("Sending Cancel Event"));
     wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
     cancelEvent.SetEventObject( this );
@@ -215,20 +224,20 @@ void wxDialog::OnOK(wxCommandEvent& event)
 {
     if ( Validate() && TransferDataFromWindow() )
     {
-        EndModal(wxID_OK);
+        EndDialog(wxID_OK);
     }
 }
 
 void wxDialog::OnApply(wxCommandEvent& event)
 {
-       if (Validate())
-               TransferDataFromWindow();
-       // TODO probably need to disable the Apply button until things change again
+    if (Validate())
+        TransferDataFromWindow();
+    // TODO probably need to disable the Apply button until things change again
 }
 
 void wxDialog::OnCancel(wxCommandEvent& event)
 {
     wxLogTrace(wxTRACE_COCOA,wxT("Cancelled!"));
-    EndModal(wxID_CANCEL);
+    EndDialog(wxID_CANCEL);
 }