X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8bda0ec6a3b0a7852eb0056f20a0dba7b07ea593..c753eb9269d1e6c99b80a2d782ce49d9864ac1da:/src/common/dlgcmn.cpp?ds=sidebyside diff --git a/src/common/dlgcmn.cpp b/src/common/dlgcmn.cpp index 18288235be..7c5ef85837 100644 --- a/src/common/dlgcmn.cpp +++ b/src/common/dlgcmn.cpp @@ -40,9 +40,9 @@ #include "wx/statline.h" #include "wx/sysopt.h" #include "wx/module.h" -#include "wx/private/stattext.h" #include "wx/bookctrl.h" #include "wx/scrolwin.h" +#include "wx/textwrapper.h" #if wxUSE_DISPLAY #include "wx/display.h" @@ -80,8 +80,10 @@ void wxDialogBase::Init() wxWindow *wxDialogBase::CheckIfCanBeUsedAsParent(wxWindow *parent) const { - extern WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete; + if ( !parent ) + return NULL; + extern WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete; if ( wxPendingDelete.Member(parent) || parent->IsBeingDeleted() ) { // this window is being deleted and we shouldn't create any children @@ -102,7 +104,9 @@ wxWindow *wxDialogBase::CheckIfCanBeUsedAsParent(wxWindow *parent) const return NULL; } - if ( parent == this ) + // FIXME-VC6: this compiler requires an explicit const cast or it fails + // with error C2446 + if ( const_cast(parent) == this ) { // not sure if this can really happen but it doesn't hurt to guard // against this clearly invalid situation @@ -120,17 +124,14 @@ wxWindow *wxDialogBase::GetParentForModalDialog(wxWindow *parent) const 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 = CheckIfCanBeUsedAsParent(wxGetTopLevelParent(parent)); // then the currently active window if ( !parent ) - parent = CheckIfCanBeUsedAsParent(wxGetActiveWindow()); + parent = CheckIfCanBeUsedAsParent( + wxGetTopLevelParent(wxGetActiveWindow())); // and finally the application main window if ( !parent ) @@ -463,6 +464,42 @@ void wxDialogBase::OnButton(wxCommandEvent& event) } } +// ---------------------------------------------------------------------------- +// compatibility methods for supporting the modality API +// ---------------------------------------------------------------------------- + +wxDEFINE_EVENT( wxEVT_WINDOW_MODAL_DIALOG_CLOSED , wxWindowModalDialogEvent ); + +IMPLEMENT_DYNAMIC_CLASS(wxWindowModalDialogEvent, wxCommandEvent) + +bool wxDialogBase::ShowWindowModal () +{ + ShowModal(); + SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED ); + return true; +} + +void wxDialogBase::SendWindowModalDialogEvent ( wxEventType type ) +{ + wxCommandEvent event ( type, GetId()); + event.SetEventObject(this); + + if ( !GetEventHandler()->ProcessEvent(event) ) + { + // the event is not propagated upwards to the parent automatically + // because the dialog is a top level window, so do it manually as + // in 9 cases of 10 the message must be processed by the dialog + // owner and not the dialog itself + (void)GetParent()->GetEventHandler()->ProcessEvent(event); + } +} + + +wxDialogModality wxDialogBase::GetModality() const +{ + return IsModal() ? wxDIALOG_MODALITY_APP_MODAL : wxDIALOG_MODALITY_NONE; +} + // ---------------------------------------------------------------------------- // other event handlers // ----------------------------------------------------------------------------