use wxModalEvtLoop, made more code exception safe

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23648 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-09-17 23:34:07 +00:00
parent 4300caa7a6
commit 8c7f5f031b

View File

@@ -41,6 +41,7 @@
#include "wx/msw/private.h" #include "wx/msw/private.h"
#include "wx/log.h" #include "wx/log.h"
#include "wx/evtloop.h" #include "wx/evtloop.h"
#include "wx/ptr_scpd.h"
#if wxUSE_COMMON_DIALOGS && !defined(__WXMICROWIN__) #if wxUSE_COMMON_DIALOGS && !defined(__WXMICROWIN__)
#include <commdlg.h> #include <commdlg.h>
@@ -135,38 +136,29 @@ END_EVENT_TABLE()
// wxDialogModalData // wxDialogModalData
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// this is simply a container for wxEventLoop and wxWindowDisabler which allows // this is simply a container for any data we need to implement modality which
// to have a single opaque pointer in wxDialog itself // allows us to avoid changing wxDialog each time the implementation changes
class wxDialogModalData class wxDialogModalData
{ {
public: public:
wxDialogModalData() { m_windowDisabler = NULL; } wxDialogModalData(wxDialog *dialog) : m_evtLoop(dialog) { }
void RunLoop(wxDialog *dialog) void RunLoop()
{ {
m_windowDisabler = new wxWindowDisabler(dialog);
m_evtLoop.Run(); m_evtLoop.Run();
} }
void ExitLoop() void ExitLoop()
{ {
delete m_windowDisabler;
m_windowDisabler = NULL;
m_evtLoop.Exit(); m_evtLoop.Exit();
} }
~wxDialogModalData()
{
wxASSERT_MSG( !m_windowDisabler, _T("forgot to call ExitLoop?") );
}
private: private:
wxEventLoop m_evtLoop; wxModalEventLoop m_evtLoop;
wxWindowDisabler *m_windowDisabler;
}; };
wxDEFINE_TIED_SCOPED_PTR_TYPE(wxDialogModalData);
// ============================================================================ // ============================================================================
// implementation // implementation
// ============================================================================ // ============================================================================
@@ -325,19 +317,12 @@ void wxDialog::DoShowModal()
hwndOldFocus = GetHwndOf(parent); hwndOldFocus = GetHwndOf(parent);
} }
// before entering the modal loop, reset the "is in OnIdle()" flag (see
// comment in app.cpp)
extern bool wxIsInOnIdleFlag;
bool wasInOnIdle = wxIsInOnIdleFlag;
wxIsInOnIdleFlag = FALSE;
// enter the modal loop // enter the modal loop
m_modalData = new wxDialogModalData; {
m_modalData->RunLoop(this); wxDialogModalDataTiedPtr modalData(&m_modalData,
delete m_modalData; new wxDialogModalData(this));
m_modalData = NULL; modalData->RunLoop();
}
wxIsInOnIdleFlag = wasInOnIdle;
// and restore focus // and restore focus
// Note that this code MUST NOT access the dialog object's data // Note that this code MUST NOT access the dialog object's data