]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/log.h
extract event handler body in a separate function instead of using a hack to call...
[wxWidgets.git] / include / wx / log.h
index a4f1168db6252efe27e2f8109323da369b76618c..88b6475240d41708ece92078833dca82bad2942c 100644 (file)
 
 #include "wx/defs.h"
 
-#if wxUSE_THREADS
-    class WXDLLIMPEXP_FWD_BASE wxCriticalSection;
-#endif
-
 // ----------------------------------------------------------------------------
-// common constants for use in wxUSE_LOG/!wxUSE_LOG
+// types
 // ----------------------------------------------------------------------------
 
-// the trace masks have been superceded by symbolic trace constants, they're
-// for compatibility only andwill be removed soon - do NOT use them
-
-// meaning of different bits of the trace mask (which allows selectively
-// enable/disable some trace messages)
-#define wxTraceMemAlloc 0x0001  // trace memory allocation (new/delete)
-#define wxTraceMessages 0x0002  // trace window messages/X callbacks
-#define wxTraceResAlloc 0x0004  // trace GDI resource allocation
-#define wxTraceRefCount 0x0008  // trace various ref counting operations
+// NB: this is needed even if wxUSE_LOG == 0
+typedef unsigned long wxLogLevel;
 
-#ifdef  __WXMSW__
-    #define wxTraceOleCalls 0x0100  // OLE interface calls
-#endif
+// the trace masks have been superseded by symbolic trace constants, they're
+// for compatibility only and will be removed soon - do NOT use them
+#if WXWIN_COMPATIBILITY_2_8
+    #define wxTraceMemAlloc 0x0001  // trace memory allocation (new/delete)
+    #define wxTraceMessages 0x0002  // trace window messages/X callbacks
+    #define wxTraceResAlloc 0x0004  // trace GDI resource allocation
+    #define wxTraceRefCount 0x0008  // trace various ref counting operations
 
-// ----------------------------------------------------------------------------
-// types
-// ----------------------------------------------------------------------------
+    #ifdef  __WXMSW__
+        #define wxTraceOleCalls 0x0100  // OLE interface calls
+    #endif
 
-// NB: these types are needed even if wxUSE_LOG == 0
-typedef unsigned long wxTraceMask;
-typedef unsigned long wxLogLevel;
+    typedef unsigned long wxTraceMask;
+#endif // WXWIN_COMPATIBILITY_2_8
 
 // ----------------------------------------------------------------------------
 // headers
@@ -63,23 +55,30 @@ typedef unsigned long wxLogLevel;
 
 #include "wx/dynarray.h"
 
+// wxUSE_LOG_DEBUG enables the debug log messages
 #ifndef wxUSE_LOG_DEBUG
-#  ifdef __WXDEBUG__
-#    define wxUSE_LOG_DEBUG 1
-#  else // !__WXDEBUG__
-#    define wxUSE_LOG_DEBUG 0
-#  endif
+    #if wxDEBUG_LEVEL
+        #define wxUSE_LOG_DEBUG 1
+    #else // !wxDEBUG_LEVEL
+        #define wxUSE_LOG_DEBUG 0
+    #endif
 #endif
 
+// wxUSE_LOG_TRACE enables the trace messages, they are disabled by default
+#ifndef wxUSE_LOG_TRACE
+    #if wxDEBUG_LEVEL
+        #define wxUSE_LOG_TRACE 1
+    #else // !wxDEBUG_LEVEL
+        #define wxUSE_LOG_TRACE 0
+    #endif
+#endif // wxUSE_LOG_TRACE
+
 // ----------------------------------------------------------------------------
 // forward declarations
 // ----------------------------------------------------------------------------
 
 #if wxUSE_GUI
-    class WXDLLIMPEXP_FWD_CORE wxTextCtrl;
-    class WXDLLIMPEXP_FWD_CORE wxLogFrame;
     class WXDLLIMPEXP_FWD_CORE wxFrame;
-    class WXDLLIMPEXP_FWD_CORE wxWindow;
 #endif // wxUSE_GUI
 
 // ----------------------------------------------------------------------------
@@ -198,9 +197,6 @@ public:
     // gets duplicate counting status
     static bool GetRepetitionCounting() { return ms_bRepetCounting; }
 
-    // trace mask (see wxTraceXXX constants for details)
-    static void SetTraceMask(wxTraceMask ulMask) { ms_ulTraceMask = ulMask; }
-
     // add string trace mask
     static void AddTraceMask(const wxString& str);
 
