+// ----------------------------------------------------------------------------
+// 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
+}