]> git.saurik.com Git - wxWidgets.git/commitdiff
fixed recent modeless dialog breakage caused by removing wxDIALOG_MODAL (wxModelessWi...
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 21 Apr 2004 12:45:16 +0000 (12:45 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 21 Apr 2004 12:45:16 +0000 (12:45 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26896 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/dialog.h
include/wx/msw/toplevel.h
src/msw/dialog.cpp
src/msw/frame.cpp
src/msw/mdi.cpp

index 56135edeb1f064ecc409d636f99eaff7fc32e7eb..bbe72cdf874126fc2d80b66f406414a7e318998c 100644 (file)
@@ -28,21 +28,7 @@ class WXDLLEXPORT wxDialog : public wxDialogBase
 public:
     wxDialog() { Init(); }
 
-    // Constructor with a modal flag, but no window id - the old convention
-    wxDialog(wxWindow *parent,
-             const wxString& title, bool modal,
-             int x = -1, int y= -1, int width = 500, int height = 500,
-             long style = wxDEFAULT_DIALOG_STYLE,
-             const wxString& name = wxDialogNameStr)
-    {
-        Init();
-
-        long modalStyle = modal ? wxDIALOG_MODAL : wxDIALOG_MODELESS ;
-        Create(parent, -1, title, wxPoint(x, y), wxSize(width, height),
-               style | modalStyle, name);
-    }
-
-    // Constructor with no modal flag - the new convention.
+    // full ctor
     wxDialog(wxWindow *parent, wxWindowID id,
              const wxString& title,
              const wxPoint& pos = wxDefaultPosition,
@@ -64,18 +50,15 @@ public:
 
     virtual ~wxDialog();
 
-    void SetModal(bool flag);
-    virtual bool IsModal() const;
+    // return true if we're showing the dialog modally
+    virtual bool IsModal() const { return m_modalData != NULL; }
 
-    // For now, same as Show(TRUE) but returns return code
+    // show the dialog modally and return the value passed to EndModal()
     virtual int ShowModal();
 
     // may be called to terminate the dialog with the given return code
     virtual void EndModal(int retCode);
 
-    // returns TRUE if we're in a modal loop
-    bool IsModalShowing() const;
-
     // implementation only from now on
     // -------------------------------
 
@@ -104,6 +87,22 @@ public:
                                 WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
 #endif // wxUSE_CTL3D
 
+    // obsolete methods
+    // ----------------
+
+    // use the other ctor
+    wxDEPRECATED( wxDialog(wxWindow *parent,
+             const wxString& title, bool modal,
+             int x = -1, int y= -1, int width = 500, int height = 500,
+             long style = wxDEFAULT_DIALOG_STYLE,
+             const wxString& name = wxDialogNameStr) );
+
+    // just call Show() or ShowModal()
+    wxDEPRECATED( void SetModal(bool flag) );
+
+    // use IsModal()
+    wxDEPRECATED( bool IsModalShowing() const );
+
 protected:
     // find the window to use as parent for this dialog if none has been
     // specified explicitly by the user
@@ -111,9 +110,6 @@ protected:
     // may return NULL
     wxWindow *FindSuitableParent() const;
 
-    // show modal dialog and enter modal loop
-    void DoShowModal();
-
     // common part of all ctors
     void Init();
 
index 7fec4742cb9c7ef5887a48fa50abc12406c24818..6684cc6d7060d7b55895b92aa591115d5ab046f3 100644 (file)
@@ -127,8 +127,5 @@ protected:
     DECLARE_NO_COPY_CLASS(wxTopLevelWindowMSW)
 };
 
-// list of all frames and modeless dialogs
-extern WXDLLEXPORT_DATA(wxWindowList) wxModelessWindows;
-
 #endif // _WX_MSW_TOPLEVEL_H_
 
index 2b891ad6266df4657bedf3dd2d6d78063692b9d5..9e94d472c4ece5570caf12303d913390e33e5985 100644 (file)
@@ -185,16 +185,25 @@ bool wxDialog::Create(wxWindow *parent,
     return TRUE;
 }
 
-void wxDialog::SetModal(bool flag)
+// deprecated ctor
+wxDialog::wxDialog(wxWindow *parent,
+                   const wxString& title,
+                   bool WXUNUSED(modal),
+                   int x,
+                   int y,
+                   int w,
+                   int h,
+                   long style,
+                   const wxString& name)
 {
-    if ( flag )
-    {
-        wxModelessWindows.DeleteObject(this);
-    }
-    else
-    {
-        wxModelessWindows.Append(this);
-    }
+    Init();
+
+    Create(parent, -1, title, wxPoint(x, y), wxSize(w, h), style, name);
+}
+
+void wxDialog::SetModal(bool WXUNUSED(flag))
+{
+    // nothing to do, obsolete method
 }
 
 wxDialog::~wxDialog()
@@ -209,14 +218,9 @@ wxDialog::~wxDialog()
 // showing the dialogs
 // ----------------------------------------------------------------------------
 
-bool wxDialog::IsModal() const
-{
-    return !wxModelessWindows.Find(this);
-}
-
 bool wxDialog::IsModalShowing() const
 {
-    return m_modalData != NULL;
+    return IsModal();
 }
 
 wxWindow *wxDialog::FindSuitableParent() const
@@ -241,49 +245,6 @@ wxWindow *wxDialog::FindSuitableParent() const
     return parent;
 }
 
-void wxDialog::DoShowModal()
-{
-    wxCHECK_RET( !IsModalShowing(), _T("DoShowModal() called twice") );
-    wxCHECK_RET( IsModal(), _T("can't DoShowModal() modeless dialog") );
-
-    wxWindow *parent = GetParent();
-
-    wxWindow* oldFocus = m_oldFocus;
-
-    // We have to remember the HWND because we need to check
-    // the HWND still exists (oldFocus can be garbage when the dialog
-    // exits, if it has been destroyed)
-    HWND hwndOldFocus = 0;
-    if (oldFocus)
-        hwndOldFocus = (HWND) oldFocus->GetHWND();
-
-    // remember where the focus was
-    if ( !oldFocus )
-    {
-        oldFocus = parent;
-        if ( parent )
-            hwndOldFocus = GetHwndOf(parent);
-    }
-
-    // enter the modal loop
-    {
-        wxDialogModalDataTiedPtr modalData(&m_modalData,
-                                           new wxDialogModalData(this));
-        modalData->RunLoop();
-    }
-
-    // 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
-    // for a modal dialog that has been destroyed before calling EndModal).
-    if ( oldFocus && (oldFocus != this) && ::IsWindow(hwndOldFocus))
-    {
-        // This is likely to prove that the object still exists
-        if (wxFindWinFromHandle((WXHWND) hwndOldFocus) == oldFocus)
-            oldFocus->SetFocus();
-    }
-}
-
 bool wxDialog::Show(bool show)
 {
     if ( !show && m_modalData )
@@ -317,20 +278,6 @@ bool wxDialog::Show(bool show)
         InitDialog();
     }
 
-    // EndModal may have been called from InitDialog handler,
-    // which would cause an infinite loop if we didn't take it
-    // into account
-    if ( show && IsModal() && !m_endModalCalled )
-    {
-        // modal dialog needs a parent window, so try to find one
-        if ( !GetParent() )
-        {
-            m_parent = FindSuitableParent();
-        }
-
-        DoShowModal();
-    }
-
     return TRUE;
 }
 
@@ -339,24 +286,68 @@ void wxDialog::Raise()
     ::SetForegroundWindow(GetHwnd());
 }
 