@@ -228,16 +224,13 @@ public:
     // gets the verbose status
     static bool GetVerbose() { return ms_bVerbose; }
 
-    // get trace mask
-    static wxTraceMask GetTraceMask() { return ms_ulTraceMask; }
-
     // is this trace mask in the list?
     static bool IsAllowedTraceMask(const wxString& mask);
 
     // return the current loglevel limit
     static wxLogLevel GetLogLevel() { return ms_logLevel; }
 
-    // get the current timestamp format string (may be NULL)
+    // get the current timestamp format string (maybe empty)
     static const wxString& GetTimestamp() { return ms_timestamp; }
 
 
@@ -247,6 +240,14 @@ public:
     // change it otherwise)
     static void TimeStamp(wxString *str);
 
+    // this method should only be called from derived classes DoLog()
+    // implementations and shouldn't be called directly, use logging functions
+    // instead
+    void Log(wxLogLevel level, const wxString& msg, time_t t)
+    {
+        DoLog(level, msg, t);
+    }
+
     // make dtor virtual for all derived classes
     virtual ~wxLog();
 
@@ -259,8 +260,16 @@ public:
     wxDEPRECATED( static wxChar *SetLogBuffer(wxChar *buf, size_t size = 0) );
 #endif
 
+    // don't use integer masks any more, use string trace masks instead
+#if WXWIN_COMPATIBILITY_2_8
+    wxDEPRECATED_INLINE( static void SetTraceMask(wxTraceMask ulMask),
+        ms_ulTraceMask = ulMask; )
+    wxDEPRECATED_BUT_USED_INTERNALLY_INLINE( static wxTraceMask GetTraceMask(),
+        return ms_ulTraceMask; )
+#endif // WXWIN_COMPATIBILITY_2_8
+
 protected:
-    // the logging functions that can be overriden
+    // the logging functions that can be overridden
 
     // default DoLog() prepends the time stamp and a prefix corresponding
     // to the message to szString and then passes it to DoLogString()
@@ -324,9 +333,6 @@ private:
     // with the number of times it was repeated
     static bool        ms_bRepetCounting;
 
-#if wxUSE_THREADS
-    static wxCriticalSection ms_prevCS; // protects the ms_prev values below
-#endif
     static wxString    ms_prevString;   // previous message that was logged
     static unsigned    ms_prevCounter;  // how many times it was repeated
     static time_t      ms_prevTimeStamp;// timestamp of the previous message
@@ -341,22 +347,24 @@ private:
 
     static size_t      ms_suspendCount; // if positive, logs are not flushed
 
-    // format string for strftime(), if NULL, time stamping log messages is
+    // format string for strftime(), if empty, time stamping log messages is
     // disabled
     static wxString    ms_timestamp;
 
-#if wxUSE_THREADS
-    static wxCriticalSection ms_traceCS; // protects ms_aTraceMasks
-#endif
+#if WXWIN_COMPATIBILITY_2_8
     static wxTraceMask ms_ulTraceMask;   // controls wxLogTrace behaviour
-    static wxArrayString ms_aTraceMasks; // more powerful filter for wxLogTrace
+#endif // WXWIN_COMPATIBILITY_2_8
+
+    // currently enabled trace masks
+    static wxArrayString ms_aTraceMasks;
 };
 
 // ----------------------------------------------------------------------------
 // "trivial" derivations of wxLog
 // ----------------------------------------------------------------------------
 
-// log everything to a buffer
+// log everything except for the debug/trace messages (which are passed to
+// wxMessageOutputDebug) to a buffer
 class WXDLLIMPEXP_BASE wxLogBuffer : public wxLog
 {
 public:
@@ -370,16 +378,20 @@ public:
     virtual void Flush();
 
 protected:
+#if wxUSE_LOG_DEBUG || wxUSE_LOG_TRACE
     virtual void DoLog(wxLogLevel level, const wxString& szString, time_t t);
-    virtual void DoLogString(const wxString& szString, time_t t);
 
     wxSUPPRESS_DOLOG_HIDE_WARNING()
+#endif // wxUSE_LOG_DEBUG || wxUSE_LOG_TRACE
+
+    virtual void DoLogString(const wxString& szString, time_t t);
+
     wxSUPPRESS_DOLOGSTRING_HIDE_WARNING()
 
 private:
     wxString m_str;
 
-    DECLARE_NO_COPY_CLASS(wxLogBuffer)
+    wxDECLARE_NO_COPY_CLASS(wxLogBuffer);
 };
 
 
