Files
wxWidgets/src/common/msgout.cpp
Vadim Zeitlin af58844636 Add information about the log message generation location to wxLog.
This means that wxLog::DoLogRecord() can now retrieve the file name, line
number and the function where the message was logged.

An unfortunate consequence of this change is that now

	if ( condition )
		wxLogError("Whatever");

results in a warning from g++ 4.x with -Wparentehses, so extra parentheses had
to be added in many places.

Finally, also allow storing arbitrary attributes in wxLogRecordInfo. This had
to be added to implement our own overloaded wxLogStatus() and wxLogSysError()
and will probably be useful for the others as well.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61363 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2009-07-09 20:26:34 +00:00

206 lines
5.5 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: src/common/msgout.cpp
// Purpose: wxMessageOutput implementation
// Author: Mattia Barbon
// Modified by:
// Created: 17.07.02
// RCS-ID: $Id$
// Copyright: (c) the wxWidgets team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ---------------------------------------------------------------------------
// headers
// ---------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#if defined(__BORLANDC__)
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/string.h"
#include "wx/ffile.h"
#include "wx/app.h"
#include "wx/intl.h"
#include "wx/log.h"
#if wxUSE_GUI
#include "wx/msgdlg.h"
#endif // wxUSE_GUI
#endif
#include "wx/msgout.h"
#include "wx/apptrait.h"
#include <stdarg.h>
#include <stdio.h>
#if defined(__WINDOWS__)
#include "wx/msw/private.h"
#endif
// ===========================================================================
// implementation
// ===========================================================================
#if wxUSE_BASE
// ----------------------------------------------------------------------------
// wxMessageOutput
// ----------------------------------------------------------------------------
wxMessageOutput* wxMessageOutput::ms_msgOut = 0;
wxMessageOutput* wxMessageOutput::Get()
{
if ( !ms_msgOut && wxTheApp )
{
ms_msgOut = wxTheApp->GetTraits()->CreateMessageOutput();
}
return ms_msgOut;
}
wxMessageOutput* wxMessageOutput::Set(wxMessageOutput* msgout)
{
wxMessageOutput* old = ms_msgOut;
ms_msgOut = msgout;
return old;
}
#if !wxUSE_UTF8_LOCALE_ONLY
void wxMessageOutput::DoPrintfWchar(const wxChar *format, ...)
{
va_list args;
va_start(args, format);
wxString out;
out.PrintfV(format, args);
va_end(args);
Output(out);
}
#endif // !wxUSE_UTF8_LOCALE_ONLY
#if wxUSE_UNICODE_UTF8
void wxMessageOutput::DoPrintfUtf8(const char *format, ...)
{
va_list args;
va_start(args, format);
wxString out;
out.PrintfV(format, args);
va_end(args);
Output(out);
}
#endif // wxUSE_UNICODE_UTF8
// ----------------------------------------------------------------------------
// wxMessageOutputBest
// ----------------------------------------------------------------------------
void wxMessageOutputBest::Output(const wxString& str)
{
#ifdef __WINDOWS__
// decide whether to use console output or not
wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
const bool hasStderr = traits ? traits->CanUseStderr() : false;
if ( !(m_flags & wxMSGOUT_PREFER_MSGBOX) )
{
if ( hasStderr && traits->WriteToStderr(AppendLineFeedIfNeeded(str)) )
return;
}
::MessageBox(NULL, str.t_str(), NULL, MB_ICONINFORMATION | MB_OK);
#else // !__WINDOWS__
// TODO: use the native message box for the other ports too
wxMessageOutputStderr::Output(str);
#endif // __WINDOWS__/!__WINDOWS__
}
// ----------------------------------------------------------------------------
// wxMessageOutputStderr
// ----------------------------------------------------------------------------
wxString wxMessageOutputStderr::AppendLineFeedIfNeeded(const wxString& str)
{
wxString strLF(str);
if ( strLF.empty() || *strLF.rbegin() != '\n' )
strLF += '\n';
return strLF;
}
void wxMessageOutputStderr::Output(const wxString& str)
{
const wxString strWithLF = AppendLineFeedIfNeeded(str);
const wxWX2MBbuf buf = strWithLF.mb_str();
if ( buf )
fprintf(stderr, "%s", (const char*) buf);
else // print at least something
fprintf(stderr, "%s", (const char*) strWithLF.ToAscii());
}
// ----------------------------------------------------------------------------
// wxMessageOutputDebug
// ----------------------------------------------------------------------------
void wxMessageOutputDebug::Output(const wxString& str)
{
#if defined(__WXMSW__) && !defined(__WXMICROWIN__)
wxString out(AppendLineFeedIfNeeded(str));
out.Replace(wxT("\t"), wxT(" "));
out.Replace(wxT("\n"), wxT("\r\n"));
::OutputDebugString(out.t_str());
#else
// TODO: use native debug output function for the other ports too
wxMessageOutputStderr::Output(str);
#endif // platform
}
// ----------------------------------------------------------------------------
// wxMessageOutputLog
// ----------------------------------------------------------------------------
void wxMessageOutputLog::Output(const wxString& str)
{
wxString out(str);
out.Replace(wxT("\t"), wxT(" "));
wxLogMessage(wxT("%s"), out.c_str());
}
#endif // wxUSE_BASE
// ----------------------------------------------------------------------------
// wxMessageOutputMessageBox
// ----------------------------------------------------------------------------
#if wxUSE_GUI && wxUSE_MSGDLG
void wxMessageOutputMessageBox::Output(const wxString& str)
{
wxString out(str);
// the native MSW msg box understands the TABs, others don't
#ifndef __WXMSW__
out.Replace(wxT("\t"), wxT(" "));
#endif
wxString title = wxT("wxWidgets") ;
if (wxTheApp) title = wxTheApp->GetAppDisplayName();
::wxMessageBox(out, title);
}
#endif // wxUSE_GUI