-// a special version for Show(TRUE) for modal dialogs which returns return code
+// show dialog modally
 int wxDialog::ShowModal()
 {
+    wxASSERT_MSG( !IsModal(), _T("wxDialog::ShowModal() reentered?") );
+
     m_endModalCalled = FALSE;
-    if ( !IsModal() )
+
+    Show();
+
+    // EndModal may have been called from InitDialog handler (called from
+    // inside Show()), which would cause an infinite loop if we didn't take it
+    // into account
+    if ( !m_endModalCalled )
     {
-        SetModal(TRUE);
-    }
+        // modal dialog needs a parent window, so try to find one
+        wxWindow *parent = GetParent();
+        if ( !parent )
+        {
+            parent = FindSuitableParent();
+        }
 
-    Show(TRUE);
+        // remember where the focus was
+        wxWindow *oldFocus = m_oldFocus;
+        if ( !oldFocus )
+        {
+            // VZ: do we really want to do this?
+            oldFocus = parent;
+        }
+
+        // We have to remember the HWND because we need to check
+        // the HWND still exists (oldFocus can be garbage when the dialog
+        // exits, if it has been destroyed)
+        HWND hwndOldFocus = oldFocus ? GetHwndOf(oldFocus) : NULL;
+
+
+        // enter and run the modal loop
+        {
+            wxDialogModalDataTiedPtr modalData(&m_modalData,
+                                               new wxDialogModalData(this));
+            modalData->RunLoop();
+        }
+
+
+        // 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
+        // for a modal dialog that has been destroyed before calling EndModal).
+        if ( oldFocus && (oldFocus != this) && ::IsWindow(hwndOldFocus))
+        {
+            // This is likely to prove that the object still exists
+            if (wxFindWinFromHandle((WXHWND) hwndOldFocus) == oldFocus)
+                oldFocus->SetFocus();
+        }
+    }
 
     return GetReturnCode();
 }
 
