There also functions to support message buffering. Why are they needed?
Some of wxLog implementations, most notably the standard wxLogGui class,
buffer the messages (for example, to avoid showing the user a zillion of modal
-message boxes one after another - which would be really annoying).
+message boxes one after another -- which would be really annoying).
\helpref{Flush()}{wxlogflush} shows them all and clears the buffer contents.
-Although this function doesn't do anything if the buffer is already empty,
-\helpref{HasPendingMessages()}{wxloghaspendingmessages} is also provided which
-allows to explicitly verify it.
+This function doesn't do anything if the buffer is already empty.
\helpref{Flush}{wxlogflush}\\
-\helpref{FlushActive}{wxlogflushactive}\\
-\helpref{HasPendingMessages}{wxloghaspendingmessages}
+\helpref{FlushActive}{wxlogflushactive}
\membersection{Customization}\label{wxlogcustomization}
\helpref{Flush}{wxlogflush}
-\membersection{wxLog::HasPendingMessages}\label{wxloghaspendingmessages}
-
-\constfunc{bool}{HasPendingMessages}{\void}
-
-Returns true if there are any messages in the buffer (not yet shown to the
-user). (Almost) for internal use only.
-
\membersection{wxLog::SetVerbose}\label{wxlogsetverbose}
\func{static void}{SetVerbose}{\param{bool }{ verbose = TRUE}}
// and iostream logs don't need it, but wxGuiLog does to avoid showing
// 17 modal dialogs one after another)
virtual void Flush();
- // call to Flush() may be optimized: call it only if this function
- // returns true (although Flush() also returns immediately if there is
- // no messages, this functions is more efficient because inline)
- bool HasPendingMessages() const { return m_bHasMessages; }
- // only one sink is active at each moment
// flush the active target if any
static void FlushActive()
{
if ( !ms_suspendCount )
{
wxLog *log = GetActiveTarget();
- if ( log && log->HasPendingMessages() )
+ if ( log )
log->Flush();
}
}
+
+ // only one sink is active at each moment
// get current log target, will call wxApp::CreateLogTarget() to
// create one if none exists
static wxLog *GetActiveTarget();
// make dtor virtual for all derived classes
virtual ~wxLog() { }
-protected:
- bool m_bHasMessages; // any messages in the queue?
+ // this method exists for backwards compatibility only, don't use
+ bool HasPendingMessages() const { return true; }
+
+protected:
// the logging functions that can be overriden
// default DoLog() prepends the time stamp and a prefix corresponding
// to the message to szString and then passes it to DoLogString()
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?
+ m_bWarnings, // any warnings?
+ m_bHasMessages; // any messages at all?
+
};
#endif // wxUSE_LOGGUI
wxLog::wxLog()
{
- m_bHasMessages = FALSE;
}
wxChar *wxLog::SetLogBuffer( wxChar *buf, size_t size)
void wxLog::Flush()
{
- // remember that we don't have any more messages to show
- m_bHasMessages = FALSE;
+ // nothing to do here
}
// ----------------------------------------------------------------------------
fflush(m_fp);
// under Windows, programs usually don't have stderr at all, so show the
- // messages also under debugger - unless it's a console program
+ // messages also under debugger (unless it's a console program which does
+ // have stderr or unless this is a file logger which doesn't use stderr at
+ // all)
#if defined(__WXMSW__) && wxUSE_GUI && !defined(__WXMICROWIN__)
- str += wxT("\r\n") ;
- OutputDebugString(str.c_str());
+ if ( m_fp == stderr )
+ {
+ str += wxT("\r\n") ;
+ OutputDebugString(str.c_str());
+ }
#endif // MSW
+
#if defined(__WXMAC__) && !defined(__DARWIN__) && wxUSE_GUI
Str255 pstr ;
strcpy( (char*) pstr , str.c_str() ) ;
if ( m_logOld )
m_logOld->Flush();
- // be careful to avoid inifinite recursion
+ // be careful to avoid infinite recursion
if ( m_logNew && m_logNew != this )
m_logNew->Flush();
}
wxLog::DoLog(level, szString, t);
}
}
-
- m_bHasMessages = TRUE;
}
void wxLogWindow::DoLogString(const wxChar *szString, time_t WXUNUSED(t))