fixed recent modeless dialog breakage caused by removing wxDIALOG_MODAL (wxModelessWindows list doesn't exist any more; wxDialog::SetModal() and IsModalShowing() deperecated)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26896 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2004-04-21 12:45:16 +00:00
parent a48e51ce11
commit f46f4c86b2
5 changed files with 93 additions and 116 deletions

View File

@@ -28,21 +28,7 @@ class WXDLLEXPORT wxDialog : public wxDialogBase
public: public:
wxDialog() { Init(); } wxDialog() { Init(); }
// Constructor with a modal flag, but no window id - the old convention // full ctor
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.
wxDialog(wxWindow *parent, wxWindowID id, wxDialog(wxWindow *parent, wxWindowID id,
const wxString& title, const wxString& title,
const wxPoint& pos = wxDefaultPosition, const wxPoint& pos = wxDefaultPosition,
@@ -64,18 +50,15 @@ public:
virtual ~wxDialog(); virtual ~wxDialog();
void SetModal(bool flag); // return true if we're showing the dialog modally
virtual bool IsModal() const; 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(); virtual int ShowModal();
// may be called to terminate the dialog with the given return code // may be called to terminate the dialog with the given return code
virtual void EndModal(int retCode); virtual void EndModal(int retCode);
// returns TRUE if we're in a modal loop
bool IsModalShowing() const;
// implementation only from now on // implementation only from now on
// ------------------------------- // -------------------------------
@@ -104,6 +87,22 @@ public:
WXUINT message, WXWPARAM wParam, WXLPARAM lParam); WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
#endif // wxUSE_CTL3D #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: protected:
// find the window to use as parent for this dialog if none has been // find the window to use as parent for this dialog if none has been
// specified explicitly by the user // specified explicitly by the user
@@ -111,9 +110,6 @@ protected:
// may return NULL // may return NULL
wxWindow *FindSuitableParent() const; wxWindow *FindSuitableParent() const;
// show modal dialog and enter modal loop
void DoShowModal();
// common part of all ctors // common part of all ctors
void Init(); void Init();

View File

@@ -127,8 +127,5 @@ protected:
DECLARE_NO_COPY_CLASS(wxTopLevelWindowMSW) DECLARE_NO_COPY_CLASS(wxTopLevelWindowMSW)
}; };
// list of all frames and modeless dialogs
extern WXDLLEXPORT_DATA(wxWindowList) wxModelessWindows;
#endif // _WX_MSW_TOPLEVEL_H_ #endif // _WX_MSW_TOPLEVEL_H_

View File

@@ -185,16 +185,25 @@ bool wxDialog::Create(wxWindow *parent,
return TRUE; 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 ) Init();
{
wxModelessWindows.DeleteObject(this); Create(parent, -1, title, wxPoint(x, y), wxSize(w, h), style, name);
} }
else
{ void wxDialog::SetModal(bool WXUNUSED(flag))
wxModelessWindows.Append(this); {
} // nothing to do, obsolete method
} }
wxDialog::~wxDialog() wxDialog::~wxDialog()
@@ -209,14 +218,9 @@ wxDialog::~wxDialog()
// showing the dialogs // showing the dialogs
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
bool wxDialog::IsModal() const
{
return !wxModelessWindows.Find(this);
}
bool wxDialog::IsModalShowing() const bool wxDialog::IsModalShowing() const
{ {
return m_modalData != NULL; return IsModal();
} }
wxWindow *wxDialog::FindSuitableParent() const wxWindow *wxDialog::FindSuitableParent() const
@@ -241,49 +245,6 @@ wxWindow *wxDialog::FindSuitableParent() const
return parent; 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) bool wxDialog::Show(bool show)
{ {
if ( !show && m_modalData ) if ( !show && m_modalData )
@@ -317,20 +278,6 @@ bool wxDialog::Show(bool show)
InitDialog(); 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; return TRUE;
} }
@@ -339,24 +286,68 @@ void wxDialog::Raise()
::SetForegroundWindow(GetHwnd()); ::SetForegroundWindow(GetHwnd());
} }
// a special version for Show(TRUE) for modal dialogs which returns return code // show dialog modally
int wxDialog::ShowModal() int wxDialog::ShowModal()
{ {
m_endModalCalled = FALSE; wxASSERT_MSG( !IsModal(), _T("wxDialog::ShowModal() reentered?") );
if ( !IsModal() )
{
SetModal(TRUE);
}
Show(TRUE); m_endModalCalled = FALSE;
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 )
{
// modal dialog needs a parent window, so try to find one
wxWindow *parent = GetParent();
if ( !parent )
{
parent = FindSuitableParent();
}
// 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(); 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) void wxDialog::EndModal(int retCode)
{ {
wxASSERT_MSG( IsModal(), _T("EndModal() called for non modal dialog") );
m_endModalCalled = TRUE; m_endModalCalled = TRUE;
SetReturnCode(retCode); 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: // we want to override the busy cursor for modal dialogs:
// typically, wxBeginBusyCursor() is called and then a modal dialog // typically, wxBeginBusyCursor() is called and then a modal dialog
// is shown, but the modal dialog shouldn't have hourglass cursor // 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) // set our cursor for all windows (but see below)
wxCursor cursor = m_cursor; wxCursor cursor = m_cursor;

View File

@@ -194,8 +194,6 @@ bool wxFrame::Create(wxWindow *parent,
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
wxModelessWindows.Append(this);
return TRUE; return TRUE;
} }

View File

@@ -62,7 +62,6 @@
// global variables // global variables
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
extern wxWindowList wxModelessWindows; // from dialog.cpp
extern wxMenu *wxCurrentPopupMenu; extern wxMenu *wxCurrentPopupMenu;
extern const wxChar *wxMDIFrameClassName; // from app.cpp extern const wxChar *wxMDIFrameClassName; // from app.cpp
@@ -223,8 +222,6 @@ bool wxMDIParentFrame::Create(wxWindow *parent,
return false; return false;
} }
wxModelessWindows.Append(this);
// unlike (almost?) all other windows, frames are created hidden // unlike (almost?) all other windows, frames are created hidden
m_isShown = false; m_isShown = false;
@@ -725,8 +722,6 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
wxAssociateWinWithHandle((HWND) GetHWND(), this); wxAssociateWinWithHandle((HWND) GetHWND(), this);
wxModelessWindows.Append(this);
return true; return true;
} }