#if defined(__WINDOWS__)
#include "wx/msw/private.h"
#endif
-#ifdef __WXMAC__
- #include "wx/mac/private.h"
-#endif
// ===========================================================================
// implementation
// wxMessageOutputBest
// ----------------------------------------------------------------------------
-#ifdef __WINDOWS__
-
-// check if we're running in a console under Windows
-static inline bool IsInConsole()
-{
-#ifdef __WXWINCE__
- return false;
-#else // !__WXWINCE__
- HANDLE hStdErr = ::GetStdHandle(STD_ERROR_HANDLE);
- return hStdErr && hStdErr != INVALID_HANDLE_VALUE;
-#endif // __WXWINCE__/!__WXWINCE__
-}
-
-#endif // __WINDOWS__
-
void wxMessageOutputBest::Output(const wxString& str)
{
#ifdef __WINDOWS__
- if ( !IsInConsole() )
+ // 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) )
{
- ::MessageBox(NULL, str.wx_str(), _T("wxWidgets"),
- MB_ICONINFORMATION | MB_OK);
+ if ( hasStderr && traits->WriteToStderr(AppendLineFeedIfNeeded(str)) )
+ return;
}
- else
-#endif // __WINDOWS__/!__WINDOWS__
- {
- const wxWX2MBbuf buf = str.mb_str();
- if ( buf )
- fprintf(stderr, "%s", (const char*) buf);
- else // print at least something
- fprintf(stderr, "%s", (const char*) str.ToAscii());
- }
+ wxString title;
+ if ( wxTheApp )
+ title = wxTheApp->GetAppDisplayName();
+ else // Use some title to avoid default "Error"
+ title = _("Message");
+
+ ::MessageBox(NULL, str.t_str(), title.t_str(), 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 wxWX2MBbuf buf = str.mb_str();
+ const wxString strWithLF = AppendLineFeedIfNeeded(str);
+ const wxWX2MBbuf buf = strWithLF.mb_str();
if ( buf )
- fprintf(stderr, "%s", (const char*) buf);
+ fprintf(m_fp, "%s", (const char*) buf);
else // print at least something
- fprintf(stderr, "%s", (const char*) str.ToAscii());
+ fprintf(m_fp, "%s", (const char*) strWithLF.ToAscii());
+
+ fflush(m_fp);
}
// ----------------------------------------------------------------------------
void wxMessageOutputDebug::Output(const wxString& str)
{
- wxString out(str);
-
-#if defined(__WXMSW__) && !defined(__WXMICROWIN__)
+#if defined(__WINDOWS__) && !defined(__WXMICROWIN__)
+ wxString out(AppendLineFeedIfNeeded(str));
out.Replace(wxT("\t"), wxT(" "));
out.Replace(wxT("\n"), wxT("\r\n"));
- ::OutputDebugString(out.wx_str());
+ ::OutputDebugString(out.t_str());
#else
- wxFputs( out , stderr ) ;
- if ( out.Right(1) != wxT("\n") )
- wxFputs( wxT("\n") , stderr ) ;
- fflush( stderr ) ;
+ // TODO: use native debug output function for the other ports too
+ wxMessageOutputStderr::Output(str);
#endif // platform
}
out.Replace(wxT("\t"), wxT(" "));
- ::wxLogMessage(wxT("%s"), out.c_str());
+ wxLogMessage(wxT("%s"), out.c_str());
}
#endif // wxUSE_BASE
#if wxUSE_GUI && wxUSE_MSGDLG
+extern WXDLLEXPORT_DATA(const char) wxMessageBoxCaptionStr[] = "Message";
+
void wxMessageOutputMessageBox::Output(const wxString& str)
{
wxString out(str);
// the native MSW msg box understands the TABs, others don't
-#ifndef __WXMSW__
+#ifndef __WINDOWS__
out.Replace(wxT("\t"), wxT(" "));
#endif
- wxString title;
- if ( wxTheApp )
- title.Printf(_("%s message"), wxTheApp->GetAppDisplayName().c_str());
+ wxString title = wxT("wxWidgets") ;
+ if (wxTheApp) title = wxTheApp->GetAppDisplayName();
::wxMessageBox(out, title);
}