X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9482c64466359ec7cfd201bebc3399ac4a56b4e6..eea4d01c65f9b29baa1193db762b4c6b8144af24:/src/osx/dialog_osx.cpp?ds=sidebyside diff --git a/src/osx/dialog_osx.cpp b/src/osx/dialog_osx.cpp index df4e2a4cc7..e4088d6cfc 100644 --- a/src/osx/dialog_osx.cpp +++ b/src/osx/dialog_osx.cpp @@ -4,7 +4,7 @@ // 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 ///////////////////////////////////////////////////////////////////////////// @@ -12,6 +12,7 @@ #include "wx/wxprec.h" #include "wx/dialog.h" +#include "wx/evtloop.h" #ifndef WX_PRECOMP #include "wx/app.h" @@ -22,17 +23,27 @@ #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_isModalStyle = false; + m_modality = wxDIALOG_MODALITY_NONE; + m_eventLoop = NULL; } bool wxDialog::Create( wxWindow *parent, @@ -57,18 +68,6 @@ bool wxDialog::Create( wxWindow *parent, return true; } -void wxDialog::SetModal( bool flag ) -{ - if ( flag ) - { - m_isModalStyle = true; - } - else - { - m_isModalStyle = false; - } -} - wxDialog::~wxDialog() { SendDestroyEvent(); @@ -89,16 +88,23 @@ bool wxDialog::IsEscapeKey(const wxKeyEvent& event) bool wxDialog::IsModal() const { - return wxModalDialogs.Find((wxDialog *)this) != NULL; // const_cast - // return m_isModalStyle; + return m_modality != wxDIALOG_MODALITY_NONE; } - bool wxDialog::Show(bool show) { - if ( !wxDialogBase::Show(show) ) - // nothing to do - return false; + if ( m_modality == wxDIALOG_MODALITY_WINDOW_MODAL ) + { + if ( !wxWindow::Show(show) ) + // nothing to do + return false; + } + else + { + if ( !wxDialogBase::Show(show) ) + // nothing to do + return false; + } if (show && CanDoLayoutAdaptation()) DoLayoutAdaptation(); @@ -107,18 +113,18 @@ bool wxDialog::Show(bool show) // usually will result in TransferDataToWindow() being called InitDialog(); - if ( m_isModalStyle ) + if ( !show ) { - if ( show ) + switch( m_modality ) { - DoShowModal(); - } - else // end of modal dialog - { - // this will cause IsModalShowing() return false and our local - // message loop will terminate - wxModalDialogs.DeleteObject(this); + case wxDIALOG_MODALITY_WINDOW_MODAL: + EndWindowModal(); // OS X implementation method for cleanup + SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED ); + break; + default: + break; } + m_modality = wxDIALOG_MODALITY_NONE; } return true; @@ -127,28 +133,44 @@ bool wxDialog::Show(bool show) // Replacement for Show(true) for modal dialogs - returns return code int wxDialog::ShowModal() { - if ( !m_isModalStyle ) - SetModal(true); + m_modality = wxDIALOG_MODALITY_APP_MODAL; - if ( IsShown() ) - DoShowModal(); - else - Show(true); + Show(); + + 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(); +} + +wxDialogModality wxDialog::GetModality() const +{ + return m_modality; +} + // NB: this function (surprisingly) may be called for both modal and modeless // dialogs and should work for both of them void wxDialog::EndModal(int retCode) { + if ( m_eventLoop ) + m_eventLoop->Exit(retCode); + SetReturnCode(retCode); Show(false); - SetModal(false); - if (GetModality() == wxDIALOG_MODALITY_WINDOW_MODAL) - { - EndWindowModal(); // OS X implementation method for cleanup - SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED ); - } }