// Modified by:
// Created: 01/02/97
// RCS-ID: $Id$
-// Copyright: (c) Julian Smart and Markus Holzem
+// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
bool wxDialog::IsModalShowing() const
{
- return wxModalDialogs.Find((wxDialog *)this) != NULL; // const_cast
+ return wxModalDialogs.Find(wxConstCast(this, wxDialog)) != NULL;
}
wxWindow *wxDialog::FindSuitableParent() const
m_windowDisabler = new wxWindowDisabler(this);
+ // 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
while ( IsModalShowing() )
{
wxTheApp->DoMessage();
}
+ wxIsInOnIdleFlag = wasInOnIdle;
+
// and restore focus
// Note that this code MUST NOT access the dialog object's data
// in case the object has been deleted (which will be the case
if ( show )
{
+ // dialogs don't get WM_SIZE message after creation unlike most (all?)
+ // other windows and so could start their life non laid out correctly
+ // if we didn't call Layout() from here
+ //
+ // NB: normally we should call it just the first time but doing it
+ // every time is simpler than keeping a flag
+ Layout();
+
// usually will result in TransferDataToWindow() being called
InitDialog();
}
// this will cause IsModalShowing() return FALSE and our local
// message loop will terminate
wxModalDialogs.DeleteObject(this);
+
+ // ensure that there is another message for this window so the
+ // ShowModal loop will exit and won't get stuck in GetMessage().
+ ::PostMessage(GetHwnd(), WM_NULL, 0, 0);
}
}
return TRUE;
}
+void wxDialog::Raise()
+{
+ ::SetForegroundWindow(GetHwnd());
+}
+
// a special version for Show(TRUE) for modal dialogs which returns return code
int wxDialog::ShowModal()
{