@@ -388,7 +400,7 @@ class WXDLLIMPEXP_BASE wxLogStderr : public wxLog
 {
 public:
     // redirect log output to a FILE
-    wxLogStderr(FILE *fp = (FILE *) NULL);
+    wxLogStderr(FILE *fp = NULL);
 
 protected:
     // implement sink function
@@ -398,7 +410,7 @@ protected:
 
     FILE *m_fp;
 
-    DECLARE_NO_COPY_CLASS(wxLogStderr)
+    wxDECLARE_NO_COPY_CLASS(wxLogStderr);
 };
 
 #if wxUSE_STD_IOSTREAM
@@ -502,7 +514,7 @@ private:
     // do we pass the messages to the old logger?
     bool m_bPassMessages;
 
-    DECLARE_NO_COPY_CLASS(wxLogChain)
+    wxDECLARE_NO_COPY_CLASS(wxLogChain);
 };
 
 // a chain log target which uses itself as the new logger
@@ -515,7 +527,7 @@ public:
     wxLogInterposer();
 
 private:
-    DECLARE_NO_COPY_CLASS(wxLogInterposer)
+    wxDECLARE_NO_COPY_CLASS(wxLogInterposer);
 };
 
 // a temporary interposer which doesn't destroy the old log target
@@ -527,7 +539,7 @@ public:
     wxLogInterposerTemp();
 
 private:
-    DECLARE_NO_COPY_CLASS(wxLogInterposerTemp)
+    wxDECLARE_NO_COPY_CLASS(wxLogInterposerTemp);
 };
 
 #if wxUSE_GUI
@@ -629,6 +641,12 @@ WXDLLIMPEXP_BASE const wxChar* wxSysErrorMsg(unsigned long nErrCode = 0);
 
 #else // !wxUSE_LOG
 
+#undef wxUSE_LOG_DEBUG
+#define wxUSE_LOG_DEBUG 0
+
+#undef wxUSE_LOG_TRACE
+#define wxUSE_LOG_TRACE 0
+
 #ifdef __WATCOMC__
     // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351
     #define WX_WATCOM_ONLY_CODE( x )  x
@@ -687,6 +705,7 @@ public:
 // VC6 produces a warning if we a macro expanding to nothing to
 // DECLARE_LOG_FUNCTION2:
 #if defined(__VISUALC__) && __VISUALC__ < 1300
+    #pragma warning(push)
     // "not enough actual parameters for macro 'DECLARE_LOG_FUNCTION2_EXP'"
     #pragma warning(disable:4003)
 #endif
@@ -725,14 +744,42 @@ DECLARE_LOG_FUNCTION2(SysError, long, lErrCode);
 DECLARE_LOG_FUNCTION2(SysError, unsigned long, lErrCode);
 #endif
 
-// debug functions do nothing in release mode
-#if wxUSE_LOG && wxUSE_LOG_DEBUG
+
+// debug functions can be completely disabled in optimized builds
+
+// if these log functions are disabled, we prefer to define them as (empty)
+// variadic macros as this completely removes them and their argument
+// evaluation from the object code but if this is not supported by compiler we
+// use empty inline functions instead (defining them as nothing would result in
+// compiler warnings)
+//
+// note that making wxVLogDebug/Trace() themselves (empty inline) functions is
+// a bad idea as some compilers are stupid enough to not inline even empty
+// functions if their parameters are complicated enough, but by defining them
+// as an empty inline function we ensure that even dumbest compilers optimise
+// them away
+#ifdef __BORLANDC__
+    // but Borland gives "W8019: Code has no effect" for wxLogNop() so we need
+    // to define it differently for it to avoid these warnings (same problem as
+    // with wxUnusedVar())
+    #define wxLogNop() { }
+#else
+    inline void wxLogNop() { }
+#endif
+
+#if wxUSE_LOG_DEBUG
     DECLARE_LOG_FUNCTION(Debug);
+#else // !wxUSE_LOG_DEBUG
+    #define wxVLogDebug(fmt, valist) wxLogNop()
 
-    // there is no more unconditional LogTrace: it is not different from
-    // LogDebug and it creates overload ambiguities
-    //DECLARE_LOG_FUNCTION(Trace);
+    #ifdef HAVE_VARIADIC_MACROS
+        #define wxLogDebug(fmt, ...) wxLogNop()
+    #else // !HAVE_VARIADIC_MACROS
+        WX_DEFINE_VARARG_FUNC_NOP(wxLogDebug, 1, (const wxString&))
+    #endif
+#endif // wxUSE_LOG_DEBUG/!wxUSE_LOG_DEBUG
 
