]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/dialog.h
wxMessageBox off the main thread lost result code.
[wxWidgets.git] / include / wx / dialog.h
index 10a3a0d67d2c07348b9c6395afdf006ebc733c28..57582708c67129d13682b50a53720761d379ab6c 100644 (file)
@@ -11,8 +11,9 @@
 #ifndef _WX_DIALOG_H_BASE_
 #define _WX_DIALOG_H_BASE_
 
-#include "wx/defs.h"
 #include "wx/toplevel.h"
+#include "wx/containr.h"
+#include "wx/sharedptr.h"
 
 class WXDLLIMPEXP_FWD_CORE wxSizer;
 class WXDLLIMPEXP_FWD_CORE wxStdDialogButtonSizer;
@@ -64,10 +65,10 @@ enum wxDialogModality
 
 extern WXDLLIMPEXP_DATA_CORE(const char) wxDialogNameStr[];
 
-class WXDLLIMPEXP_CORE wxDialogBase : public wxTopLevelWindow
+class WXDLLIMPEXP_CORE wxDialogBase : public wxNavigationEnabled<wxTopLevelWindow>
 {
 public:
-    wxDialogBase() { Init(); }
+    wxDialogBase();
     virtual ~wxDialogBase() { }
 
     // define public wxDialog methods to be implemented by the derived classes
@@ -79,6 +80,11 @@ public:
     virtual void ShowWindowModal () ;
     virtual void SendWindowModalDialogEvent ( wxEventType type );
 
+#ifdef wxHAS_EVENT_BIND
+    template<typename Functor>
+    void ShowWindowModalThenDo(const Functor& onEndModal);
+#endif // wxHAS_EVENT_BIND
+
     // Modal dialogs have a return code - usually the id of the last
     // pressed button
     void SetReturnCode(int returnCode) { m_returnCode = returnCode; }
@@ -241,9 +247,6 @@ protected:
     static bool                         sm_layoutAdaptation;
 
 private:
-    // common part of all ctors
-    void Init();
-
     // helper of GetParentForModalDialog(): returns the passed in window if it
     // can be used as our parent or NULL if it can't
     wxWindow *CheckIfCanBeUsedAsParent(wxWindow *parent) const;
@@ -394,5 +397,45 @@ typedef void (wxEvtHandler::*wxWindowModalDialogEventFunction)(wxWindowModalDial
 #define EVT_WINDOW_MODAL_DIALOG_CLOSED(winid, func) \
     wx__DECLARE_EVT1(wxEVT_WINDOW_MODAL_DIALOG_CLOSED, winid, wxWindowModalDialogEventHandler(func))
 
+#ifdef wxHAS_EVENT_BIND
+template<typename Functor>
+class wxWindowModalDialogEventFunctor
+{
+public:
+    wxWindowModalDialogEventFunctor(const Functor& f)
+        : m_f(new Functor(f))
+    {}
+
+    void operator()(wxWindowModalDialogEvent& event)
+    {
+        if ( m_f )
+        {
+            // We only want to call this handler once. Also, by deleting
+            // the functor here, its data (such as wxWindowPtr pointing to
+            // the dialog) are freed immediately after exiting this operator().
+            wxSharedPtr<Functor> functor(m_f);
+            m_f.reset();
+
+            (*functor)(event.GetReturnCode());
+        }
+        else // was already called once
+        {
+            event.Skip();
+        }
+    }
+
+private:
+    wxSharedPtr<Functor> m_f;
+};
+
+template<typename Functor>
+void wxDialogBase::ShowWindowModalThenDo(const Functor& onEndModal)
+{
+    Bind(wxEVT_WINDOW_MODAL_DIALOG_CLOSED,
+         wxWindowModalDialogEventFunctor<Functor>(onEndModal));
+    ShowWindowModal();
+};
+#endif // wxHAS_EVENT_BIND
+
 #endif
     // _WX_DIALOG_H_BASE_