]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/dialog_osx.cpp
Fix history in wxWebViewIE when using a custom file scheme.
[wxWidgets.git] / src / osx / dialog_osx.cpp
index 02bde473d33da25fcdd5e222a92a2f214d013031..e4088d6cfcc37dad4738e1045f581a6cad1e215e 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      Stefan Csomor
 // Modified by:
 // Created:     1998-01-01
 // Author:      Stefan Csomor
 // Modified by:
 // Created:     1998-01-01
-// RCS-ID:      $Id: dialog.cpp 54820 2008-07-29 20:04:11Z SC $
+// RCS-ID:      $Id$
 // Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 // Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -12,6 +12,7 @@
 #include "wx/wxprec.h"
 
 #include "wx/dialog.h"
 #include "wx/wxprec.h"
 
 #include "wx/dialog.h"
+#include "wx/evtloop.h"
 
 #ifndef WX_PRECOMP
     #include "wx/app.h"
 
 #ifndef WX_PRECOMP
     #include "wx/app.h"
 
 #include "wx/osx/private.h"
 
 
 #include "wx/osx/private.h"
 
+static int s_openDialogs = 0;
+bool wxDialog::OSXHasModalDialogsOpen()
+{
+    return s_openDialogs > 0;
+}
 
 
-// Lists to keep track of windows, so we can disable/enable them
-// for modal dialogs
-
-wxList wxModalDialogs;
+void wxDialog::OSXBeginModalDialog()
+{
+    s_openDialogs++;
+}
 
 
-IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxTopLevelWindow)
+void wxDialog::OSXEndModalDialog()
+{
+    wxASSERT_MSG( s_openDialogs > 0, "incorrect internal modal dialog count");
+    s_openDialogs--;
+}
 
 void wxDialog::Init()
 {
     m_modality = wxDIALOG_MODALITY_NONE;
 
 void wxDialog::Init()
 {
     m_modality = wxDIALOG_MODALITY_NONE;
+    m_eventLoop = NULL;
 }
 
 bool wxDialog::Create( wxWindow *parent,
 }
 
 bool wxDialog::Create( wxWindow *parent,
@@ -88,7 +99,7 @@ bool wxDialog::Show(bool show)
             // nothing to do
             return false;
     }
             // nothing to do
             return false;
     }
-    else 
+    else
     {
         if ( !wxDialogBase::Show(show) )
             // nothing to do
     {
         if ( !wxDialogBase::Show(show) )
             // nothing to do
@@ -108,25 +119,32 @@ bool wxDialog::Show(bool show)
         {
             case wxDIALOG_MODALITY_WINDOW_MODAL:
                 EndWindowModal(); // OS X implementation method for cleanup
         {
             case wxDIALOG_MODALITY_WINDOW_MODAL:
                 EndWindowModal(); // OS X implementation method for cleanup
-                SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED  );        
+                SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED  );
                 break;
             default:
                 break;
         }
         m_modality = wxDIALOG_MODALITY_NONE;
     }
                 break;
             default:
                 break;
         }
         m_modality = wxDIALOG_MODALITY_NONE;
     }
-    
+
     return true;
 }
 
 // Replacement for Show(true) for modal dialogs - returns return code
 int wxDialog::ShowModal()
 {
     return true;
 }
 
 // Replacement for Show(true) for modal dialogs - returns return code
 int wxDialog::ShowModal()
 {
-    m_modality = wxDIALOG_MODALITY_WINDOW_MODAL;
-    
+    m_modality = wxDIALOG_MODALITY_APP_MODAL;
+
     Show();
 
     Show();
 
-    DoShowModal();
+    wxModalEventLoop modalLoop(this);
+    m_eventLoop = &modalLoop;
+
+    wxDialog::OSXBeginModalDialog();
+    modalLoop.Run();
+    wxDialog::OSXEndModalDialog();
+
+    m_eventLoop = NULL;
 
     return GetReturnCode();
 }
 
     return GetReturnCode();
 }
@@ -134,9 +152,9 @@ int wxDialog::ShowModal()
 void wxDialog::ShowWindowModal()
 {
     m_modality = wxDIALOG_MODALITY_WINDOW_MODAL;
 void wxDialog::ShowWindowModal()
 {
     m_modality = wxDIALOG_MODALITY_WINDOW_MODAL;
-    
+
     Show();
     Show();
-    
+
     DoShowWindowModal();
 }
 
     DoShowWindowModal();
 }
 
@@ -149,6 +167,9 @@ wxDialogModality wxDialog::GetModality() const
 //     dialogs and should work for both of them
 void wxDialog::EndModal(int retCode)
 {
 //     dialogs and should work for both of them
 void wxDialog::EndModal(int retCode)
 {
+    if ( m_eventLoop )
+        m_eventLoop->Exit(retCode);
+
     SetReturnCode(retCode);
     Show(false);
 }
     SetReturnCode(retCode);
     Show(false);
 }