// 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
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#include "wx/dialog.h"
+#include "wx/evtloop.h"
#ifndef WX_PRECOMP
#include "wx/app.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
+void wxDialog::OSXBeginModalDialog()
+{
+ s_openDialogs++;
+}
+
+void wxDialog::OSXEndModalDialog()
+{
+ wxASSERT_MSG( s_openDialogs > 0, "incorrect internal modal dialog count");
+ s_openDialogs--;
+}
-wxList wxModalDialogs;
IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxTopLevelWindow)
void wxDialog::Init()
{
m_modality = wxDIALOG_MODALITY_NONE;
+ m_eventLoop = NULL;
}
bool wxDialog::Create( wxWindow *parent,
// nothing to do
return false;
}
- else
+ else
{
if ( !wxDialogBase::Show(show) )
// nothing to do
{
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;
}
-
+
return true;
}
int wxDialog::ShowModal()
{
m_modality = wxDIALOG_MODALITY_APP_MODAL;
-
+
Show();
- DoShowModal();
+ wxModalEventLoop modalLoop(this);
+ m_eventLoop = &modalLoop;
+
+ wxDialog::OSXBeginModalDialog();
+ modalLoop.Run();
+ wxDialog::OSXEndModalDialog();
+
+ m_eventLoop = NULL;
return GetReturnCode();
}
void wxDialog::ShowWindowModal()
{
m_modality = wxDIALOG_MODALITY_WINDOW_MODAL;
-
+
Show();
-
+
DoShowWindowModal();
}
// dialogs and should work for both of them
void wxDialog::EndModal(int retCode)
{
+ if ( m_eventLoop )
+ m_eventLoop->Exit(retCode);
+
SetReturnCode(retCode);
Show(false);
}