+#if wxUSE_LOG_TRACE
     // this version only logs the message if the mask had been added to the
     // list of masks with AddTraceMask()
     DECLARE_LOG_FUNCTION2(Trace, const wxString&, mask);
@@ -745,38 +792,23 @@ DECLARE_LOG_FUNCTION2(SysError, unsigned long, lErrCode);
     // and this one does nothing if all of level bits are not set in
     // wxLog::GetActive()->GetTraceMask() -- it's deprecated in favour of
     // string identifiers
+#if WXWIN_COMPATIBILITY_2_8
     DECLARE_LOG_FUNCTION2(Trace, wxTraceMask, mask);
 #ifdef __WATCOMC__
     // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351
     DECLARE_LOG_FUNCTION2(Trace, int, mask);
 #endif
-#else   //!debug || !wxUSE_LOG
-    // these functions do nothing in release builds, but don't define them as
-    // nothing as it could result in different code structure in debug and
-    // release and this could result in trouble when these macros are used
-    // inside if/else
-    //
-    // note that making wxVLogDebug/Trace() themselves (empty inline) functions
-    // is a bad idea as some compilers are stupid enough to not inline even
-    // empty functions if their parameters are complicated enough, but by
-    // defining them as an empty inline function we ensure that even dumbest
-    // compilers optimise them away
-    inline void wxLogNop() { }
+#endif // WXWIN_COMPATIBILITY_2_8
 
-    #define wxVLogDebug(fmt, valist) wxLogNop()
+#else  // !wxUSE_LOG_TRACE
     #define wxVLogTrace(mask, fmt, valist) wxLogNop()
 
     #ifdef HAVE_VARIADIC_MACROS
-        // unlike the inline functions below, this completely removes the
-        // wxLogXXX calls from the object file:
-        #define wxLogDebug(fmt, ...) wxLogNop()
         #define wxLogTrace(mask, fmt, ...) wxLogNop()
     #else // !HAVE_VARIADIC_MACROS
-        //inline void wxLogDebug(const wxString& fmt, ...) {}
-        WX_DEFINE_VARARG_FUNC_NOP(wxLogDebug, 1, (const wxString&))
-        //inline void wxLogTrace(wxTraceMask, const wxString& fmt, ...) {}
-        //inline void wxLogTrace(const wxString&, const wxString& fmt, ...) {}
+        #if WXWIN_COMPATIBILITY_2_8
         WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace, 2, (wxTraceMask, const wxString&))
+        #endif
         WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace, 2, (const wxString&, const wxString&))
         #ifdef __WATCOMC__
         // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351
@@ -784,10 +816,10 @@ DECLARE_LOG_FUNCTION2(SysError, unsigned long, lErrCode);
         WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace, 2, (const wchar_t*, const wchar_t*))
         #endif
     #endif // HAVE_VARIADIC_MACROS/!HAVE_VARIADIC_MACROS
-#endif // debug/!debug
+#endif // wxUSE_LOG_TRACE/!wxUSE_LOG_TRACE
 
 #if defined(__VISUALC__) && __VISUALC__ < 1300
-    #pragma warning(default:4003)
+    #pragma warning(pop)
 #endif
 
 // wxLogFatalError helper: show the (fatal) error to the user in a safe way,
@@ -799,7 +831,7 @@ wxSafeShowMessage(const wxString& title, const wxString& text);
 // debug only logging functions: use them with API name and error code
 // ----------------------------------------------------------------------------
 
-#ifdef __WXDEBUG__
+#if wxUSE_LOG_DEBUG
     // make life easier for people using VC++ IDE: clicking on the message
     // will take us immediately to the place of the failed API
 #ifdef __VISUALC__
@@ -817,10 +849,10 @@ wxSafeShowMessage(const wxString& title, const wxString& text);
 
     #define wxLogLastError(api) wxLogApiError(api, wxSysErrorCode())
 
-#else   //!debug
+#else // !wxUSE_LOG_DEBUG
     #define wxLogApiError(api, err) wxLogNop()
     #define wxLogLastError(api) wxLogNop()
-#endif  //debug/!debug
+#endif // wxUSE_LOG_DEBUG/!wxUSE_LOG_DEBUG
 
 // wxCocoa has additiional trace masks
 #if defined(__WXCOCOA__)