remove wxMSW-specific FindSuitableParent() and use GetParentForModalDialog() everywhe...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 9 May 2009 12:26:15 +0000 (12:26 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 9 May 2009 12:26:15 +0000 (12:26 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60559 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dialog.h
include/wx/msw/dialog.h
include/wx/os2/dialog.h
include/wx/palmos/dialog.h
src/common/dlgcmn.cpp
src/gtk/dialog.cpp
src/msw/dialog.cpp
src/msw/msgdlg.cpp
src/msw/toplevel.cpp
src/os2/dialog.cpp
src/palmos/dialog.cpp

index 36bcb643db7cb51d75d918faffc07e4aa94d74ba..4951bc72b26644d15cd9b1fa811895c0792533ce 100644 (file)
@@ -91,7 +91,7 @@ public:
     int GetEscapeId() const { return m_escapeId; }
 
     // Returns the parent to use for modal dialogs if the user did not specify it
-    // explicitly
+    // explicitly. If parent argument is NULL, use GetParent() by default.
     wxWindow *GetParentForModalDialog(wxWindow *parent = NULL) const;
 
 #if wxUSE_STATTEXT // && wxUSE_TEXTCTRL
@@ -211,6 +211,10 @@ private:
     // common part of all ctors
     void Init();
 
+    // helper of GetParentForModalDialog(): returns the passed in window if it
+    // can be used as our parent or NULL if it can't
+    wxWindow *CheckIfCanBeUsedAsParent(wxWindow *parent) const;
+
     // handle Esc key presses
     void OnCharHook(wxKeyEvent& event);
 
index 51edf8c0716b3f150881da92a92cd90244129b2e..e0274ff14a5b9bd49961eb93d2a60b268aa25210 100644 (file)
@@ -108,12 +108,6 @@ public:
     WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
 
 protected:
-    // find the window to use as parent for this dialog if none has been
-    // specified explicitly by the user
-    //
-    // may return NULL
-    wxWindow *FindSuitableParent() const;
-
     // common part of all ctors
     void Init();
 
index 5555122df42fb2070d9bacfb55c1bcde59b2f9d4..c4497ef4660599426d0d15fe7919b6732eae8a51 100644 (file)
@@ -95,14 +95,6 @@ public:
 #endif // WXWIN_COMPATIBILITY_2_6
 
 protected:
-    //
-    // find the window to use as parent for this dialog if none has been
-    // specified explicitly by the user
-    //
-    // may return NULL
-    //
-    wxWindow *FindSuitableParent() const;
-
     //
     // Common part of all ctors
     //
index e8f66f58c08c005f3dae49276516f91920e1deea..717c30132d5efb1ff6ef50fdaf042760d14fb516 100644 (file)
@@ -64,12 +64,6 @@ public:
     virtual void Raise();
 
 protected:
-    // find the window to use as parent for this dialog if none has been
-    // specified explicitly by the user
-    //
-    // may return NULL
-    wxWindow *FindSuitableParent() const;
-
     // common part of all ctors
     void Init();
 
index eb33b068ee633e469f911b93aedc7e3f17580b19..18288235be8c8d342596e2a9269b357d355c55eb 100644 (file)
@@ -78,32 +78,63 @@ void wxDialogBase::Init()
     SetExtraStyle(GetExtraStyle() | wxWS_EX_BLOCK_EVENTS);
 }
 
-// helper of GetParentForModalDialog()
-static bool CanBeUsedAsParent(wxWindow *parent)
+wxWindow *wxDialogBase::CheckIfCanBeUsedAsParent(wxWindow *parent) const
 {
     extern WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete;
 
-    return !parent->HasExtraStyle(wxWS_EX_TRANSIENT) &&
-                parent->IsShownOnScreen() &&
-                    !wxPendingDelete.Member(parent) &&
-                        !parent->IsBeingDeleted();
+    if ( wxPendingDelete.Member(parent) || parent->IsBeingDeleted() )
+    {
+        // this window is being deleted and we shouldn't create any children
+        // under it
+        return NULL;
+    }
+
+    if ( parent->HasExtraStyle(wxWS_EX_TRANSIENT) )
+    {
+        // this window is not being deleted yet but it's going to disappear
+        // soon so still don't parent this window under it
+        return NULL;
+    }
+
+    if ( !parent->IsShownOnScreen() )
+    {
+        // using hidden parent won't work correctly neither
+        return NULL;
+    }
+
+    if ( parent == this )
+    {
+        // not sure if this can really happen but it doesn't hurt to guard
+        // against this clearly invalid situation
+        return NULL;
+    }
+
+    return parent;
 }
 
 wxWindow *wxDialogBase::GetParentForModalDialog(wxWindow *parent) const
 {
     // creating a parent-less modal dialog will result (under e.g. wxGTK2)
-    // in an unfocused dialog, so try to find a valid parent for it:
+    // in an unfocused dialog, so try to find a valid parent for it unless we
+    // were explicitly asked not to
+    if ( HasFlag(wxDIALOG_NO_PARENT) )
+        return NULL;
+
+    // by default, use the parent specified in the ctor
+    if ( !parent )
+        parent = GetParent();
+
+    // first try the given parent
     if ( parent )
-        parent = wxGetTopLevelParent(parent);
+        parent = CheckIfCanBeUsedAsParent(wxGetTopLevelParent(parent));
 
-    if ( !parent || !CanBeUsedAsParent(parent) )
-        parent = wxTheApp->GetTopWindow();
+    // then the currently active window
+    if ( !parent )
+        parent = CheckIfCanBeUsedAsParent(wxGetActiveWindow());
 
-    if ( parent && !CanBeUsedAsParent(parent) )
-    {
-        // can't use this one, it's going to disappear
-        parent = NULL;
-    }
+    // and finally the application main window
+    if ( !parent )
+        parent = CheckIfCanBeUsedAsParent(wxTheApp->GetTopWindow());
 
     return parent;
 }
index 2a2e83a0e00fd90db3079fe7ea92588dbdc8200a..0d05469ff809c0b3a4ba0f12fd1d2b86bf24efad 100644 (file)
@@ -111,16 +111,11 @@ int wxDialog::ShowModal()
     if ( win )
         win->GTKReleaseMouseAndNotify();
 
-    // use the apps top level window as parent if none given unless explicitly
-    // forbidden
-    if ( !GetParent() && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
+    wxWindow * const parent = GetParentForModalDialog();
+    if ( parent )
     {
-        wxWindow * const parent = GetParentForModalDialog();
-        if ( parent && parent != this )
-        {
-            gtk_window_set_transient_for( GTK_WINDOW(m_widget),
-                                          GTK_WINDOW(parent->m_widget) );
-        }
+        gtk_window_set_transient_for( GTK_WINDOW(m_widget),
+                                      GTK_WINDOW(parent->m_widget) );
     }
 
     wxBusyCursorSuspender cs; // temporarily suppress the busy cursor
index 49a1997784380c3db848623233f686ef7f5f6f8c..cc22686d7f202a4d398032e06d2bcaef9090591e 100644 (file)
@@ -208,28 +208,6 @@ wxDialog::~wxDialog()
 // showing the dialogs
 // ----------------------------------------------------------------------------
 
-wxWindow *wxDialog::FindSuitableParent() const
-{
-    // first try to use the currently active window
-    HWND hwndFg = ::GetForegroundWindow();
-    wxWindow *parent = hwndFg ? wxFindWinFromHandle((WXHWND)hwndFg)
-                              : NULL;
-    if ( !parent )
-    {
-        // next try the main app window
-        parent = wxTheApp->GetTopWindow();
-    }
-
-    // finally, check if the parent we found is really suitable
-    if ( !parent || parent == (wxWindow *)this || !parent->IsShown() )
-    {
-        // don't use this one
-        parent = NULL;
-    }
-
-    return parent;
-}
-
 bool wxDialog::Show(bool show)
 {
     if ( show == IsShown() )
index fcc722cb35952f1825ac2afe27d961a829bd65b2..6166b125a45b39c73ba59ba3ac0a7d4543cc5668 100644 (file)
@@ -442,7 +442,7 @@ int wxMessageDialog::ShowModal()
 
     // use the top level window as parent if none specified
     if ( !m_parent )
-        m_parent = FindSuitableParent();
+        m_parent = GetParentForModalDialog();
     HWND hWnd = m_parent ? GetHwndOf(m_parent) : NULL;
 
     // translate wx style in MSW
index 41c488a6254428dd0fdd5c2d7fa82c262ba1720b..a803576060e38d2117e6d896666b0acba61213ae 100644 (file)
@@ -373,29 +373,9 @@ bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate,
     // no dialogs support under MicroWin yet
     return CreateFrame(title, pos, size);
 #else // !__WXMICROWIN__
-    wxWindow *parent = GetParent();
-
-    // for the dialogs without wxDIALOG_NO_PARENT style, use the top level
-    // app window as parent - this avoids creating modal dialogs without
-    // parent
-    if ( !parent && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
-    {
-        parent = wxTheApp->GetTopWindow();
-
-        if ( parent )
-        {
-            // don't use transient windows as parents, this is dangerous as it
-            // can lead to a crash if the parent is destroyed before the child
-            //
-            // also don't use the window which is currently hidden as then the
-            // dialog would be hidden as well
-            if ( (parent->GetExtraStyle() & wxWS_EX_TRANSIENT) ||
-                    !parent->IsShown() )
-            {
-                parent = NULL;
-            }
-        }
-    }
+    // static cast is valid as we're only ever called for dialogs
+    wxWindow * const 
+        parent = static_cast<wxDialog *>(this)->GetParentForModalDialog();
 
     m_hWnd = (WXHWND)::CreateDialogIndirect
                        (
index d7da58b4687b8107b98a6a846cb8ff11418845d4..51152300491fbd8068633ef14aec5a59a8cb9bb8 100644 (file)
@@ -166,28 +166,6 @@ bool wxDialog::IsModalShowing() const
 
 #endif // WXWIN_COMPATIBILITY_2_6
 
-wxWindow *wxDialog::FindSuitableParent() const
-{
-    // first try to use the currently active window
-    HWND hwndFg = ::WinQueryActiveWindow(HWND_DESKTOP);
-    wxWindow *parent = hwndFg ? wxFindWinFromHandle((WXHWND)hwndFg)
-                              : NULL;
-    if ( !parent )
-    {
-        // next try the main app window
-        parent = wxTheApp->GetTopWindow();
-    }
-
-    // finally, check if the parent we found is really suitable
-    if ( !parent || parent == (wxWindow *)this || !parent->IsShown() )
-    {
-        // don't use this one
-        parent = NULL;
-    }
-
-    return parent;
-}
-
 bool wxDialog::Show( bool bShow )
 {
     if ( bShow == IsShown() )
index 32989e6eef7546ab125d4fc938e86da7c2b238ee..4358cfef5f4f56fc7400af2e89bd54580e67b079 100644 (file)
@@ -161,11 +161,6 @@ wxDialog::~wxDialog()
 // showing the dialogs
 // ----------------------------------------------------------------------------
 
-wxWindow *wxDialog::FindSuitableParent() const
-{
-    return NULL;
-}
-
 bool wxDialog::Show(bool show)
 {
     if (show && CanDoLayoutAdaptation())