// discarded unless the string "foo" has been added to the list of allowed
// ones with AddTraceMask()
-#define wxTRACE_MemAlloc "memalloc" // trace memory allocation (new/delete)
-#define wxTRACE_Messages "messages" // trace window messages/X callbacks
-#define wxTRACE_ResAlloc "resalloc" // trace GDI resource allocation
-#define wxTRACE_RefCount "refcount" // trace various ref counting operations
+#define wxTRACE_MemAlloc wxT("memalloc") // trace memory allocation (new/delete)
+#define wxTRACE_Messages wxT("messages") // trace window messages/X callbacks
+#define wxTRACE_ResAlloc wxT("resalloc") // trace GDI resource allocation
+#define wxTRACE_RefCount wxT("refcount") // trace various ref counting operations
#ifdef __WXMSW__
- #define wxTRACE_OleCalls "ole" // OLE interface calls
+ #define wxTRACE_OleCalls wxT("ole") // OLE interface calls
#endif
// the trace masks have been superceded by symbolic trace constants, they're
// flush the active target if any
static void FlushActive()
{
- wxLog *log = GetActiveTarget();
- if ( log )
- log->Flush();
+ if ( !ms_suspendCount )
+ {
+ wxLog *log = GetActiveTarget();
+ if ( log && log->HasPendingMessages() )
+ log->Flush();
+ }
}
// get current log target, will call wxApp::CreateLogTarget() to
// create one if none exists
// change log target, pLogger may be NULL
static wxLog *SetActiveTarget(wxLog *pLogger);
+ // suspend the message flushing of the main target until the next call
+ // to Resume() - this is mainly for internal use (to prevent wxYield()
+ // from flashing the messages)
+ static void Suspend() { ms_suspendCount++; }
+ // must be called for each Suspend()!
+ static void Resume() { ms_suspendCount--; }
+
// functions controlling the default wxLog behaviour
// verbose mode is activated by standard command-line '-verbose'
// option
static bool ms_doLog; // FALSE => all logging disabled
static bool ms_bAutoCreate; // create new log targets on demand?
+ static size_t ms_suspendCount; // if positive, logs are not flushed
+
// format string for strftime(), if NULL, time stamping log messages is
// disabled
static const wxChar *ms_timestamp;
// empty everything
void Clear();
- wxArrayString m_aMessages;
- wxArrayLong m_aTimes;
+ wxArrayString m_aMessages; // the log message texts
+ wxArrayInt m_aSeverity; // one of wxLOG_XXX values
+ wxArrayLong m_aTimes; // the time of each message
bool m_bErrors, // do we have any errors?
m_bWarnings; // any warnings?
};
~wxLogWindow();
// window operations
- // show/hide the log window
+ // show/hide the log window
void Show(bool bShow = TRUE);
- // retrieve the pointer to the frame
+ // retrieve the pointer to the frame
wxFrame *GetFrame() const;
// accessors
- // the previous log target (may be NULL)
+ // the previous log target (may be NULL)
wxLog *GetOldLog() const { return m_pOldLog; }
- // are we passing the messages to the previous log target?
+ // are we passing the messages to the previous log target?
bool IsPassingMessages() const { return m_bPassMessages; }
// we can pass the messages to the previous log target (we're in this mode by
void PassMessages(bool bDoPass) { m_bPassMessages = bDoPass; }
// base class virtuals
- // we don't need it ourselves, but we pass it to the previous logger
+ // we don't need it ourselves, but we pass it to the previous logger
virtual void Flush();
// overridables
- // called immediately after the log frame creation allowing for
- // any extra initializations
+ // called immediately after the log frame creation allowing for
+ // any extra initializations
virtual void OnFrameCreate(wxFrame *frame);
- // called right before the log frame is going to be deleted
+ // called if the user closes the window interactively, will not be
+ // called if it is destroyed for another reason (such as when program
+ // exits) - return TRUE from here to allow the frame to close, FALSE
+ // to prevent this from happening
+ virtual bool OnFrameClose(wxFrame *frame);
+ // called right before the log frame is going to be deleted: will
+ // always be called unlike OnFrameClose()
virtual void OnFrameDelete(wxFrame *frame);
protected:
// this second version will only log the message if the mask had been
// added to the list of masks with AddTraceMask()
- DECLARE_LOG_FUNCTION2(Trace, const char *mask);
+ DECLARE_LOG_FUNCTION2(Trace, const wxChar *mask);
// the last one does nothing if all of level bits are not set
// in wxLog::GetActive()->GetTraceMask() - it's deprecated in favour of
// 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__
- #define wxLogApiError(api, rc) \
- wxLogDebug(wxT("%s(%d): '%s' failed with error 0x%08lx (%s)."), \
- __TFILE__, __LINE__, api, \
+ #define wxLogApiError(api, rc) \
+ wxLogDebug(wxT("%s(%d): '%s' failed with error 0x%08lx (%s)."), \
+ __TFILE__, __LINE__, api, \
rc, wxSysErrorMsg(rc))
#else // !VC++
- #define wxLogApiError(api, rc) \
- wxLogDebug(wxT("In file %s at line %d: '%s' failed with " \
- "error 0x%08lx (%s)."), \
- __TFILE__, __LINE__, api, \
+ #define wxLogApiError(api, rc) \
+ wxLogDebug(wxT("In file %s at line %d: '%s' failed with " \
+ "error 0x%08lx (%s)."), \
+ __TFILE__, __LINE__, api, \
rc, wxSysErrorMsg(rc))
#endif // VC++/!VC++