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:
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();

View 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_

View 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);
Init();
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()
@@ -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;

View File

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

View 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;
}