don't use GetParent() in GetParentForModalDialog() itself as it can be called before m_parent is initialized

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60573 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-05-09 16:55:37 +00:00
parent 465eba1483
commit 4f73f25cc8
4 changed files with 14 additions and 11 deletions

View File

@@ -90,8 +90,11 @@ public:
void SetEscapeId(int escapeId); void SetEscapeId(int escapeId);
int GetEscapeId() const { return m_escapeId; } int GetEscapeId() const { return m_escapeId; }
// Returns the parent to use for modal dialogs if the user did not specify it // Find the parent to use for modal dialog: try to use the specified parent
// explicitly. If parent argument is NULL, use GetParent() by default. // but fall back to the current active window or main application window as
// last resort if it is unsuitable.
//
// This function always returns a valid top level window or NULL.
wxWindow *GetParentForModalDialog(wxWindow *parent = NULL) const; wxWindow *GetParentForModalDialog(wxWindow *parent = NULL) const;
#if wxUSE_STATTEXT // && wxUSE_TEXTCTRL #if wxUSE_STATTEXT // && wxUSE_TEXTCTRL

View File

@@ -80,8 +80,10 @@ void wxDialogBase::Init()
wxWindow *wxDialogBase::CheckIfCanBeUsedAsParent(wxWindow *parent) const wxWindow *wxDialogBase::CheckIfCanBeUsedAsParent(wxWindow *parent) const
{ {
extern WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete; if ( !parent )
return NULL;
extern WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete;
if ( wxPendingDelete.Member(parent) || parent->IsBeingDeleted() ) if ( wxPendingDelete.Member(parent) || parent->IsBeingDeleted() )
{ {
// this window is being deleted and we shouldn't create any children // this window is being deleted and we shouldn't create any children
@@ -120,17 +122,14 @@ wxWindow *wxDialogBase::GetParentForModalDialog(wxWindow *parent) const
if ( HasFlag(wxDIALOG_NO_PARENT) ) if ( HasFlag(wxDIALOG_NO_PARENT) )
return NULL; return NULL;
// by default, use the parent specified in the ctor
if ( !parent )
parent = GetParent();
// first try the given parent // first try the given parent
if ( parent ) if ( parent )
parent = CheckIfCanBeUsedAsParent(wxGetTopLevelParent(parent)); parent = CheckIfCanBeUsedAsParent(wxGetTopLevelParent(parent));
// then the currently active window // then the currently active window
if ( !parent ) if ( !parent )
parent = CheckIfCanBeUsedAsParent(wxGetActiveWindow()); parent = CheckIfCanBeUsedAsParent(
wxGetTopLevelParent(wxGetActiveWindow()));
// and finally the application main window // and finally the application main window
if ( !parent ) if ( !parent )

View File

@@ -111,7 +111,7 @@ int wxDialog::ShowModal()
if ( win ) if ( win )
win->GTKReleaseMouseAndNotify(); win->GTKReleaseMouseAndNotify();
wxWindow * const parent = GetParentForModalDialog(); wxWindow * const parent = GetParentForModalDialog(GetParent());
if ( parent ) if ( parent )
{ {
gtk_window_set_transient_for( GTK_WINDOW(m_widget), gtk_window_set_transient_for( GTK_WINDOW(m_widget),

View File

@@ -375,7 +375,8 @@ bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate,
#else // !__WXMICROWIN__ #else // !__WXMICROWIN__
// static cast is valid as we're only ever called for dialogs // static cast is valid as we're only ever called for dialogs
wxWindow * const wxWindow * const
parent = static_cast<wxDialog *>(this)->GetParentForModalDialog(); parent = static_cast<wxDialog *>(this)->
GetParentForModalDialog(GetParent());
m_hWnd = (WXHWND)::CreateDialogIndirect m_hWnd = (WXHWND)::CreateDialogIndirect
( (