]> git.saurik.com Git - wxWidgets.git/commitdiff
implemented wxApp::OnExceptionInMainLoop()
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 30 Mar 2004 20:50:59 +0000 (20:50 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 30 Mar 2004 20:50:59 +0000 (20:50 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26506 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/app.h
src/msw/app.cpp

index 058849b80f43bce1b40ccbb8a7c18c9d9cf7bb34..10e1dbd4fb1d214f2c40cad5b46c2cc14749af2d 100644 (file)
@@ -50,20 +50,18 @@ public:
     void OnEndSession(wxCloseEvent& event);
     void OnQueryEndSession(wxCloseEvent& event);
 
+#if wxUSE_EXCEPTIONS
+    virtual bool OnExceptionInMainLoop();
+#endif // wxUSE_EXCEPTIONS
+
 protected:
     int    m_printMode; // wxPRINT_WINDOWS, wxPRINT_POSTSCRIPT
 
-    /* Windows-specific wxApp definitions */
-
 public:
-
     // Implementation
     static bool RegisterWindowClasses();
     static bool UnregisterWindowClasses();
 
-    // idle processing
-    // ---------------
-
 #if wxUSE_RICHEDIT
     // initialize the richedit DLL of (at least) given version, return TRUE if
     // ok (Win95 has version 1, Win98/NT4 has 1 and 2, W2K has 3)
@@ -74,7 +72,6 @@ public:
     // wasn't found at all
     static int GetComCtl32Version();
 
-public:
     // the SW_XXX value to be used for the frames opened by the application
     // (currently seems unused which is a bug -- TODO)
     static int m_nCmdShow;
index 6143dbb8520365c7628e55da3bc9ce480eb463e5..7d430057a94f7e5c2384d95b4f3b50a454bd5e89 100644 (file)
 
 #include "wx/msw/wrapcctl.h"
 
+// For MB_TASKMODAL
+#ifdef __WXWINCE__
+#include "wx/msw/wince/missing.h"
+#endif
+
 #if (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \
     !defined(__CYGWIN__) && !defined(__DIGITALMARS__) && !defined(__WXWINCE__) && \
     (!defined(_MSC_VER) || (_MSC_VER > 1100))
@@ -535,6 +540,10 @@ wxApp::~wxApp()
     delete [] argv;
 }
 
+// ----------------------------------------------------------------------------
+// wxApp idle handling
+// ----------------------------------------------------------------------------
+
 void wxApp::OnIdle(wxIdleEvent& event)
 {
     wxAppBase::OnIdle(event);
@@ -565,6 +574,10 @@ void wxApp::WakeUpIdle()
     }
 }
 
+// ----------------------------------------------------------------------------
+// other wxApp event hanlders
+// ----------------------------------------------------------------------------
+
 void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event))
 {
     if (GetTopWindow())
@@ -582,6 +595,10 @@ void wxApp::OnQueryEndSession(wxCloseEvent& event)
     }
 }
 
+// ----------------------------------------------------------------------------
+// miscellaneous
+// ----------------------------------------------------------------------------
+
 /* static */
 int wxApp::GetComCtl32Version()
 {
@@ -720,3 +737,43 @@ bool wxApp::Yield(bool onlyIfNeeded)
     return TRUE;
 }
 
+#if wxUSE_EXCEPTIONS
+
+// ----------------------------------------------------------------------------
+// exception handling
+// ----------------------------------------------------------------------------
+
+bool wxApp::OnExceptionInMainLoop()
+{
+    // ask the user about what to do: use the Win32 API function here as it
+    // could be dangerous to use any wxWindows code in this state
+    switch (
+            ::MessageBox
+              (
+                NULL,
+                _T("An unhandled exception occurred. Press \"Abort\" to \
+terminate the program,\r\n\
+\"Retry\" to exit the program normally and \"Ignore\" to try to continue."),
+                _T("Unhandled exception"),
+                MB_ABORTRETRYIGNORE |
+                MB_ICONERROR| 
+                MB_TASKMODAL
+              )
+           )
+    {
+        case IDABORT:
+            throw;
+
+        default:
+            wxFAIL_MSG( _T("unexpected MessageBox() return code") );
+            // fall through
+
+        case IDRETRY:
+            return false;
+
+        case IDIGNORE:
+            return true;
+    }
+}
+
+#endif // wxUSE_EXCEPTIONS