From 94b4dd54994eeae0e625bca08446f7e8d8d917a8 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Wed, 13 May 2009 07:01:51 +0000 Subject: [PATCH] add window-modal dialog calls and fallback implementation git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60614 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/dialog.h | 40 ++++++++++++++++++++++++++++++++++++++-- src/common/dlgcmn.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/include/wx/dialog.h b/include/wx/dialog.h index a791d83c55..ef747fe246 100644 --- a/include/wx/dialog.h +++ b/include/wx/dialog.h @@ -53,6 +53,13 @@ enum wxDialogLayoutAdaptationMode wxDIALOG_ADAPTATION_MODE_DISABLED = 2 // disable this dialog overriding global status }; +enum wxDialogModality +{ + wxDIALOG_MODALITY_NONE = 0, + wxDIALOG_MODALITY_WINDOW_MODAL = 1, + wxDIALOG_MODALITY_APP_MODAL = 2 +}; + extern WXDLLIMPEXP_DATA_CORE(const char) wxDialogNameStr[]; class WXDLLIMPEXP_CORE wxDialogBase : public wxTopLevelWindow @@ -71,7 +78,10 @@ public: virtual int ShowModal() = 0; virtual void EndModal(int retCode) = 0; virtual bool IsModal() const = 0; - + // show the dialog frame-modally (needs a parent), using app-modal + // dialogs on platforms that don't support it + virtual bool ShowWindowModal () ; + virtual void SendWindowModalDialogEvent ( wxEventType type ); // Modal dialogs have a return code - usually the id of the last // pressed button @@ -159,6 +169,8 @@ public: static bool IsLayoutAdaptationEnabled() { return sm_layoutAdaptation; } static void EnableLayoutAdaptation(bool enable) { sm_layoutAdaptation = enable; } + // modality kind + wxDialogModality GetModality() const; protected: // emulate click of a button with the given id if it's present in the dialog // @@ -181,7 +193,6 @@ protected: // wxID_OK return code void AcceptAndClose(); - // The return code from modal dialog int m_returnCode; @@ -329,5 +340,30 @@ public: #endif #endif +class WXDLLIMPEXP_CORE wxWindowModalDialogEvent : public wxCommandEvent +{ +public: + wxWindowModalDialogEvent (wxEventType commandType = wxEVT_NULL, int id = 0) + : wxCommandEvent(commandType, id) { } + + wxDialog *GetDialog() const + { return wxStaticCast(GetEventObject(), wxDialog); } + + int GetReturnCode() const + { return GetDialog()->GetReturnCode(); } + + virtual wxEvent *Clone() const { return new wxWindowModalDialogEvent (*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxWindowModalDialogEvent ) +}; + +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_WINDOW_MODAL_DIALOG_CLOSED , wxWindowModalDialogEvent ); + +typedef void (wxEvtHandler::*wxWindowModalDialogEventFunction)(wxWindowModalDialogEvent &); + +#define wxWindowModalDialogEventHandler(func) \ + wxEVENT_HANDLER_CAST(wxWindowModalDialogEventFunction, func) + #endif // _WX_DIALOG_H_BASE_ diff --git a/src/common/dlgcmn.cpp b/src/common/dlgcmn.cpp index c47e33832b..89880c8262 100644 --- a/src/common/dlgcmn.cpp +++ b/src/common/dlgcmn.cpp @@ -464,6 +464,40 @@ void wxDialogBase::OnButton(wxCommandEvent& event) } } +// ---------------------------------------------------------------------------- +// compatibility methods for supporting the modality API +// ---------------------------------------------------------------------------- + +wxDEFINE_EVENT( wxEVT_WINDOW_MODAL_DIALOG_CLOSED , wxWindowModalDialogEvent ); + +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 // ---------------------------------------------------------------------------- -- 2.45.2