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:
@@ -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();
|
||||||
|
|
||||||
|
@@ -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_
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user