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
206 lines
5.5 KiB
C++
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
|