From: Stefan Csomor <csomor@advancedconcepts.ch>
Date: Wed, 13 May 2009 07:01:51 +0000 (+0000)
Subject: add window-modal dialog calls and fallback implementation
X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/94b4dd54994eeae0e625bca08446f7e8d8d917a8

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

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
 // ----------------------------------------------------------------------------