-// NB: this function (surprizingly) may be called for both modal and modeless
-//     dialogs and should work for both of them
 void wxDialog::EndModal(int retCode)
 {
+    wxASSERT_MSG( IsModal(), _T("EndModal() called for non modal dialog") );
+
     m_endModalCalled = TRUE;
     SetReturnCode(retCode);
 
@@ -482,7 +473,7 @@ WXLRESULT wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPar
             // we want to override the busy cursor for modal dialogs:
             // typically, wxBeginBusyCursor() is called and then a modal dialog
             // is shown, but the modal dialog shouldn't have hourglass cursor
-            if ( IsModalShowing() && wxIsBusy() )
+            if ( IsModal() && wxIsBusy() )
             {
                 // set our cursor for all windows (but see below)
                 wxCursor cursor = m_cursor;
index 6c5aaef10eec7416a103c30476cf704ccee4f804..4b7181dd0315374c2ede4af6422cb59d758d6444 100644 (file)
@@ -194,8 +194,6 @@ bool wxFrame::Create(wxWindow *parent,
 
     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
 
-    wxModelessWindows.Append(this);
-
     return TRUE;
 }
 
index 72ba895be88e9ab97db486ce46dfb91d66fa0920..8a6d2eb7885cc8b391af21c34e55af669566bc7c 100644 (file)
@@ -62,7 +62,6 @@
 // global variables
 // ---------------------------------------------------------------------------
 
-extern wxWindowList wxModelessWindows;      // from dialog.cpp
 extern wxMenu *wxCurrentPopupMenu;
 
 extern const wxChar *wxMDIFrameClassName;   // from app.cpp
@@ -223,8 +222,6 @@ bool wxMDIParentFrame::Create(wxWindow *parent,
       return false;
   }
 
-  wxModelessWindows.Append(this);
-
   // unlike (almost?) all other windows, frames are created hidden
   m_isShown = false;
 
@@ -725,8 +722,6 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
 
   wxAssociateWinWithHandle((HWND) GetHWND(), this);
 
-  wxModelessWindows.Append(this);
-
   return true;
 }